Тайм-аут сценария приложения Google ~ 5 минут?

19

Мой скрипт приложения Google выполняет итерацию через файлы файлов google пользователя и копирование, а иногда и перенос файлов в другие папки. Сценарий всегда останавливается через 5 минут без сообщения об ошибке в журнале.

Я сортирую десятки, а иногда и тысячи файлов за один проход.

Есть ли какие-либо настройки или обходные пути?

    
задан Martin V. 22.01.2013 в 03:53
источник
  • возможный дубликат превышенного максимального времени выполнения в скрипте Google Apps –  KyleMit 22.04.2015 в 16:30

4 ответа

31

Квоты

  

Максимальное время выполнения для одного скрипта - 6 минут / выполнение
  - Ссылка

Но есть и другие ограничения, чтобы ознакомиться с ними. Например, вам разрешено только триггерное время запуска 1 час / день, поэтому вы не можете просто разбить длинную функцию на 12 разных 5-минутных блоков.

Оптимизация

Тем не менее, есть очень мало причин, по которым вам действительно нужно занять шесть минут. У JavaScript не должно быть проблем с сортировкой тысяч строк данных за пару секунд. Скорее всего, это может повредить ваши служебные вызовы в самих Google Apps.

  

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

Пакетирование

Лучшее, что вы можете сделать, это уменьшить количество вызовов службы. Google позволяет это, разрешая пакетные версии большинства своих вызовов API.

В качестве тривиального примера Вместо этого :

for (var i = 1; i <= 100; i++) {
  SpreadsheetApp.getActiveSheet().deleteRow(i);
}

Сделайте это :

SpreadsheetApp.getActiveSheet().deleteRows(i, 100);

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

Переплетение чтения и записи

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

  

Каждый раз, когда вы читаете, мы должны сначала очистить (зафиксировать) кэш записи, чтобы убедиться, что вы читаете последние данные (вы можете принудительно написать кеш, вызвав SpreadsheetApp.flush() ). Аналогично, каждый раз, когда вы пишете, мы должны отбрасывать кеш чтения, потому что он больше недействителен. Поэтому, если вы можете избежать чередования чтений и записи, вы получите полное преимущество кеша.
  - Ссылка

Например, вместо этого :

sheet.getRange("A1").setValue(1);
sheet.getRange("B1").setValue(2);
sheet.getRange("C1").setValue(3);
sheet.getRange("D1").setValue(4);

Сделайте это :

sheet.getRange("A1:D1").setValues([[1,2,3,4]]);

Цепочки вызовов функций

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

Данные можно хранить в службе кэширования (временный) или Служба свойств (постоянные) ведра для поиска во всех исполнениях (поскольку скрипты Google Apps имеют безстоящее исполнение).

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

    
ответ дан KyleMit 22.04.2015 в 16:29
источник
  • Спасибо KyleMit, это очень полный ответ! –  Laurent' 16.06.2015 в 21:33
8

Определите способ разделения вашей работы, поэтому требуется меньше 6 минут, так как это ограничение для любого скрипта. На первом проходе вы можете перебирать и сохранять список файлов и папок в электронной таблице и добавлять триггер, зависящий от времени для части 2.

В части 2 удалите каждую запись в списке при ее обработке. Если в списке нет элементов, удалите триггер.

Вот как я обрабатываю лист из примерно 1500 строк, которые распространяются примерно на десяток различных электронных таблиц. Из-за количества вызовов в электронные таблицы он истекает, но продолжается, когда триггер запускается снова.

    
ответ дан Fred 22.01.2013 в 04:25
источник
  • Чтобы быть точным, максимальное время выполнения составляет 6 минут: «текущий максимальный срок выполнения скрипта (6 минут)», как указано здесь developers.google.com/apps-script/scriptdb –  Peter Herrmann 22.01.2013 в 11:05
  • Спасибо, я исправил это. Кроме того, я использую триггер 10мин для моего скрипта, чтобы убедиться, что между выполнением нет совпадений. Я не уверен, как Google решает запустить триггеры с временным управлением, поэтому небольшой буфер не может повредить. –  Fred 22.01.2013 в 13:51
  • Итак, вы можете хранить все свои данные в ScriptDb и выполнять только небольшую часть (из-за ограничения 6min), а затем продолжить в следующем запуске (который будет запускаться по таймеру). Это звучит как хорошее решение. –  Martin V. 22.01.2013 в 22:27
  • Кроме того, теперь вы можете создавать триггеры в любое время, поэтому мой скрипт создает триггер в течение 7 минут в будущем каждый раз, когда он запускается (если он знает, что он должен продолжать работать). –  Fred 23.04.2013 в 03:22
2

Я разработал библиотеку скриптов Google Apps, которая использует UserProperties и программные триггеры для запуска пакета, которая выходит за пределы 6 минут. Вы можете импортировать эту библиотеку в свой проект GAS и обернуть свой код API, чтобы он мог запускать FOREVER (ну, на самом деле, мы ограничены квотами, связанными с количеством часов, которые могут запускать триггеры)

Здесь вы можете узнать все о нем: Ссылка     

ответ дан patt0 18.12.2015 в 06:27
источник
0

Если вы являетесь бизнес-клиентом, вы можете подписаться на Ранний доступ к разработчику приложений , который включает Гибкие квоты .

  

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

    
ответ дан browly 11.01.2017 в 17:39
источник