我正在运行此代码,该代码需要运行很长时间,但是google脚本显示错误“超过了最大执行时间”。我在某处读到,使用触发器可以在脚本关闭并在其离开的地方继续执行的情况下实现。但是我不能这样做。如何使其恢复到离开的位置?
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 = "";
}
}
}
答案 0 :(得分:1)
您可以使用programmatically管理触发器Script Service,对于您要执行的操作,这将涉及定期使用以下方法检查运行时:
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()
一次粘贴所有值。 This post对此进行了详细说明。
每次使用getValue()
时,脚本都需要等待Google响应。使用getValues()
返回的数组可能会令人沮丧,但是正确使用它将花费执行时间的一小部分。
以下是一些示例:
var name1 = data[x][3]
var name2 = data[x][4]
更好的是,在if语句之前定义name
。
setValues部分更具挑战性。在循环var ary = []
之外定义一个数组,然后使用ary.push([colToPasteIn, name])
向该数组中添加元素,这样您就可以将其粘贴到哪里。
但是getValue()比setValue()放慢脚本的速度,所以我认为修复第一部分就足够了。更多说明here。