如何修改Google Apps Script实现单表数据同步至多文件夹下多表格
修改Google Apps Script实现多文件夹内表格数据同步
核心修改思路
- 新增递归文件夹遍历函数,扫描根文件夹及其所有子文件夹,收集所有Google Sheets文件;
- 优化源数据提取逻辑,增加存在性校验,避免无意义报错;
- 批量处理每个目标表格,支持替换旧数据或追加数据两种模式,同时加入错误捕获保障脚本稳定性。
完整修改后的代码
function syncDataToSheetsInFolders() { // 1. 提取源数据 const sourceSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = sourceSpreadsheet.getSheetByName('carpetas'); if (!sourceSheet) { SpreadsheetApp.getUi().alert('源表格中未找到名为"carpetas"的工作表'); return; } const lastRow = sourceSheet.getLastRow(); const lastCol = sourceSheet.getLastColumn(); if (lastRow === 0 || lastCol === 0) { SpreadsheetApp.getUi().alert('源工作表中无数据可同步'); return; } const sourceData = sourceSheet.getRange(1, 1, lastRow, lastCol).getValues(); // 2. 设置根文件夹ID(替换成你的根文件夹ID) const rootFolderId = "你的根文件夹ID"; const rootFolder = DriveApp.getFolderById(rootFolderId); if (!rootFolder) { SpreadsheetApp.getUi().alert('无法找到指定的根文件夹'); return; } // 3. 递归遍历所有文件夹,收集Google Sheets文件 const allSheetsFiles = getAllSheetsInFolder(rootFolder); // 4. 遍历每个表格,同步数据 allSheetsFiles.forEach(file => { try { const targetSpreadsheet = SpreadsheetApp.openById(file.getId()); const targetSheet = targetSpreadsheet.getSheetByName('carpetas'); if (!targetSheet) { console.log(`表格 ${file.getName()} 中未找到"carpetas"工作表,跳过`); return; } // 两种模式可选:替换旧数据 / 追加到末尾 // 模式1:替换旧数据(清空后写入,适合数据过时需完全更新的场景) targetSheet.clearContents(); targetSheet.getRange(1, 1, sourceData.length, sourceData[0].length).setValues(sourceData); // 模式2:追加到现有数据末尾(和原代码逻辑一致) // const startRow = targetSheet.getLastRow() + 1; // targetSheet.getRange(startRow, 1, sourceData.length, sourceData[0].length).setValues(sourceData); console.log(`已成功同步数据到表格:${file.getName()}`); } catch (e) { console.error(`处理表格 ${file.getName()} 时出错:${e.message}`); } }); SpreadsheetApp.getUi().alert('数据同步完成,详情可查看日志'); } // 递归函数:遍历文件夹及其子文件夹,返回所有Google Sheets文件 function getAllSheetsInFolder(folder) { let sheetsFiles = []; // 获取当前文件夹内的Google Sheets文件 const files = folder.getFilesByType(MimeType.GOOGLE_SHEETS); while (files.hasNext()) { sheetsFiles.push(files.next()); } // 递归遍历子文件夹 const subFolders = folder.getFolders(); while (subFolders.hasNext()) { const subFolder = subFolders.next(); sheetsFiles = sheetsFiles.concat(getAllSheetsInFolder(subFolder)); } return sheetsFiles; }
使用说明
- 替换代码中的
"你的根文件夹ID":从目标文件夹的URL中提取ID(例如https://drive.google.com/drive/folders/XXXXXX中的XXXXXX); - 选择同步模式:根据需求注释/取消注释对应模式的代码块;
- 运行脚本:首次运行需授权,完成后可通过「视图>日志」查看同步详情;
- 错误处理:脚本会跳过无目标工作表的表格,出错表格会在日志中记录,不会中断整个同步流程。
内容的提问来源于stack exchange,提问作者Vivian Roberts
相关产品推荐
相关产品推荐

