如何修改AppScript代码保留最早文件并删除Google Drive重名文件
修改Google Drive重复文件删除脚本,保留最早创建的文件
需求:自动删除Google Drive指定文件夹中文件名重复的文件,保留创建日期最早的文件,删除其余重复文件。现有代码会保留最新文件而非最早的,需要修改实现需求。
原代码(问题版本)
const FOLDER_ID = "INSERTIDHERE"; // 填入要检查重复文件的文件夹ID /* * 查找指定文件夹中的重复文件名并删除重复项 */ function removeDuplicateFile() { let folder = DriveApp.getFolderById(FOLDER_ID); let files = folder.getFiles(); let fileList = []; // 如果没有文件则返回 if (!files.hasNext()) { return; } // 遍历所有文件 while (files.hasNext()) { let file = files.next(), name = file.getName(), size = file.getSize(); // 这种检查方式会保留第一个遍历到的文件,删除后续重复项 if (isDuplicateFile(fileList, name, size)) { file.setTrashed(true); } else { fileList.push([name, size]); } } } /* * 辅助函数:检查列表中是否已存在同名同大小的文件 * @param {Array} lst * @param {String} name * @param {Number} size * @returns {Boolean} */ function isDuplicateFile(lst, name, size) { for (let i = 0; i < lst.length; i++) { if (lst[i][0] === name && lst[i][1] === size) return true; } return false; } /* * 删除所有已存在的触发器 */ var deleteTrigger = () => { let triggersCollection = ScriptApp.getProjectTriggers(); if (triggersCollection.length <= 0) { console.log(`没有找到触发器ID`); } else { triggersCollection.forEach((trigger) => ScriptApp.deleteTrigger(trigger)); } return; }; /* * 创建新触发器(先删除旧触发器)并执行重复文件删除 */ function removeDuplicateFileTrigger() { // 先删除现有触发器 deleteTrigger(); // 执行重复文件删除 removeDuplicateFile(); }
修改后的代码(保留最早创建文件版本)
const FOLDER_ID = "INSERTIDHERE"; // 填入要检查重复文件的文件夹ID /* * 查找指定文件夹中的重复文件,保留最早创建的,删除其余重复项 */ function removeDuplicateFile() { let folder = DriveApp.getFolderById(FOLDER_ID); let files = folder.getFiles(); let fileRecords = []; // 收集所有文件的完整信息:名称、大小、创建时间、文件实例 while (files.hasNext()) { let file = files.next(); fileRecords.push({ name: file.getName(), size: file.getSize(), createdAt: file.getDateCreated(), file: file }); } if (fileRecords.length === 0) { console.log("文件夹中没有文件"); return; } // 按文件名+大小分组,确保真正的重复文件(同名同大小) let groupedFiles = {}; fileRecords.forEach(record => { // 用名称+大小作为唯一键,区分不同文件 const key = `${record.name}_${record.size}`; if (!groupedFiles[key]) { groupedFiles[key] = []; } groupedFiles[key].push(record); }); // 遍历每组,保留最早创建的文件,删除其余 Object.values(groupedFiles).forEach(group => { // 按创建时间升序排序,第一个就是最早创建的 group.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()); // 从第二个开始标记为删除 for (let i = 1; i < group.length; i++) { group[i].file.setTrashed(true); console.log(`已删除重复文件:${group[i].name}(创建时间:${group[i].createdAt})`); } }); console.log("重复文件清理完成"); } /* * 删除所有已存在的触发器 */ var deleteTrigger = () => { let triggersCollection = ScriptApp.getProjectTriggers(); if (triggersCollection.length <= 0) { console.log(`没有找到触发器ID`); } else { triggersCollection.forEach((trigger) => ScriptApp.deleteTrigger(trigger)); } return; }; /* * 创建新触发器(先删除旧触发器)并执行重复文件删除 */ function removeDuplicateFileTrigger() { // 先删除现有触发器 deleteTrigger(); // 执行重复文件删除 removeDuplicateFile(); }
关键修改说明
- 收集完整文件信息:不再只记录文件名和大小,而是保存文件的创建时间和实例,为后续排序做准备
- 按重复键分组:用
文件名_文件大小作为分组键,确保只有完全同名且同大小的文件才被视为重复(避免同名但内容不同的文件被误删) - 按创建时间排序:每组内的文件按创建时间升序排列,确保最早创建的文件排在第一位
- 精准删除重复项:每组只保留第一个(最早的)文件,从第二个开始标记为删除
内容的提问来源于stack exchange,提问作者vvquiuno
相关产品推荐
相关产品推荐

