假设某些单元格在符合特定条件时将受到保护
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((
- 可安装触发器