Javascript 触发“四处走动”;超过最大执行时间“;在谷歌应用程序脚本中
我正在尝试运行以下脚本以绕过Google脚本的最大执行时间。我让函数运行4分钟,并设置一个触发器,使其在5分钟内再次运行,从处理过程中停止的地方开始。第一次通过时,它运行平稳并设置触发器。当触发器第一次运行时,它的处理速度非常慢,然后不再运行。有谁能告诉我我做错了什么,有没有办法Javascript 触发“四处走动”;超过最大执行时间“;在谷歌应用程序脚本中,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在尝试运行以下脚本以绕过Google脚本的最大执行时间。我让函数运行4分钟,并设置一个触发器,使其在5分钟内再次运行,从处理过程中停止的地方开始。第一次通过时,它运行平稳并设置触发器。当触发器第一次运行时,它的处理速度非常慢,然后不再运行。有谁能告诉我我做错了什么,有没有办法 function updateAll() { var startTime= (new Date()).getTime(); var startRow = ScriptProperties.getPropert
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);
}
};
}
函数updateAll(){
var startTime=(新日期()).getTime();
var startRow=ScriptProperties.getProperty(“开始行”);
//如果为空,则从第2行开始
如果(!startRow){
startRow=“2”;
}
//此代码删除所有触发器
var triggers=ScriptApp.getProjectTriggers();
for(触发器中的var i){
ScriptApp.deleteTrigger(触发器[i]);
}
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheets()[0];
对于(变量i=startRow;i<3000;i++){
var currTime=(新日期()).getTime();
如果(当前时间-开始时间>=240000){
ScriptProperties.setProperty(“开始行”,i)
//将新触发器设置为在5分钟内运行
ScriptApp.newTrigger(“updateAll”)
.基于时间的()
.在(新日期(当前时间+300000))
.create();
打破
}否则{
//在电子表格中执行逻辑并设置值
//运行睡眠以避免最大脚本执行错误
睡眠(100);
}
};
}
您如何知道它运行缓慢?电子表格是你的新版本吗?似乎还没有
无论如何,我不会每次都移除触发器并重新设置它。我只是将其设置为每5分钟运行一次,并在检测到作业已完全完成时将其删除。由于“最大执行时间错误”,也不需要调用实用程序.sleep
。只有在遇到“每秒呼叫数”类型的错误时,它才有用
当我完成这个回答时,我发现您的问题可能与ScriptProperties
的使用有关。它只能保存字符串,如果您将其他内容传递给它,它将尝试将其解析为字符串。因此,当您从ScriptProperties
获取startRow
时,您应该parseInt
将其返回到一个数字
var startRow = parseInt(ScriptProperties.getProperty("start_row"));
顺便说一句,Date.now()
执行您的(新日期()).getTime()
。