如何在GAS中遍历所有文件夹及子文件夹汇总指定Sheet数据?
解决Google Apps Script遍历多层文件夹汇总表格数据的问题
需求说明
- 文件夹结构:
Evaluation根文件夹下包含N1、N2两个子文件夹;N1、N2各自包含A、B、C、D、E五个子文件夹 - 目标:遍历所有层级文件夹中的谷歌表格,将每个表格内名为
Summary(原代码中变量为Resumen,需与表格内Sheet名称保持一致)的Sheet里 A1:C32 区域的数据,汇总到指定主表格的BaseSheet中 - 原代码问题:仅支持指定单个文件夹,无法递归遍历子文件夹,需手动修改路径,需要实现全自动遍历汇总
修改后的完整代码
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
相关产品推荐
相关产品推荐

