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

如何在GAS中遍历所有文件夹及子文件夹汇总指定Sheet数据?

解决Google Apps Script遍历多层文件夹汇总表格数据的问题

需求说明

  • 文件夹结构:Evaluation 根文件夹下包含 N1、N2 两个子文件夹;N1、N2 各自包含 A、B、C、D、E 五个子文件夹
  • 目标:遍历所有层级文件夹中的谷歌表格,将每个表格内名为 Summary(原代码中变量为Resumen,需与表格内Sheet名称保持一致)的Sheet里 A1:C32 区域的数据,汇总到指定主表格的Base Sheet中
  • 原代码问题:仅支持指定单个文件夹,无法递归遍历子文件夹,需手动修改路径,需要实现全自动遍历汇总

修改后的完整代码

function getdata() {
  // 配置参数
  const srcSheetName = "Resumen"; // 对应需求中的Summary,需与目标表格内Sheet名称一致
  const destinationSS_ID = "1v2Ga6SLgDBVzC4rxTt0dO6P3FGMPDM9MVf6-1r4Z4XQ";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const rootFolderId = ss.getSheetByName("SetUp").getRange('C1').getValue(); // 根文件夹(Evaluation)的ID
  
  const destinationSpreadsheet = SpreadsheetApp.openById(destinationSS_ID);
  const destsheet = destinationSpreadsheet.getSheetByName('Base');  

  // 递归遍历文件夹及子文件夹的核心函数
  function traverseFolder(folder) {
    // 处理当前文件夹内的所有文件
    const files = folder.getFiles();
    while (files.hasNext()) {
      const file = files.next();
      // 仅处理谷歌表格类型文件
      if (file.getMimeType() !== "application/vnd.google-apps.spreadsheet") {
        continue;
      }
      try {
        const sourceSS = SpreadsheetApp.openById(file.getId());
        const sourcesheet = sourceSS.getSheetByName(srcSheetName);
        if (!sourcesheet) {
          console.log(`表格 ${file.getName()} 中未找到 ${srcSheetName} Sheet,跳过`);
          continue;
        }
        // 提取指定区域A1:C32(行1到32,列1到3)
        const sourcerange = sourcesheet.getRange(1, 1, 32, 3);
        const sourcevalues = sourcerange.getValues();
        
        // 过滤全空行(可选,按需删除)
        const filteredValues = sourcevalues.filter(row => row.some(cell => cell !== ""));
        
        // 将有效数据写入主表格末尾
        if (filteredValues.length > 0) {
          const destrange = destsheet.getRange(destsheet.getLastRow() + 1, 1, filteredValues.length, filteredValues[0].length);
          destrange.setValues(filteredValues);
        }
      } catch (e) {
        console.log(`处理表格 ${file.getName()} 时出错: ${e.message}`);
      }
    }

    // 递归处理当前文件夹的所有子文件夹
    const subFolders = folder.getFolders();
    while (subFolders.hasNext()) {
      traverseFolder(subFolders.next());
    }
  }

  // 启动遍历,从根文件夹开始
  const rootFolder = DriveApp.getFolderById(rootFolderId);
  traverseFolder(rootFolder);
  SpreadsheetApp.getUi().alert("数据汇总完成!");
}

关键修改说明

  • 递归遍历逻辑:新增traverseFolder函数,自动遍历当前文件夹的所有文件,同时递归处理所有子文件夹,实现全层级自动扫描
  • 固定区域提取:将原代码的动态行范围改为固定的A1:C32(对应getRange(1,1,32,3)),精准匹配需求中的提取区域
  • 错误容错处理:添加try-catch块捕获单个表格的处理错误,避免单个文件异常导致整个脚本终止,同时输出错误日志便于排查
  • 空行过滤:可选的全空行过滤逻辑,避免无效空行占用主表格空间,可根据实际需求删除该部分代码
  • 完成提示:脚本执行完毕后弹出提示框,直观告知用户汇总完成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:40:19