此脚本在此处使用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;
}
// }
});
}
答案 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
循环执行相同的操作(请注意,如果使用for
对Array
进行了过滤,则索引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()