我必须在一个工作表中创建十二个受保护范围。我有可以正常工作的代码,但是速度很慢,因为它会针对每个范围与服务器联系。我知道,如果涉及某些单元格处理,则可以对数据的本地副本进行处理。范围保护也可以吗?
如果不是,那么缓存会有所帮助吗?
以下代码使用第一行中的用户名作为同一列中一堆行的编辑器。
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var sheets = spreadSheet.getSheets();
//Set protections per column, we start from the 4th.
for (var i = 4; i <= sheets[3].getLastColumn(); i++){
///Get the username.
var editor = sheets[3].getRange(1, i).getDisplayValue();
//Set the protection.
var protection = sheets[3].getRange(3, i, 22, 1).protect();
protection.setDescription(editor);
//Handle the case of deleted/unknown usernames.
try{
protection.addEditor(editor + '@domain.com');
} catch(error){
protection.addEditor('user@domain.com');
}
}
我找到了类似问题https://stackoverflow.com/a/37820854的解决方案,但是当我尝试将其应用于我的情况时,出现错误“ TypeError:在对象Range中找不到函数getRange”,因此我必须做错了什么
var test = [];
for (var i = 4; i <= sheets[3].getLastColumn(); i++){
test.push(sheets[3].getRange(3, i, 22, 1));
}
var editor;
for (var i = 0; i<test.length; i++){
var editor = test[i].getRange(1, 1).getDisplayValue();
}
答案 0 :(得分:0)
方法getRange()
的语法为getRange(row, column, numRows, numColumns),而计数器变量i
则循环遍历COLUMNS而不是ROWS。
如果您打算遍历所有列并为每个列添加一个编辑器,则应该类似于
for (var i = 4; i <= sheets[3].getLastColumn(); i++){
///Get the username.
var editor = sheets[3].getRange(1, i).getDisplayValue();
//Set the protection.
var protection = sheets[3].getRange(startRow, i, rowNumber, columnNumber).protect();
protection.setDescription(editor);
//Handle the case of deleted/unknown usernames.
try{
protection.addEditor(editor + '@domain.com');
} catch(error){
protection.addEditor('user@domain.com');
}
}
答案 1 :(得分:0)
可以进行批处理。
但是您必须使用Advanced Google Services。检出Sheets Advanced service和Sheets API documentation。