使用Google Apps Script更新文件夹内容时的子文件夹误删问题
修复Google Apps Script文件夹增量更新逻辑问题
问题场景
源文件夹结构:
Template Folder (Source Folder) - SubFolder 1 *File 1 *File 2 - Sub Folder 2 * File 3 * File 4
已存在的目标文件夹结构:
Name X (Destination folder) - SubFolder 1 *File 1 - Sub Folder 2 * File 3 * File 4
执行updateFolderContents脚本后,预期是仅在SubFolder 1中添加File 2,保留其余现有内容,但实际行为是删除所有子文件夹后重新创建并添加所有文件:
Deleted SubFolder 1 Deleted SubFolder 2 Added File 1 in SubFolder 1 Added File 2 in SubFolder 1 Added File 3 in SubFolder 2 Added File 4 in SubFolder 2
问题根源
原脚本逻辑错误地采用了「删除所有子文件夹后重新复制」的全量同步方式,没有实现增量检查——即未判断目标文件夹中是否已存在同名子文件夹/文件,导致原有内容被清空重建。
修复方案
修改为增量同步逻辑,核心思路是:
- 遍历源文件夹的子文件夹与文件
- 子文件夹:先检查目标文件夹是否已存在同名文件夹,存在则递归同步内部内容,不存在则新建后复制内容
- 文件:检查目标文件夹是否已存在同名文件,仅复制缺失的文件(可按需添加覆盖逻辑)
修正后的代码
function updateFolderContents(sourceFolderId, destFolderId) { const sourceFolder = DriveApp.getFolderById(sourceFolderId); const destFolder = DriveApp.getFolderById(destFolderId); // 同步子文件夹 syncSubFolders(sourceFolder, destFolder); // 同步当前文件夹下的文件 syncFiles(sourceFolder, destFolder); } // 递归同步子文件夹 function syncSubFolders(sourceParent, destParent) { const sourceSubFolders = sourceParent.getFolders(); while (sourceSubFolders.hasNext()) { const sourceSubFolder = sourceSubFolders.next(); const folderName = sourceSubFolder.getName(); // 检查目标父文件夹中是否已存在同名子文件夹 let destSubFolder = null; const existingFolders = destParent.getFoldersByName(folderName); if (existingFolders.hasNext()) { destSubFolder = existingFolders.next(); } else { // 不存在则创建新文件夹 destSubFolder = destParent.createFolder(folderName); console.log(`Created folder: ${folderName}`); } // 递归同步该子文件夹的内容 syncSubFolders(sourceSubFolder, destSubFolder); syncFiles(sourceSubFolder, destSubFolder); } } // 同步文件夹下的文件(仅添加缺失的文件) function syncFiles(sourceFolder, destFolder) { const sourceFiles = sourceFolder.getFiles(); while (sourceFiles.hasNext()) { const sourceFile = sourceFiles.next(); const fileName = sourceFile.getName(); // 检查目标文件夹中是否已存在同名文件 const existingFiles = destFolder.getFilesByName(fileName); if (!existingFiles.hasNext()) { // 不存在则复制文件 sourceFile.makeCopy(fileName, destFolder); console.log(`Added file: ${fileName} in ${destFolder.getName()}`); } else { // 可选:若需要覆盖旧文件,取消以下注释 // const existingFile = existingFiles.next(); // existingFile.setTrashed(true); // sourceFile.makeCopy(fileName, destFolder); // console.log(`Updated file: ${fileName} in ${destFolder.getName()}`); console.log(`Skipped existing file: ${fileName} in ${destFolder.getName()}`); } } }
代码说明
updateFolderContents:主入口函数,接收源文件夹ID和目标文件夹ID,触发同步流程syncSubFolders:递归处理子文件夹,优先复用已存在的文件夹,避免删除重建syncFiles:仅复制目标文件夹中缺失的文件,保留原有内容,同时提供了可选的文件覆盖逻辑
修改后执行脚本,只会新增目标文件夹中缺失的File 2,不会删除已存在的子文件夹和文件,完全符合增量更新的预期。
内容的提问来源于stack exchange,提问作者EagleEye
相关产品推荐
相关产品推荐

