谷歌电子表格脚本删除了某些单元格中的保护



假设某些单元格在符合特定条件时将受到保护

function A() {
var sh = SpreadsheetApp.getActiveSpreadsheet();
var ss = sh.getActiveSheet();
var protection;
for(var i = 3;i<ss.getLastRow();i=i+1){
if(ss.getRange(i,4).getValue()==7){     // check if the condition is matched
for(var j=5; j<=20; j=j+2){
if(ss.getRange(i,j).isBlank()){
protection = ss.getRange(i,j).protect();         // protect that certain cell
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit())
protection.setDomainEdit(false);
}
}
}
}

现在,如果条件发生变化,我想删除我在该单元格上所做的保护,假设即将到来的代码将是:

if(ss.getRange(i,4).getValue()<=6){
...

如何仅删除应用于该单元格的保护,而不删除整个工作表中的所有保护?谢谢

我试过

getProtections().remove()

但它不针对某些细胞,对吧?

我相信您的目标如下。

  • 当列";D";小于6。

  • 关于Now I want to delete the protection I made on that cell if the condition changed,当我看到您显示的保护单元格的脚本时,似乎当if(ss.getRange(i,4).getValue()==7){}的if语句为true时,该行的空单元格受到保护。在这种情况下,在您的目标中,当if(ss.getRange(i,4).getValue()<=6){}的if语句为true时,您希望删除该行的所有受保护单元格。

如果我的理解是正确的,那么下面的示例脚本如何?在这种情况下,可以使用getProtections(SpreadsheetApp.ProtectionType.RANGE)检索受保护的范围。

示例脚本1:

在该示例中,当运行该脚本时,通过搜索列"的值来保护受保护的单元格;D";。

function myFunction() {
var sh = SpreadsheetApp.getActiveSpreadsheet();
var ss = sh.getActiveSheet();
var protects = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE).reduce((o, p) => {
var row = p.getRange().getRow();
o[row] = o[row] ? [...o[row], p] : [p];
return o;
}, {});
var values = ss.getRange(3, 4, ss.getLastRow() - 2, 1).getValues();
values.forEach(([d], i) => {
if (d <= 6) {
var obj = protects[i + 3];
if (obj) {
obj.forEach(p => p.remove());
}
}
});
}

示例脚本2:

在该样品中;D";则脚本由可安装的OnEdit触发器运行。因此,请将OnEdit触发器安装到函数installedOnEdit中。当您使用此脚本时,请编辑列"的单元格;D";。这样,脚本就运行了当脚本编辑器直接运行此脚本时,会发生错误。请小心

function installedOnEdit(e) {
var sheetName = "Sheet1"; // Please set your sheet name.
var { range } = e;
var sheet = range.getSheet();
if (sheet.getSheetName() != sheetName || range.columnStart != 4 || range.rowStart < 3 || range.getValue() > 6) return;
var protects = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE).reduce((o, p) => {
var row = p.getRange().getRow();
o[row] = o[row] ? [...o[row], p] : [p];
return o;
}, {});
var obj = protects[range.rowStart];
if (obj) {
obj.forEach(p => p.remove());
}
}

注:

  • 当我看到您的脚本A()时,我认为当修改脚本时,流程成本可能会降低一点。那么,下面的修改怎么样?

    function A() {
    var sh = SpreadsheetApp.getActiveSpreadsheet();
    var ss = sh.getActiveSheet();
    var values = ss.getRange(3, 1, ss.getLastRow() - 2, 20).getValues();
    values.forEach((r, i) => {
    if (r[3] == 7) {
    for (var j = 4; j < 20; j = j + 2) {
    if (r[j].toString() == "") {
    protection = ss.getRange(i + 3, j + 1).protect();
    protection.removeEditors(protection.getEditors());
    if (protection.canDomainEdit())
    protection.setDomainEdit(false);
    }
    }
    }
    });
    }
    

参考文献:

  • getProtections(类型(
  • reduce((
  • forEach((
  • 可安装触发器

最新更新