Вы приближаетесь к этому совершенно неправильно. Вы должны включить возможность перезапуска выполнения с помощью триггера внутри вашего скрипта. Я покажу вам, как я это сделал. Имейте в виду, что мой скрипт довольно большой, и он выполняет цикл, и мне приходилось заставлять его помнить, где в цикле он остановился, чтобы он продолжал работать с теми же данными.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Purpose: Check if there is enough time left for another data output run
// Input: Start time of script execution
// Output: Boolean value if time is up
function isTimeUp(start, need) {
var cutoff = 500000 // in miliseconds (5 minutes)
var now = new Date();
return cutoff - (now.getTime() - start.getTime()) < need;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Здесь start
просто new Date()
, что вы создаете при запуске сценария. need
- это просто среднее время, которое требуется, чтобы мой скрипт выполнил 1 цикл. Если времени для цикла недостаточно, мы отключим скрипт другой функцией.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Purpose: Store current properties and create a trigger to start the script after 1 min
// Input: propertyCarrier object (current script execution properties)
// Output: Created trigger ID
function autoTrigger(passProperties, sysKeys) {
var sysProperties = new systemProperties();
if (typeof sysKeys === 'undefined' || sysKeys === null) {
sysKeys = new systemKeys();
}
var triggerID = ScriptApp.newTrigger('stateRebuild')
.timeBased()
.after(60000)
.create()
.getUniqueId();
Logger.log('~~~ RESTART TRIGGER CREATED ~~~');
//--------------------------------------------------------------------------
// In order to properly retrieve the time later, it is stored in milliseconds
passProperties.timeframe.start = passProperties.timeframe.start.getTime();
passProperties.timeframe.end = passProperties.timeframe.end.getTime();
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// Properties are stored in User Properties using JSON
PropertiesService.getUserProperties()
.setProperty(sysKeys.startup.rebuildCache, JSON.stringify(passProperties));
//--------------------------------------------------------------------------
Logger.log('~~~ CURRENT PROPERTIES STORED ~~~');
return triggerID;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ваш может быть более упрощенным, если вам не нужно помнить, где вы остановились (судя по вашей текущей реализации вы не заботитесь начать ли вы с самого начала или нет).
Созданный вами триггер должен либо нацеливаться на основную функцию, либо если вам нужно передать данные, как я, вам нужно будет иметь отдельную функцию стартера, чтобы вернуть данные из свойств пользователя и передать их ,
Вместо greasemonkey используйте триггер, управляемый по времени. См. Https://developers.google.com/apps-script/guides/triggers/installable#time-driven_triggers –
или html, который улавливает ошибку таймаута и снова вызывает сценарий. –
Я ниспровергаю этот вопрос, потому что он показывает нулевые исследования. Вы просто сделали снимок экрана с консоли. Где ваш код, который не работает так, как вы ожидаете? Читайте также: http://stackoverflow.com/help/how-to-ask –