Google app script таймаут ~ 5 минут?

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

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

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

4 ответа

Квоты

Максимальное время выполнения для одного script составляет 6 минут/выполнение - https://developers.google.com/apps-script/guides/services/quotas

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

Оптимизация

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

Вы можете писать сценарии, чтобы максимально использовать встроенное кеширование, минимизируя количество чтений и записей. Чередование команд чтения и записи происходит медленно. Чтобы ускорить работу script, прочитайте все данные в массиве с помощью одной команды, выполните любые операции с данными в массиве и напишите данные с помощью одной команды. - https://developers.google.com/apps-script/best_practices

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

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

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

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

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

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

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

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

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

Каждый раз, когда вы читаете, мы должны сначала очистить (зафиксировать) кэш записи, чтобы убедиться, что вы читаете последние данные (вы можете принудительно написать кеш, вызвав SpreadsheetApp.flush()). Аналогично, каждый раз, когда вы пишете, мы должны отбрасывать кеш чтения, поскольку он более недействителен. Поэтому, если вы можете избежать чередования чтений и записи, вы получите полное преимущество кеша. - http://googleappsscript.blogspot.com/2010/06/optimizing-spreadsheet-operations.html

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

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]]);

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

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

Вы можете хранить данные в Cache Service (временный) или службе свойств (постоянные) ведра для (поскольку сценарии Google Apps имеют исполнение без сохранения).

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


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

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

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


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

Здесь вы можете узнать все о нем: http://patt0.blogspot.in/2014/08/continuous-batch-library-update-for.html


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

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

licensed under cc by-sa 3.0 with attribution.