Подтвердить что ты не робот

Превышено максимальное время выполнения в Google Apps Script

У меня есть приложения Script, которые постоянно получают эту ошибку. Судья по электронному письму с уведомлением, похоже, что срок составляет 5 минут. Кто-нибудь знает, есть ли способ продлить этот срок? Или, возможно, есть способ снова вызвать приложения Script, и он забирает с того места, где он остановился? Любая помощь приветствуется.

4b9b3361

Ответ 1

Одна вещь, которую вы могли бы сделать (это, конечно, зависит от того, что вы пытаетесь выполнить):

  • Сохраните необходимую информацию (например, счетчик циклов) в электронной таблице или другом постоянном хранилище (то есть ScriptProperties).
  • Разверните script каждые пять минут.
  • Настройте триггер, запускаемый по времени, для запуска script каждые пять минут (или создайте триггер программно с помощью службы Script).
  • В каждом прогоне читайте сохраненные данные из постоянного хранилища, которые вы использовали, и продолжайте запускать script с того места, где оно было остановлено.

Это не одноразовое решение, если вы публикуете свой код, люди смогут лучше помочь вам.

Ниже приведен упрощенный фрагмент кода из script, который я использую каждый день:

function runMe() {
  var startTime= (new Date()).getTime();

  //do some work here

  var scriptProperties = PropertiesService.getScriptProperties();
  var startRow= scriptProperties.getProperty('start_row');
  for(var ii = startRow; ii <= size; ii++) {
    var currTime = (new Date()).getTime();
    if(currTime - startTime >= MAX_RUNNING_TIME) {
      scriptProperties.setProperty("start_row", ii);
      ScriptApp.newTrigger("runMe")
               .timeBased()
               .at(new Date(currTime+REASONABLE_TIME_TO_WAIT))
               .create();
      break;
    } else {
      doSomeWork();
    }
  }

  //do some more work here

}

ПРИМЕЧАНИЕ # 1: переменная REASONABLE_TIME_TO_WAIT должна быть достаточно большой для запуска нового триггера. (Я установил его на 5 минут, но я думаю, что это может быть меньше).

ПРИМЕЧАНИЕ # 2: doSomeWork() должна быть функцией, которая выполняется относительно быстро (я бы сказал, менее 1 минуты).

ПРИМЕЧАНИЕ # 3: Google устарел Script Properties и внедрил Properties Service вместо него, Соответственно была изменена функция.

Ответ 2

Кроме того, попробуйте минимизировать количество вызовов для служб google. Например, если вы хотите изменить диапазон ячеек в электронных таблицах, не читайте их, не мутируйте и не храните их. Вместо этого прочитайте весь диапазон (используя Range.getValues ​​() в памяти, измените его и сохраните все это сразу (используя Range.setValues ​​()).

Это должно сэкономить вам много времени на выполнение.

Ответ 3

Ответ Антона Сорауди кажется ОК, но рассмотреть возможность использования Cache Service вместо хранения данных во временном листе.

 function getRssFeed() {
   var cache = CacheService.getPublicCache();
   var cached = cache.get("rss-feed-contents");
   if (cached != null) {
     return cached;
   }
   var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml"); // takes 20 seconds
   var contents = result.getContentText();
   cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
   return contents;
 }

Также обратите внимание, что с апреля 2014 года ограничение времени script составляет 6 минут.

Ответ 4

Я использовал ScriptDB для сохранения моего места при обработке большого количества информации в цикле. Значение script может превышать 5-минутный предел. Обновляя ScriptDb во время каждого прогона, script может считывать состояние из базы данных и выбирать, где она была остановлена, пока не завершится вся обработка. Попробуйте эту стратегию, и я думаю, вы будете довольны результатами.