使用Google App Script批量读取Drive文件夹表格工作表名称报错排查
Google Apps Script批量获取表格工作表名称时触发服务错误问题
问题描述
尝试用Google Apps Script打印Google Drive指定文件夹内所有表格文件的工作表名称,但调用SpreadsheetApp.openById(xxx)时抛出错误:
Exception: Service Spreadsheets failed while accessing document with id xxxxx
操作步骤:
- 编写
getFiles()函数获取目标文件夹内所有文件ID列表,执行无异常; - 编写
myAllSheetName()函数,手动粘贴ID列表后遍历调用.getSheets()时触发上述错误; - 单独传入单个文件ID执行相同逻辑的脚本运行正常,怀疑批量访问逻辑存在问题。
相关代码
附录1:获取文件夹内所有文件ID的函数
function getFiles(){ const folderId= 'xxxxxxx'; const folder = DriveApp.getFolderById(folderId); const files = folder.getFiles(); const fileList = []; while(files.hasNext()){ let file = files.next(); let fileId = file.getId(); fileList.push(fileId) } }
附录2:批量获取工作表名称的报错函数
function myAllSheetName() { let fileList = ['xxxxxx', 'xxxxxxx', 'xxxxxxx'] for(let n = 0; n < fileList.length; n++){ console.log(fileList[n]); const sheets = SpreadsheetApp.openById(fileList[n]).getSheets(); } }
正常运行的单ID脚本
function myAllSheetName() { const sheets = SpreadsheetApp.openById('xxxxx').getSheets(); for(let i = 0; i < sheets.length; i++) { console.log(sheets[i].getName()); } return sheets.map(sheet => sheet.getName()); }
问题分析与解决方案
1. 非表格文件混入ID列表
getFiles()会获取文件夹内所有类型的文件,包括非Google表格(如文档、PDF、图片等),这类文件无法通过SpreadsheetApp.openById()打开,直接触发服务错误。
修复方案:修改getFiles(),仅筛选Google表格类型的文件:
function getFiles(){ const folderId= 'xxxxxxx'; const folder = DriveApp.getFolderById(folderId); // 只获取Google表格格式的文件 const files = folder.getFilesByType(MimeType.GOOGLE_SHEETS); const fileList = []; while(files.hasNext()){ let file = files.next(); let fileId = file.getId(); fileList.push(fileId); } // 输出ID列表,方便复制到myAllSheetName使用 console.log(JSON.stringify(fileList)); }
2. 批量访问触发服务限流
Google Apps Script对服务调用频率有上限,短时间内循环访问多个文件可能触发限流,导致服务错误。
修复方案:在循环中添加延迟,并加入异常捕获,跳过无法访问的文件:
function myAllSheetName() { let fileList = ['xxxxxx', 'xxxxxxx', 'xxxxxxx']; for(let n = 0; n < fileList.length; n++){ const fileId = fileList[n]; console.log(`正在处理文件: ${fileId}`); try { const sheets = SpreadsheetApp.openById(fileId).getSheets(); // 打印当前文件的所有工作表名称 sheets.forEach(sheet => console.log(`工作表名称: ${sheet.getName()}`)); } catch(error) { console.log(`处理文件${fileId}失败: ${error.message}`); } // 添加1秒延迟,避免触发服务限流 Utilities.sleep(1000); } }
3. 个别文件权限异常
部分文件可能存在权限变更、被删除或未共享给当前脚本运行账号的情况,单个测试时可能刚好选了有权限的文件,批量时遇到无权限文件触发错误。
修复方案:通过try-catch捕获异常,同时检查文件的共享权限,确保脚本运行账号能访问目标文件。
内容的提问来源于stack exchange,提问作者Ota Yosuke
相关产品推荐
相关产品推荐

