我正在运行这段代码,代码需要运行很长一段时间,但google script显示错误 "超过最大执行时间"。我在某个地方读到,使用触发器可以实现脚本关闭并恢复它离开的地方。但我不能这样做。如何使它恢复到离开的地方?
function myFunction() {
var app = SpreadsheetApp.getActive();
var sheet = app.getSheets()[2];
sheet.getRange(1, 1).setBackground('green');
var data = sheet.getDataRange().getValues();
for(var x=0; x<data.length; x++){
if(data[x][1] == 1) {
var name1 = sheet.getRange((x+1),(4)).getValue();
var comp1 = sheet.getRange((x+1),(8)).setValue(name1);
}
else if(data[x][1] == 2){
var name2 = sheet.getRange((x+1),(4)).getValue();
var comp2 = sheet.getRange((x+1),(9)).setValue(name2);}
else if(data[x][1] == 3){
var name3 = sheet.getRange((x+1),(4)).getValue();
var comp3 = sheet.getRange((x+1),(10)).setValue(name3);}
else if(data[x][1] == 4){
var name4 = sheet.getRange((x+1),(4)).getValue();
var comp4 = sheet.getRange((x+1),(11)).setValue(name4);}
else if(data[x][1] != 4 && data[x][1] != 3 && data[x][1] != 2 && data[x][1] != 1){
comp1 = sheet.getRange((x+1),(8)).setValue(name1);
comp2 = sheet.getRange((x+1),(9)).setValue(name2);
comp3 = sheet.getRange((x+1),(10)).setValue(name3);
comp4 = sheet.getRange((x+1),(11)).setValue(name4);
}
var word = sheet.getRange((x+1),(3)).getValue();
var nextword = sheet.getRange((x+2),(3)).getValue();
comp1 = sheet.getRange((x+1),(8)).setValue(name1);
comp2 = sheet.getRange((x+1),(9)).setValue(name2);
comp3 = sheet.getRange((x+1),(10)).setValue(name3);
comp4 = sheet.getRange((x+1),(11)).setValue(name4);
if(word != nextword){
name1 = "";
name2 = "";
name3 = "";
name4 = "";
}
}
}
你可以管理触发器 程序上 使用 脚本服务对于你想做的事情,这将涉及到定期检查运行时间,在脚本开始时使用类似于:
taskStartTime = new Date();
在脚本开始的时候,定期检查脚本运行的时间, 用类似于:
endTime = new Date();
duration = Math.round((endTime.getTime() - taskStartTime.getTime())/1000);
tasks_Processed_Array[tasks_Processed_Array.length - 1].duration = duration;
如果持续时间接近最大值,那就为以后创建一个触发器,然后从你离开的地方开始。
然而,你的脚本没有必要这样做。你过度使用了 .getValue()
和 .setValue()
而这将大大降低脚本的速度。而使用 getValues()
一次从一个工作表中收集所有数据,然后在脚本中进行操作。使用 setValues()
来一次性粘贴所有的值。这个职位 解释更多。
每次你使用 getValue()
脚本需要等待谷歌的回应。这可能是令人沮丧的工作与数组的 getValues()
返回,但正确使用的话,它只需要一小部分的执行时间。
这里有几个例子。var name1 = data[x][3]
var name2 = data[x][4]
更好的是,定义 name
在 if 语句之前执行一次。
setValues部分是一个比较有挑战性的部分。在循环外定义一个数组 var ary = []
然后在数组中添加元素,使用 ary.push([colToPasteIn, name])
这样一来,你就有了一个参考,可以知道应该把它粘贴到哪里。
但是getValue()比setValue()要慢得多,所以我认为修复第一部分就可以了。更多解释 此处.