У меня есть приложения Script, которые постоянно получают эту ошибку. Судья по электронному письму с уведомлением, похоже, что срок составляет 5 минут. Кто-нибудь знает, есть ли способ продлить этот срок? Или, возможно, есть способ снова вызвать приложения Script, и он забирает с того места, где он остановился? Любая помощь приветствуется.
Превышено максимальное время выполнения в Google Apps Script
Ответ 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 может считывать состояние из базы данных и выбирать, где она была остановлена, пока не завершится вся обработка. Попробуйте эту стратегию, и я думаю, вы будете довольны результатами.
Ответ 5
Если вы используете выпуск G Suite Business или Enterprise. Вы можете зарегистрировать ранний доступ для App Maker после того, как приложение-разработчик включило ваш запуск script времени выполнения с 6 минут до 30 минут:)
Подробнее о создателе приложений Нажмите здесь