如何将更多未受保护的范围添加到具有一些已不受保护的范围的表中?

时间:2019-08-14 15:01:35

标签: google-apps-script

我有一张纸,上面有一些不受保护的范围。

在第一阶段,我以管理员身份取消了一些SCRIPT 1的保护范围。不幸的是,这大约需要5分钟。执行脚本。

用户可以在工作表中添加一行,脚本应取消保护所添加行中的某些单元格。问题是,当已经有一些不受保护的范围时,我不知道如何取消保护范围。此时,当用户添加行脚本时,运行的SCRIPT 1将遍历整个工作表,不幸的是,这花费了太多时间...

SCRIPT 1-浏览整个文档(大约5分钟)

function protect(sheet) {

var protection = sheet.protect().setDescription('Protected sheet');
var arrayRanges = new Array;

for(var i=1;i<sheet.getLastRow();i++){

if(sheet.getRange(i,50).getValue() == "s"){

  range = sheet.getRange(i,3,1,5);
  arrayRanges.push(range);
} else if (sheet.getRange(i,50).getValue() == "d"){
  range = sheet.getRange(i,2,1,6);
  arrayRanges.push(range);
} else if (sheet.getRange(i,50).getValue() == "r"){
  range = sheet.getRange(i,12,1,26);
  arrayRanges.push(range);
}
}
protection.setUnprotectedRanges(arrayRanges);

protection.addEditor("xxx@gmail.com");
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}

我试图用SCRIPT 2添加新的不受保护的范围,但是它的工作方式是擦除SCRIPT 1的结果,而只留下SCRIPT 2的结果。

SCRIPT 2-添加新的不受保护范围

function protect(sheet) {

var protection = sheet.protect().setDescription('Protected sheet');
var arrayRanges = new Array;

var range = sheet.getRange(1,3,1,5);
arrayRanges.push(range);

protection.setUnprotectedRanges(arrayRanges);

protection.addEditor("xxx@gmail.com");
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
}

我通过WebApp运行脚本。

1 个答案:

答案 0 :(得分:2)

如果可以通过使用“ .getValues”避免使用,则不必循环使用“ .getRange”和“ .getValue”

尝试以下脚本代码:

//SCRIPT 1
function protect(sheet) {
  //var sheet = SpreadsheetApp.getActiveSheet();
  var protection = sheet.protect().setDescription('Protected sheet');

  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();
  var r = sheet.getRange(1,1,lastRow,lastCol);
  var v = r.getValues();

  var arrayRanges = new Array();

  for(var i=0;i<v.length;i++){
    if( v[i][49] === "s" ) {
      //range = sheet.getRange(i,3,1,5);
      arrayRanges.push( 'C'+(i+1)+':G'+(i+1) );
    }
    else if ( v[i][49] === "d") {
      //range = sheet.getRange(i,2,1,6);
      arrayRanges.push( 'B'+(i+1)+':G'+(i+1) );
    }
    else if ( v[i][49] === "r") {
      //range = sheet.getRange(i,12,1,26);
      arrayRanges.push( 'L'+(i+1)+':AK'+(i+1) );
    }
  }
  var ranges = sheet.getRangeList(arrayRanges).getRanges();
  protection.setUnprotectedRanges(ranges);

  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) {
    protection.setDomainEdit(false);
  }
  protection.addEditor('xxx@gmail.com');
};

//SCRIPT 2 - adding new unprotected range
function addUnprotectedRanges(sheet) {  
  //var sheet = SpreadsheetApp.getActiveSheet();
  var protection = sheet.protect();
  var unprotected = protection.getUnprotectedRanges();
  var range = sheet.getRange(1,3,1,5);
  unprotected.push(range);
  protection.setUnprotectedRanges(unprotected);

  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) {
    protection.setDomainEdit(false);
  }
  protection.addEditor('xxx@gmail.com');
};