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
相关产品推荐
相关产品推荐

