我有一张纸,上面有一些不受保护的范围。
在第一阶段,我以管理员身份取消了一些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运行脚本。
答案 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');
};