谷歌脚本在执行5分钟后停止

问题描述 投票:1回答:1

我正在运行这段代码,代码需要运行很长一段时间,但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 = "";
    }    

}
}
google-apps-script google-sheets
1个回答
2
投票

你可以管理触发器 程序上 使用 脚本服务对于你想做的事情,这将涉及到定期检查运行时间,在脚本开始时使用类似于:

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()要慢得多,所以我认为修复第一部分就可以了。更多解释 此处.

© www.soinside.com 2019 - 2024. All rights reserved.