如何通过手动触发脚本终止Google App Script中运行的脚本?
在Google App Script中中断正在运行的脚本
有两种可行的方案实现手动触发脚本终止正在运行的任务,根据你的需求选择:
方案一:用共享状态标记(简单无额外配置)
这种方法让运行中的脚本定期检查一个全局标记,收到停止指令后主动退出,是最常用的轻量方案。
步骤:
- 用
PropertiesService存储一个运行状态标记(持久化,脚本重启也能读取) - 正在运行的脚本中,在关键节点(比如循环、耗时操作前后)检查标记
- 手动触发的停止脚本负责修改这个标记为停止状态
代码示例:
长时间运行的脚本
function longRunningTask() { const scriptProps = PropertiesService.getScriptProperties(); // 初始化运行状态 scriptProps.setProperty('taskStatus', 'running'); try { // 模拟耗时循环任务 for (let step = 0; step < 100; step++) { // 每次循环前检查停止标记 if (scriptProps.getProperty('taskStatus') !== 'running') { console.log('收到停止指令,终止任务'); scriptProps.deleteProperty('taskStatus'); // 清理标记 return; } // 这里替换成你的实际业务逻辑 console.log(`执行第${step}步`); Utilities.sleep(2000); // 模拟耗时操作 } } finally { // 任务正常结束后清理标记 scriptProps.deleteProperty('taskStatus'); } }
手动触发的停止脚本
function stopRunningTask() { const scriptProps = PropertiesService.getScriptProperties(); scriptProps.setProperty('taskStatus', 'stopped'); console.log('已发送停止指令,等待任务响应'); }
方案二:强制终止(需配置API,适合紧急情况)
如果需要强制终止无法主动检查标记的脚本,可以通过Google Apps Script API调用projects.runs.cancel方法,但需要额外配置权限和API。
步骤:
- 打开脚本对应的Google Cloud项目,启用Google Apps Script API
- 在脚本的
appsscript.json中添加OAuth权限范围:"https://www.googleapis.com/auth/script.projects" - 编写停止脚本,先获取正在运行的任务ID,再调用API终止
代码示例:
function forceStopRunningTask() { const scriptId = ScriptApp.getScriptId(); const apiUrl = `https://script.googleapis.com/v1/projects/${scriptId}/runs`; // 1. 获取所有正在运行的任务 const listOptions = { method: 'get', headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` }, muteHttpExceptions: true }; const listResponse = UrlFetchApp.fetch(`${apiUrl}?filter=status=RUNNING`, listOptions); const runs = JSON.parse(listResponse.getContentText()).runs || []; if (runs.length === 0) { console.log('没有正在运行的任务'); return; } // 2. 逐个终止运行中的任务 runs.forEach(run => { const cancelOptions = { method: 'post', headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` }, muteHttpExceptions: true }; UrlFetchApp.fetch(`${apiUrl}/${run.runId}:cancel`, cancelOptions); console.log(`已强制终止任务ID: ${run.runId}`); }); }
注意事项:
- 方案一需要脚本主动配合检查标记,如果你的代码有长时间阻塞的操作(比如一次性读取超大量数据),需要拆分成小步骤插入检查点,否则无法及时响应停止指令。
- 方案二是强制终止,可能导致数据未保存、资源未清理等问题,仅在紧急情况下使用。
- 方案二需要确保脚本拥有足够的OAuth权限,首次运行会弹出授权提示。
内容的提问来源于stack exchange,提问作者Michel Penke
相关产品推荐
相关产品推荐

