我正在为Google表格创建脚本。 该脚本需要很长时间才能运行,因此Google在工作表顶部显示以下消息:“正在运行脚本取消关闭”(可以)。
当我单击“取消”时,我希望gs代码清除当前状态。有没有办法将代码挂接到该事件?还是有一种在完成执行之前执行一段代码的方法?
答案 0 :(得分:0)
无法从脚本中捕获“取消”信号。
如果有很多清理操作必须跳过,则可以使用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;