Google Apps Script如何通过自定义函数终止另一正在运行的函数
实现逻辑说明
你已经用PropertiesService做状态共享的思路是完全可行的,只要给循环增加停止标记检测即可,具体逻辑如下:
PropertiesService.getScriptProperties()是Google Apps Script提供的全局属性存储服务,同一个脚本下的所有函数调用都可以读写其中的键值对,天然适合作为跨函数的停止信号存储介质- 运行
settrigger时先清空原有停止标记,避免上次手动停止的标记导致本次执行直接中断 - 每次循环执行前先读取停止标记,检测到标记值为
stop时直接跳出循环,终止执行 - 调用
stopfunc时写入停止标记,下一次循环检测到标记就会自动终止运行
修改后的完整代码
settrigger函数
function settrigger() { // 启动前先清空旧的停止标记,避免上次操作影响本次运行 PropertiesService.getScriptProperties().deleteProperty("stop"); var ss = SpreadsheetApp.getActiveSpreadsheet() var y = 1; var z = 1 while ( y != 100000 ){ // 每次循环先检测是否收到停止信号 var stopFlag = PropertiesService.getScriptProperties().getProperty("stop"); if(stopFlag === "stop"){ // 检测到停止信号后跳出循环,终止执行 break; } var x = ss.getActiveSheet().getRange('A15').getValue(); x=x+1; ss.getRange('A15').setValue(x); y=y+1; var toggle = ss.getRange('A1') if (x%2==0){ toggle.setBackground("RED"); } else if (x%2!=0) { toggle.setBackground("WHITE"); } } // 循环结束后清空停止标记,方便下次运行 PropertiesService.getScriptProperties().deleteProperty("stop"); }
stopfunc函数(原有逻辑无需修改,可直接使用)
function stopfunc() { PropertiesService.getScriptProperties().setProperty("stop", "stop"); var ss = SpreadsheetApp.getActiveSpreadsheet() var toggle = ss.getRange('A1') toggle.setBackground("WHITE") }
注意事项
- 因为循环内每次都会读写表格数据,本身执行速度不会特别快,停止信号检测不会有明显的性能损耗
- 如果需要进一步提升响应速度,可以把读取停止标记的逻辑放在循环内固定间隔执行,比如每10次循环读一次,减少属性读取的次数
内容的提问来源于stack exchange,提问作者weizer
相关产品推荐
相关产品推荐

