谷歌脚本取消

时间:2018-09-10 11:27:17

标签: google-apps-script google-sheets

我正在为Google表格创建脚本。 该脚本需要很长时间才能运行,因此Google在工作表顶部显示以下消息:“正在运行脚本取消关闭”(可以)。

当我单击“取消”时,我希望gs代码清除当前状态。有没有办法将代码挂接到该事件?还是有一种在完成执行之前执行一段代码的方法?

1 个答案:

答案 0 :(得分:0)

无法从脚本中捕获“取消”信号。

如果有很多清理操作必须跳过,则可以使用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;