我有一个 Google 表格,当我选中 Col U 中的复选框时,我在其中设置了一行以受到保护。但是,当我使用我设置代码的帐户执行此操作时,它会生成两个保护范围条目。
当我从另一个帐户勾选该框时,我只收到 1 个条目,而且它似乎工作正常。 与主账户双重录入范围保护
我的代码如下。我让它只保护带有警告的行。
function onEdit() {
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getActiveSheet();
let cell = sheet.getActiveCell()
let col = cell.getColumn();//gets column numnber
let rownum = cell.getRow();//gets row number
if(col==21 && cell.getValue() == true){//if changed to true protects row to end of data
let protRange = sheet.getRange(rownum,1,1,22).protect().setWarningOnly(true).setDescription(rownum);
}
else if(col == 21 && cell.getValue() ==false){//if changed to false cycles through all the protected ranges on the sheet and unprotects if the row number is the same
let protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE)
for (let i = 0;i<protections.length;i++){
let proDesc = protections[i].getDescription();
if(parseInt(proDesc)==rownum){
protections[i].remove()
}
}
}
}
我更改了这部分代码:
if (col == 21 && cell.getValue() == true) {//if changed to true protects row to end of data
let protRange = sheet.getRange(rownum, 1, 1, 22).protect().setWarningOnly(true).setDescription(rownum);
}
您的代码不会检查现有的保护措施。因此,每次选中该复选框时,都会创建一个新的保护,这会导致主要问题。
我还使用
toString()
将 rownum 转换为字符串,以确保与 setDescription()
的兼容性。
完整代码:
function onEdit() {
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getActiveSheet();
let cell = sheet.getActiveCell();
let col = cell.getColumn();
let rownum = cell.getRow();
if (col == 21 && cell.getValue() === true) {
let protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
let isAlreadyProtected = protections.some(protection => {
return protection.getRange().getRow() === rownum && protection.getRange().getNumRows() === 1;
});
if (!isAlreadyProtected) {
sheet.getRange(rownum, 1, 1, 22).protect()
.setWarningOnly(true)
.setDescription(rownum.toString());
}
} else if (col == 21 && cell.getValue() === false) {
let protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (let i = protections.length - 1; i >= 0; i--) {
if (protections[i].getDescription() === rownum.toString()) {
protections[i].remove();
}
}
}
}
示例输出:
参考: