可以在Google Apps脚本中批量处理范围保护吗?

时间:2019-08-30 09:03:14

标签: optimization google-apps-script

我必须在一个工作表中创建十二个受保护范围。我有可以正常工作的代码,但是速度很慢,因为它会针对每个范围与服务器联系。我知道,如果涉及某些单元格处理,则可以对数据的本地副本进行处理。范围保护也可以吗?

如果不是,那么缓存会有所帮助吗?

以下代码使用第一行中的用户名作为同一列中一堆行的编辑器。

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

2 个答案:

答案 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 serviceSheets API documentation