GAS - продлить время выполнения скрипта - PullRequest
1 голос
/ 16 октября 2019

На основе ССЫЛКА Я узнал, как продлить время выполнения скрипта Google Apps Script, когда оно превышает максимальное время выполнения 5 минут.

Это работает, но я не уверен, еслиЯ сделал это правильно. Я сталкиваюсь с некоторыми проблемами, описанными ниже.

Исходя из главной функции, я передаю переменную "t" в качестве начальной точки цикла и вызываю функцию Foto_function. Существует триггер, если время превышает ограничение в 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;
               } 

.....

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
    }

Когда время превышено, клон функции Foto_function (называемый "Foto_function_Releat")будет запущено. Переменная "t" будет передана функции клона. Время истекает с нуля, и если прошло 240 секунд, оно переключается обратно на исходную функцию Foto_FIX.

По окончании цикла цикл триггеров будет удален ....

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

.....

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

НО: я получаю от 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
}

1 Ответ

1 голос
/ 17 октября 2019

Блок кода

             ScriptApp.newTrigger("Foto_function_Repeat")
                  .timeBased()
                  .everyMinutes(1)
                  .create();

заставляет вас создать триггер, который будет запускать function Foto_function_Repeat() каждую минуту. Таким образом, каждая минута var t будет возвращаться к = value_t и будет увеличиваться в цикле for до тех пор, пока условие if (t == lastrow_Fotos + 1) не будет выполнено. function stopp_triggers() удалит все триггеры, но не прекратит выполнение repeatFunction(), которое было запущено уже в промежуток времени между началом первого repeatFunction() запуска и моментом, когда t == lastrow_Fotos + 1 исполнен.

Я рекомендую вам увеличить время выполнения триггера с .everyMinutes(1) до, например, .everyMinutes(4).

Кроме того, я рекомендую вам реализовать журналы с переменными счетчика в стратегических позициях кода, чтобы выможет следить за его выполнением и проверять правильность вызова различных функций.

Свойства сценария полезны для хранения значений между запусками сценария. Вы можете сохранять и извлекать переменные счетчика, чтобы не начинать каждый раз повторение цикла с нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...