如何阻止Google Apps Script重复建同名文件、避免覆盖并优化性能
可直接落地的脚本修改方案
核心调整逻辑
- 内置去重校验:提前加载目标文件夹所有已存Google Sheets的文件名到内存集合,转换前匹配对应
原文件名_converted格式的文件,匹配命中直接跳过,从根源上避免重复生成副本 - 流程合并提效:将原“全量Excel批量转换 → 全量遍历转换后文件批量写内容”的两步拆分逻辑,合并为单文件闭环流程——每检测到1个符合条件的Excel源文件,就完成格式转换、立刻对刚生成的Sheets做表签调整、内容清空、公式写入、复选框配置,处理完成后再切入下一个源文件,减少跨文件遍历的额外IO开销
- 重复运行防护:脚本运行时仅扫描源文件夹内的Excel格式文件,不会误将已完成转换的Sheets文件作为处理对象,避免给存量文件反复叠加处理逻辑
- 缩小处理范围:原逻辑会无差别处理目标文件夹内所有Google Sheets文件,调整后仅对本次转换流程新生成的文件做内容配置,不会误修改目标文件夹内存量的其他Sheets文件
完整可运行代码
// 全局配置项,替换为实际文件夹ID即可 const CONFIG = { sourceFolderId: "xxxxx", // 存放待转换Excel的源文件夹ID destinationFolderId: "zzzzz", // 转换后Sheets的存放目标文件夹ID processedSheetTabColor: "ff0000" // 标记已处理表的标签颜色 } function excel2SheetsAndSorting4LED(){ processFilesInSingleFlow(); } function processFilesInSingleFlow() { const sourceFolder = DriveApp.getFolderById(CONFIG.sourceFolderId); const destFolder = DriveApp.getFolderById(CONFIG.destinationFolderId); // 提前加载目标文件夹内已存在的Sheets文件名,用于去重判断 const existingSheets = new Set(); const existingFileIterator = destFolder.getFilesByType(MimeType.GOOGLE_SHEETS); while(existingFileIterator.hasNext()) { existingSheets.add(existingFileIterator.next().getName()); } // 预设的写入值、公式配置 const contentTemplate = [ [1, 'where Col5<>0', "=COUNTA(K4:K)",'', "=COUNTA(M4:M)", "=COUNTA(N4:N)"], [2, "=IF(K2=FALSE,,\" and Col5<=95\")", '', '', '', ''], [3, "=QUERY(SORT({A3:B,C3:C+0,D3:D,E3:G+0,Y3:AF},3,0,5,1),J1&J2,1)", '', '', '', ''] ]; // 逐文件遍历源文件夹,闭环处理 const sourceFileIterator = sourceFolder.getFiles(); while(sourceFileIterator.hasNext()) { const currentFile = sourceFileIterator.next(); // 仅处理新旧格式的Excel文件 if (currentFile.getMimeType() != MimeType.MICROSOFT_EXCEL && currentFile.getMimeType() != MimeType.MICROSOFT_EXCEL_LEGACY) continue; const originalFileName = currentFile.getName().split('.')[0]; const convertedFileName = `${originalFileName}_converted`; // 命中已存在的同名文件直接跳过 if (existingSheets.has(convertedFileName)) { continue; } // 执行Excel到Google Sheets的格式转换 const convertConfig = { title: convertedFileName, parents: [{id: CONFIG.destinationFolderId}], mimeType: MimeType.GOOGLE_SHEETS }; const convertedFile = Drive.Files.copy(convertConfig, currentFile.getId()); // 将新生成的文件名加入已存在集合,避免后续重复创建 existingSheets.add(convertedFileName); // 转换完成立刻对当前文件做内容处理 const targetSs = SpreadsheetApp.openById(convertedFile.id); const originalFirstSheet = targetSs.getSheets()[0]; const processSheet = originalFirstSheet.copyTo(targetSs); // 标记已处理的表签颜色 processSheet.setTabColor(CONFIG.processedSheetTabColor); targetSs.moveActiveSheet(1); // 清空预设区域的原有内容 processSheet.getRange("I1:Y").clear(); // 写入预设模板值与公式 processSheet.getRange(1, 9, contentTemplate.length, contentTemplate[0].length).setValues(contentTemplate); // 在指定位置插入复选框 processSheet.getRange(2,11).insertCheckboxes(); } }
使用注意
- 运行前将配置项中的两个文件夹ID替换为实际值即可
- 由于脚本调用了Drive高级服务的文件复制接口,需要在Apps Script的「服务」面板中手动添加启用Drive API,否则会触发权限报错
- 重复执行脚本时,所有已存在的转换文件、已完成内容配置的表都会被自动跳过,不会生成重复副本,也不会对已有文件做冗余修改
内容的提问来源于stack exchange,提问作者Swen
相关产品推荐
相关产品推荐

