我正在尝试运行以下脚本来绕过Google脚本的最长执行时间。我让该功能运行了4分钟并设置了一个触发器,使其在5分钟内再次运行,从处理中断。第一次通过它运行平稳并设置触发器。当触发器第一次运行时,它处理速度非常慢,然后不再运行。谁能告诉我我做错了什么,如果有办法解决这个问题?
function updateAll() {
var startTime= (new Date()).getTime();
var startRow = ScriptProperties.getProperty("start_row");
//Start on row 2 if null
if (!startRow) {
startRow = "2";
}
// This code deletes all the triggers
var triggers = ScriptApp.getProjectTriggers();
for(var i in triggers) {
ScriptApp.deleteTrigger(triggers[i]);
}
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
for (var i = startRow; i < 3000; i++) {
var currTime = (new Date()).getTime();
if(currTime - startTime >= 240000) {
ScriptProperties.setProperty("start_row", i)
//Set new trigger to run in 5 minutes
ScriptApp.newTrigger("updateAll")
.timeBased()
.at(new Date(currTime+300000))
.create();
break;
} else {
//Do logic and set values in spreadsheet
//Run sleep to avoid maximum script execution error
Utilities.sleep(100);
}
};
}
答案 0 :(得分:2)
你怎么知道它运行缓慢?电子表格是否适用于新版本?似乎there's a lot of issues with it。
无论如何,我不会每次都移除触发器并重新设置它。我只是将其设置为每5分钟运行一次,并在检测到作业完成后将其删除。此外,由于“最长执行时间错误”,因此无需调用Utilities.sleep
。它只在您遇到“每秒呼叫”类型的错误时才有用。
在我完成此答案时,我发现您的ScriptProperties
用法可能会出现问题。它只能保存字符串,如果你传递其他内容,它只会尝试将其解析为字符串。因此,当您从startRow
返回ScriptProperties
时,您应parseInt
将其返回到某个数字。
var startRow = parseInt(ScriptProperties.getProperty("start_row"));