Google apps script 如何减少谷歌应用程序脚本服务调用

Google apps script 如何减少谷歌应用程序脚本服务调用,google-apps-script,google-sheets,Google Apps Script,Google Sheets,此处的脚本使用A1中的值重命名sheetnames。我管理的学校数据库有150多张。脚本正在抛出最长时间执行超时错误。我在这里的论坛上读到,你可以减少服务电话。这看起来像是一个解决办法,但在我的生活中,我不能把我的头围绕在发生的事情上 我可能应该提到,我是一个彻头彻尾的傻瓜,你的帮助将是巨大的帮助 function onEdit() { var ss = SpreadsheetApp.getActive(); var allsheets = ss.getSheets(); // Array h

此处的脚本使用A1中的值重命名sheetnames。我管理的学校数据库有150多张。脚本正在抛出最长时间执行超时错误。我在这里的论坛上读到,你可以减少服务电话。这看起来像是一个解决办法,但在我的生活中,我不能把我的头围绕在发生的事情上

我可能应该提到,我是一个彻头彻尾的傻瓜,你的帮助将是巨大的帮助

function onEdit() {
var ss = SpreadsheetApp.getActive();
var allsheets = ss.getSheets();

// Array holding the names of the sheets to exclude from the execution
var exclude ="Sheet1","Sheet2","Sheet3","Article","Frontpage","Logos","Sheet4","Sheet5","Sheet6","Sheet10"];

for(var s=10;s<allsheets.length;s++) {
var sheet = allsheets[s];
var oldName = sheet.getName();
var newName = sheet.getRange(1,1).getValue();
if (newName.toString().length>0 && newName !== oldName) {
sheet.setName(newName);

// Stop iteration execution if the condition is meet.
if(exclude.indexOf(sheet.getName())==-1) continue;
}

} // end of loop

} // end of function

首先,去掉不必要的调用——你是否考虑过<代码>剪接(<)/代码>我对上一个问题的回答?

allsheets.splice(0,10); //0-based start and end indexes;
如果在任何地方都可能遇到被排除的工作表名称,请保留
exclude
数组和
If
语句(顺便说一句,您的示例中似乎有输入错误-数组
声明缺少一个左括号)

无论您如何排除前10个工作表,当您调用
getName()
method
allsheets.length
次(因此,150个不必要的方法调用)时,停止迭代的调用都会变得过于繁琐-改为引用
newName
变量

通过在调用
setName()
方法之前检查条件,可以进一步减少调用(假设新名称位于
exclude
数组中,则不想执行任何操作)

然后,使用
for
循环执行相同的操作(注意,如果使用
splice()
数组进行过滤,则索引
s
应为
0
):


你能不能把你的处决记录写进去,这样我们就可以知道什么花费了最多的时间?这可以通过运行脚本,然后转到
View>Execution transcript
.Hi,
[19-05-28 08:12:42:455 PDT]Range.getValue()[2.157秒]
来查看。有很多这样的问题,所以我不想在这里发布整个日志,因为这只是重复。这个答案假设您想排除前十张表的名称,不是提供的数组中的十张纸名称-从你的答案判断,我可能错了,请让我知道如果是这种情况,我将根据情况更新答案以防万一,更新答案为独立于解决方案,将继续查找是否可以进一步优化。关于缺少的括号,这是一个打字错误。我正在测试排除前10张的两个选项。它们与我在那里列出的相同,因此我应该删除列表,让脚本检查前10个并排除它们。嗨,Oleg,当我运行上面的脚本
ReferenceError时出现此错误:“allsheets”未定义。(第1行,文件“代码”)Hi!您应该仅在将工作表写入
allsheets
变量后调用此方法(如果我们在这里讨论的是
splice()
),从错误判断,您尝试在第一行全局调用它,而您应该在调用
ss.getSheets()
allsheets.splice(0,10); //0-based start and end indexes;
for(var s=10; s<allsheets.length; s++) {
  var sheet = allsheets[s];
  var oldName = sheet.getName();
  var newName = sheet.getRange(1,1).getValue();

  //this reduces setName() calls if you don't need to set reserved names;
  if(exclude.indexOf(newName)!==-1) { continue; }

  if (newName.toString().length>0 && newName !== oldName) {
    sheet.setName(newName);
  }
}
function testArray() { 

  var ss = SpreadsheetApp.getActive();
  var arr = ss.getSheets();

  arr.splice(0,10); //removes first 10 Sheets from Array;

  var exclude = []; //fill with unchangeable names;

  arr.forEach(function (sheet,index) { //iterates over Array of Sheets;

      var oldName = sheet.getName(); 
      var newName = sheet.getRange(1,1).getValue(); 

      if(newName.toString().length>0 && newName!==oldName) { 

        //Move to next iteration if new name should be excluded;
        if(exclude.indexOf(newName)===-1) {
          sheet.setName(newName); //set name otherwise;
        }

      }

  }); // end of loop 

} // end of function