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

Google Script运行6分钟超时,如何设置断点续跑触发器提取团队盘文件夹信息

解决方案

核心实现逻辑

  • 用PropertiesService存储遍历进度(上次返回的分页token、已处理数量),避免每次执行从头遍历
  • 单次执行设置5分钟的安全时长阈值,提前1分钟终止避免触发6分钟超时限制
  • 单次执行结束后自动生成触发器,下次执行从断点位置自动续跑

优化后完整代码

// 请替换为你目标团队盘的文件夹ID
const TARGET_FOLDER_ID = '替换为你的文件夹ID';
// 单次执行最大时长,单位毫秒,设置为5分钟,预留1分钟避免超时
const MAX_RUNTIME = 5 * 60 * 1000;
// 进度存储的标识key
const PROPERTY_KEY = 'folder_list_progress';

function startListFolders() {
  // 首次运行清空原有表头和旧数据,不需要可注释掉下面3行
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.clearContents();
  sheet.appendRow(['Name','File-Id']);

  // 初始化进度
  PropertiesService.getScriptProperties().deleteProperty(PROPERTY_KEY);
  // 开始执行遍历
  continueListFolders();
}

function continueListFolders() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const scriptProps = PropertiesService.getScriptProperties();
  const startTime = Date.now();

  // 读取上次的中断进度
  let progress = scriptProps.getProperty(PROPERTY_KEY);
  let pageToken = progress ? JSON.parse(progress).pageToken : null;
  let processedCount = progress ? JSON.parse(progress).processedCount : 0;

  do {
    // 分页获取文件夹列表,每次最多拉取1000条
    const result = Drive.Files.list({
      q: `'${TARGET_FOLDER_ID}' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false`,
      fields: 'nextPageToken, files(id, name)',
      pageToken: pageToken,
      maxResults: 1000,
      supportsAllDrives: true, // 适配团队盘权限
      includeItemsFromAllDrives: true // 拉取团队盘内容
    });

    // 批量写入当前页的文件夹数据,比逐行append效率高10倍以上
    const folders = result.files;
    const rows = folders.map(folder => [folder.name, folder.id]);
    sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, 2).setValues(rows);
    processedCount += folders.length;

    // 检查是否到达单次运行最大时长
    if (Date.now() - startTime >= MAX_RUNTIME) {
      // 保存当前进度
      scriptProps.setProperty(PROPERTY_KEY, JSON.stringify({
        pageToken: result.nextPageToken,
        processedCount: processedCount
      }));
      // 创建下一次执行的触发器,1分钟后自动运行
      createNextTrigger();
      return;
    }

    pageToken = result.nextPageToken;
  } while (pageToken);

  // 全部遍历完成,清空进度和剩余触发器
  scriptProps.deleteProperty(PROPERTY_KEY);
  deleteExistingTriggers();
  SpreadsheetApp.getUi().alert(`文件夹列表导出完成,共导出${processedCount}个文件夹`);
}

function createNextTrigger() {
  // 先删除已有的同函数触发器,避免重复触发
  deleteExistingTriggers();
  ScriptApp.newTrigger('continueListFolders')
    .timeBased()
    .after(1 * 60 * 1000) // 1分钟后执行
    .create();
}

function deleteExistingTriggers() {
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(trigger => {
    if (trigger.getHandlerFunction() === 'continueListFolders') {
      ScriptApp.deleteTrigger(trigger);
    }
  });
}

// 如果需要重新导出其他文件夹,运行这个函数清空原有进度
function resetProgress() {
  PropertiesService.getScriptProperties().deleteProperty(PROPERTY_KEY);
  deleteExistingTriggers();
}

操作步骤

  • 打开你的Google表格脚本编辑器,替换原有代码为上面的代码,把TARGET_FOLDER_ID常量的值替换为你要遍历的团队盘文件夹ID
  • 首次运行前请在脚本编辑器依次点击「服务+」,找到「Drive API」添加后再运行代码
  • 首次运行startListFolders函数,按照提示完成权限授权,函数会自动开始遍历,到5分钟时长会自动暂停,创建1分钟后执行的触发器
  • 不需要手动配置触发器,代码会自动管理触发逻辑,直到所有文件夹遍历完成后会弹出完成提示

注意事项

  • 运行前请确保你的账号对目标团队盘有至少只读权限
  • 改用Drive API的分页查询+批量写入逻辑,比原生DriveApp的getFolders()逐行写入效率高3倍以上,大幅减少单次运行耗时
  • 如果要重新遍历其他文件夹,先运行resetProgress函数清空原有进度,再修改文件夹ID运行startListFolders即可

内容的提问来源于stack exchange,提问作者Ankit Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 02:54:03