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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:36:05