Google apps script GAS-Extend脚本运行时间

Google apps script GAS-Extend脚本运行时间,google-apps-script,Google Apps Script,基于此,我学习了如何在超过最大运行时间5分钟时延长Google Apps脚本的脚本运行时间 这是可行的,但我不确定我是否用正确的方式做了。我面临如下所述的一些问题 来自main函数,我将变量“t”作为循环的起点,并调用函数Foto_函数。 如果时间超过240秒的限制,则会触发 if (isTimeUp(today)) { // schedule a trigger for a different function Spre

基于此,我学习了如何在超过最大运行时间5分钟时延长Google Apps脚本的脚本运行时间

这是可行的,但我不确定我是否用正确的方式做了。我面临如下所述的一些问题

来自main函数,我将变量“t”作为循环的起点,并调用函数Foto_函数。 如果时间超过240秒的限制,则会触发

 if (isTimeUp(today)) {

                  // schedule a trigger for a different function

                SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
                  ScriptApp.newTrigger("Foto_function_Repeat")
                      .timeBased()
                      .everyMinutes(1)
                      .create();
                  break;
               } 

超过时间后,将启动Foto_函数(称为“Foto_函数_Releat”)的克隆。变量“t”将移交给克隆函数。时间从零开始运行,如果达到240秒,则切换回原始Foto_功能

在循环结束时,触发器将被删除

if (t == lastrow_Fotos + 1) {
          stopp_triggers();
          break;
          }

函数停止触发器(){
var triggers=ScriptApp.getProjectTriggers();
对于(var i=0;i
但是:我收到大约8到12封内容完全相同的电子邮件,我不知道为什么?我的代码有问题吗

……这是完整的代码……我们将向我发送一封电子邮件,因此我知道脚本已经完成

function mainfunction(){

//do some stuff;

SpreadsheetApp.activeSheet.getRange("A1").setValue(2); // handover the variable "t" to the Foto_function
Foto_function();

}


function Foto_function(){

var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();

  for (var t = value_t; t <= lastrow_XX + 2; t++){

      if (t == lastrow_Fotos + 1) {
      stopp_triggers();
      break;
      }

if (isTimeUp(today)) {

              // schedule a trigger for a different function

            SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
              ScriptApp.newTrigger("Foto_function_Repeat")
                  .timeBased()
                  .everyMinutes(1)
                  .create();
              break;
           } 

            else {
                //do some stuff;
            }

}
}



function Foto_function_Repeat(){

var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();

  for (var t = value_t; t <= lastrow_XX + 2; t++){

      if (t == lastrow_Fotos + 1) {
      stopp_triggers();
      break;
      }

if (isTimeUp(today)) {

              // schedule a trigger for a different function

            SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
              ScriptApp.newTrigger("Foto_function")
                  .timeBased()
                  .everyMinutes(1)
                  .create();
              break;
           } 

            else {
                do some stuff;
            }

}
}



function stopp_triggers(){
            var triggers = ScriptApp.getProjectTriggers();
            for (var i = 0; i < triggers.length; i++) {
                ScriptApp.deleteTrigger(triggers[i]);
                sendmail();
            }
}


function sendmail(){

var user = Session.getActiveUser().getEmail();
var mailname = user.split('@');

mailname = mailname[0];
    MailApp.sendEmail({
      to: user,
      subject: 'GAS-Task is finished',
      htmlBody: 'Hello, the task is finished!!!'
    });


    }

function isTimeUp(today) {
  var now = new Date();
  return now.getTime() - today.getTime() > 240000;
  // 30000 = 30 seconds; this is the threshold limit
  // you are free to setup your own threshold limit
}
function main函数(){
//做一些事情;
SpreadsheetApp.activeSheet.getRange(“A1”).setValue(2);//将变量“t”移交给Foto_函数
Foto_函数();
}
函数Foto_函数(){
var today=新日期();
var Geodata=getSheetById(1702838837);
var lastrow_XX=Geodata.getRange(1,1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow();//工作表Geodata的A列中的最后一行
value_t=SpreadsheetApp.activeSheet.getRange(“A1”).getValue();
对于(var t=value_t;t代码块

             ScriptApp.newTrigger("Foto_function_Repeat")
                  .timeBased()
                  .everyMinutes(1)
                  .create();
使您创建一个触发器,每分钟触发
函数Foto\u function\u Repeat()
。 因此,每分钟
var t
将被设置回
=value\u t
,并将在
for
循环中递增,直到
if(t==lastrow\u Fotos+1)
条件完全满足。
function stop\u triggers()
将删除所有触发器,但不会终止在第一次
repeatFunction()
运行开始到
t==lastrow\u Fotos+1
满的时间间隔内已经触发的
repeatFunction()
的执行

我建议您将触发器的执行时间从
.everyMinutes(1)
增加到例如
.everyMinutes(4)
。 另外,我建议您在代码的战略位置实现带有计数器变量的日志,这样您就可以监视它的执行,并验证不同函数调用的结果是否符合预期


在脚本运行之间存储值非常有用。您可以存储和检索计数器变量,这样就不会每次都从零开始循环。

谢谢!这听起来很合理。如果代码不太复杂,您能告诉我如何调整代码吗?我无法为您调整整个代码,因为我对我的代码了解不够ts目的,但如果为
timeUp
实现的时间阈值小于
.everyMinutes()
中的参数,则应该能够避免多次同时运行脚本的问题。例如,将阈值设置为200000毫秒。这不起作用。变量“t”正在上升和下降。它应该不断增加,但不会。是的,我会尝试另一件事。我想我知道问题在哪里…会回来的。不,我需要触发器几次,所以在1分钟后重复是可以的。我的意思是…我在1分钟后启动了多个触发器自我重复…这产生了混乱;-)
function mainfunction(){

//do some stuff;

SpreadsheetApp.activeSheet.getRange("A1").setValue(2); // handover the variable "t" to the Foto_function
Foto_function();

}


function Foto_function(){

var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();

  for (var t = value_t; t <= lastrow_XX + 2; t++){

      if (t == lastrow_Fotos + 1) {
      stopp_triggers();
      break;
      }

if (isTimeUp(today)) {

              // schedule a trigger for a different function

            SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
              ScriptApp.newTrigger("Foto_function_Repeat")
                  .timeBased()
                  .everyMinutes(1)
                  .create();
              break;
           } 

            else {
                //do some stuff;
            }

}
}



function Foto_function_Repeat(){

var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();

  for (var t = value_t; t <= lastrow_XX + 2; t++){

      if (t == lastrow_Fotos + 1) {
      stopp_triggers();
      break;
      }

if (isTimeUp(today)) {

              // schedule a trigger for a different function

            SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
              ScriptApp.newTrigger("Foto_function")
                  .timeBased()
                  .everyMinutes(1)
                  .create();
              break;
           } 

            else {
                do some stuff;
            }

}
}



function stopp_triggers(){
            var triggers = ScriptApp.getProjectTriggers();
            for (var i = 0; i < triggers.length; i++) {
                ScriptApp.deleteTrigger(triggers[i]);
                sendmail();
            }
}


function sendmail(){

var user = Session.getActiveUser().getEmail();
var mailname = user.split('@');

mailname = mailname[0];
    MailApp.sendEmail({
      to: user,
      subject: 'GAS-Task is finished',
      htmlBody: 'Hello, the task is finished!!!'
    });


    }

function isTimeUp(today) {
  var now = new Date();
  return now.getTime() - today.getTime() > 240000;
  // 30000 = 30 seconds; this is the threshold limit
  // you are free to setup your own threshold limit
}
             ScriptApp.newTrigger("Foto_function_Repeat")
                  .timeBased()
                  .everyMinutes(1)
                  .create();