Нет способа поймать сигнал "отмена" из вашего скрипта.
Если у вас много очистки, которую нельзя пропускать, вы можете использовать PropertiesService
1 для установки свойства сценария (или пользовательского свойства, если очистка выполняется для каждого пользователя). Отметка времени последнего запуска - неплохая идея.
Затем, в начале вашего долгосрочного скрипта, вы можете установить это свойство сейчас (new Date()
) и очистить его в конце исправного выполнения. Прежде чем сделать , вы можете проверить (по имени), установлено ли свойство уже, и выполнить некоторую очистку, если оно есть (поскольку предположительно предыдущий вызов умер).
Вы заметите, что можете наступить на себя, если попытаетесь выполнить параллельные запуски, например, с нескольких вкладок. Для этого вам понадобится Lock
2 . Концепция проста: при запуске вы получаете блокировку, которая не позволяет другим вызовам получить эту блокировку (блокировка по умолчанию).
Таким образом, логика в основном идет:
- Запустить скрипт
- Посмотри, сможешь ли ты получить замок.
- Если это так, приобретите его (с таймаутом!) И продолжайте.
- Если нет, то либо дождитесь выхода в зависимости от ситуации.
- Проверьте, установлено ли свойство
lastRun
.
- Если это так, ни у одного другого процесса нет блокировки, поэтому ничего не выполняется, но мы из-за очистки. Запустите
cleanUp()
, который должен очистить lastRun
как его последнее действие
- Если нет, запускать безопасно
- Установить свойство
- Делать вещи
- Запуск
cleanUp()
, который должен очистить свойство lastRun
как его последнее действие
- Снять блокировку
- Выход чисто
Как код, это может выглядеть так:
function scriptMain() {
var lock = LockService.getScriptLock();
lock.waitLock(30000);
var scriptProperties = PropertiesService.getScriptProperties();
var lastRun = scriptProperties.getProperty('last run time');
if (lastRun != null) { cleanUp(); }
scriptProperties.setProperty('last run time', new Date()); // aka now
// Do Stuff
cleanUp();
lock.releaseLock();
return();
function cleanUp() {
var scriptProperties = PropertiesService.getScriptProperties(); // or just pass it in
// Do actual cleanup
scriptProperties.deleteProperty('last run time'); // subsequent GETs will return null
return;