如何阻止 Google AppScripts(表格)创建两个受保护的范围条目

问题描述 投票:0回答:1

我有一个 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()
      }
    }
  }
}
google-sheets google-apps-script
1个回答
0
投票

我更改了这部分代码:

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();
      }
    }
  }
}

示例输出:

Output

参考:

等级保护

© www.soinside.com 2019 - 2024. All rights reserved.