Ответ 1
Квоты
Максимальное время выполнения для одного 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 имеют исполнение без сохранения).
Если вы хотите начать другое событие, вы можете создать свой собственный триггер с классом строителя триггеров или настроить повторяющийся триггер в тесной таблице времени.