如何通过文件夹ID将Google表格复制到指定文件夹的多个电子表格中
问题修正方案
你原代码的核心问题是获取目标文件夹后,直接对文件夹对象调用了hasNext()方法,但DriveApp.getFolderById()返回的是文件夹对象,不是文件迭代器,必须先调用getFiles()方法拿到文件夹里的文件列表才能遍历。另外还有一处小问题,获取工作表名称时没必要再调用getActiveSpreadsheet(),直接用源工作表的getName()更可靠。
修正后的完整代码:
function copySheetVA() { var source = SpreadsheetApp.getActiveSpreadsheet(); var sheet = source.getActiveSheet(); var sourceFile = DriveApp.getFileById(source.getId()); // 获取目标文件夹 var targetFolder = DriveApp.getFolderById('1zZDvtFzIvmD-7Z5f5Sbi4G3-XXXXX'); // 获取目标文件夹内的所有文件迭代器 var folderFiles = targetFolder.getFiles(); var thisFile; while (folderFiles.hasNext()) { thisFile = folderFiles.next(); // 只处理Google表格文件,避免非表格文件报错 if (thisFile.getName() !== sourceFile.getName() && thisFile.getMimeType() === MimeType.GOOGLE_SHEETS) { var currentSS = SpreadsheetApp.openById(thisFile.getId()); // 直接用源工作表的名称,避免activeSheet切换问题 var actualSheetName = sheet.getName(); // 复制工作表到目标表格 var copiedSheet = sheet.copyTo(currentSS); // 直接对复制后的工作表重命名,不用通过索引找 copiedSheet.setName(actualSheetName); } } }
关键修改点说明:
- 拆分目标文件夹和文件迭代器的获取:先存目标文件夹对象,再调用
getFiles()拿到可遍历的文件列表,这样才能正常使用hasNext()循环 - 增加MIME类型判断:确保只处理Google表格文件,避免遍历到文件夹里的文档、图片等非表格文件时触发报错
- 简化工作表名称获取:直接用源工作表的
sheet.getName(),不用重复调用getActiveSpreadsheet(),防止代码执行过程中活动表格切换导致名称错误 - 优化重命名逻辑:复制工作表后直接用返回的
copiedSheet对象操作,比通过索引定位最后一个工作表更稳妥,避免目标表格原有工作表顺序变化导致出错
内容的提问来源于stack exchange,提问作者nickel
相关产品推荐
相关产品推荐

