Превышено максимальное время выполнения в скрипте Google Apps - PullRequest
46 голосов
/ 21 октября 2011

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

Ответы [ 5 ]

65 голосов
/ 22 декабря 2011

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

  1. Храните необходимую информацию (например, счетчик циклов) в электронной таблице или другом постоянном хранилище (например, ScriptProperties).
  2. Ваш сценарий завершается каждые пять минут или около того.
  3. Установите управляемый по времени триггер для запуска скрипта каждые пять минут (или создайте триггер программно, используя Служба сценариев ).
  4. При каждом запуске читайте сохраненные данные из постоянного хранилища, которое вы использовали, и продолжайте запускать скрипт с того места, где он остановился.

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

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

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. Функция была соответственно изменена.

27 голосов
/ 02 января 2012

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

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

14 голосов
/ 26 ноября 2014

Ответ Антона Сорадоя выглядит нормально, но рассмотрите возможность использования Служба кэширования вместо хранения данных во временном листе.

 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 года ограничение времени выполнения сценария составляет 6 минут .


Пользователи G Suite Business / Enterprise / Education и Early Access:

По состоянию на август 2018 года максимальное время выполнения сценария теперь установлено для этих пользователей равным 30 минутам.

5 голосов
/ 15 ноября 2017

Если вы используете G Suite Business или Enterprise Edition.Вы можете зарегистрировать ранний доступ для App Maker после того, как App Maker включит ваш скрипт, время выполнения увеличит время выполнения с 6 минут до 30 минут :)

Подробнее о приложении Нажмите здесь

5 голосов
/ 28 июля 2012

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

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