Google скрипт на отмену - PullRequest
       9

Google скрипт на отмену

0 голосов
/ 10 сентября 2018

Я создаю скрипт для Google Sheets. Выполнение сценария занимает много времени, поэтому Google отображает следующее сообщение в верхней части листа: «Запуск сценария отмены закрытия» (что в порядке).

Когда я нажимаю «Отмена», я бы хотел, чтобы код gs очистил текущее состояние. Есть ли способ подключить код к этому событию? Или есть способ выполнить кусок кода перед завершением выполнения?

1 Ответ

0 голосов
/ 10 сентября 2018

Нет способа поймать сигнал "отмена" из вашего скрипта.

Если у вас много очистки, которую нельзя пропускать, вы можете использовать PropertiesService 1 для установки свойства сценария (или пользовательского свойства, если очистка выполняется для каждого пользователя). Отметка времени последнего запуска - неплохая идея.

Затем, в начале вашего долгосрочного скрипта, вы можете установить это свойство сейчас (new Date()) и очистить его в конце исправного выполнения. Прежде чем сделать , вы можете проверить (по имени), установлено ли свойство уже, и выполнить некоторую очистку, если оно есть (поскольку предположительно предыдущий вызов умер).

Вы заметите, что можете наступить на себя, если попытаетесь выполнить параллельные запуски, например, с нескольких вкладок. Для этого вам понадобится Lock 2 . Концепция проста: при запуске вы получаете блокировку, которая не позволяет другим вызовам получить эту блокировку (блокировка по умолчанию).

Таким образом, логика в основном идет:

  1. Запустить скрипт
  2. Посмотри, сможешь ли ты получить замок.
    1. Если это так, приобретите его (с таймаутом!) И продолжайте.
    2. Если нет, то либо дождитесь выхода в зависимости от ситуации.
  3. Проверьте, установлено ли свойство lastRun.
    1. Если это так, ни у одного другого процесса нет блокировки, поэтому ничего не выполняется, но мы из-за очистки. Запустите cleanUp(), который должен очистить lastRun как его последнее действие
    2. Если нет, запускать безопасно
  4. Установить свойство
  5. Делать вещи
  6. Запуск cleanUp(), который должен очистить свойство lastRun как его последнее действие
  7. Снять блокировку
  8. Выход чисто

Как код, это может выглядеть так:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...