You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:25