如何减少Google App脚本服务调用

时间:2019-05-28 13:44:09

标签: google-apps-script google-sheets

此脚本在此处使用A1中的值重命名工作表名称。我管理着超过150张的学校数据库。脚本抛出最大时间执行超时错误。我在这里的论坛上已经读到,您可以减少服务电话。 Google app script timeout ~ 5 minutes?在这里看起来像是一种解决方案,但我无法一生都在思考发生了什么。

我可能应该提到我是一个完全菜鸟,您的帮助将是巨大的帮助。

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

请帮助我减少脚本正在执行的服务调用次数,或者是避免超时错误的更快方法。

//更新的脚本

//下面的示例代码在出现条件后缺少错误

function testArray() {
    var arr = ["Sh1","Sh2","Sh3","Sh4","Sh5","Sh6","Sh7","Sh8","Sh9","Sh10"];  //etc etc
    var res = [];

    arr.forEach(function (element,index) {
        if(index>9) {
            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; //iterable code goes here; 
            }
        // }
     }); 
}

1 个答案:

答案 0 :(得分:1)

首先,摆脱不必要的电话-您是否认为我对上一个问题的回答中的splice()部分?

allsheets.splice(0,10); //0-based start and end indexes;

如果在任何地方都可能遇到被排除的工作表名称,请保留exclude数组和if语句(顺便说一句,您的示例中似乎有错字-Array声明中没有开头括号)。

无论您如何排除前10张纸,调用getName()方法allsheets.length次(因此有150次不必要的方法调用)时,停止迭代的调用都会变得过大-请参考{{1} }变量。

您可以通过在调用newName方法之前检查条件来进一步减少调用(假设您不想做任何事情,因为setName()数组中有新名称)。

然后,使用exclude循环执行相同的操作(请注意,如果使用forArray进行了过滤,则索引splice()应该为{{1} }):

s

或者,您可以使用0进行所需的操作。这就是使用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); } } forEach的整个功能的样子:

splice()