You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过手动触发脚本终止Google App Script中运行的脚本?

在Google App Script中中断正在运行的脚本

有两种可行的方案实现手动触发脚本终止正在运行的任务,根据你的需求选择:

方案一:用共享状态标记(简单无额外配置)

这种方法让运行中的脚本定期检查一个全局标记,收到停止指令后主动退出,是最常用的轻量方案。

步骤:

  1. 用PropertiesService存储一个运行状态标记(持久化,脚本重启也能读取)
  2. 正在运行的脚本中,在关键节点(比如循环、耗时操作前后)检查标记
  3. 手动触发的停止脚本负责修改这个标记为停止状态

代码示例:

长时间运行的脚本

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。

步骤:

  1. 打开脚本对应的Google Cloud项目,启用Google Apps Script API
  2. 在脚本的appsscript.json中添加OAuth权限范围:"https://www.googleapis.com/auth/script.projects"
  3. 编写停止脚本,先获取正在运行的任务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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:30:21