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

如何用Google App Script对比表格与谷歌云盘文件ID并更新清单

谷歌云盘文件清单同步到Google Sheet修改方案

现有代码问题

  • 原有ID对比逻辑错误:逐行遍历单元格对比时,只要当前行ID和新ID不一致就覆盖当前行内容,完全没有实现「判断ID是否已存在」的逻辑
  • 没有追加逻辑:所有文件操作都是覆盖现有行,而非在表格末尾追加新增文件
  • 未处理状态列:没有针对新增文件写入对应状态标识的逻辑
  • 搜索规则存在语法错误:mimeType参数中多余的空格会导致搜索匹配失败

修改后完整代码

// 主入口函数,绑定到「更新列表」按钮即可
function syncDriveFilesToSheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  // 一次性读取所有现有文件ID,存入Set提升查询效率
  const existingIds = new Set();
  const lastRow = sheet.getLastRow();
  if (lastRow >= 2) {
    const idRange = sheet.getRange(2, 1, lastRow - 1, 1);
    const idValues = idRange.getValues();
    idValues.forEach(row => existingIds.add(row[0]));
  }
  // 替换为你要同步的根云盘文件夹ID
  const rootFolderId = "你的根文件夹ID";
  const rootFolder = DriveApp.getFolderById(rootFolderId);
  getChildFiles("", rootFolder, existingIds, sheet);
}

function getChildFiles(parentName, parent, existingIds, sheet) {
  // 修正mimeType参数中的多余空格
  const fileIter = parent.searchFiles("title contains 'completed' and title contains 'Verification Visit Direct Suppliers' and mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'"); 

  const childFolders = parent.getFolders();
  // 递归遍历子文件夹
  while (childFolders.hasNext()) {
    const childFolder = childFolders.next();
    const childFolderName = childFolder.getName();
    getChildFiles(
      parentName + ' |--> ' + childFolderName,
      childFolder,
      existingIds,
      sheet
    );   
  }

  // 遍历当前文件夹匹配的文件
  while (fileIter.hasNext()) {
    const file = fileIter.next();
    const fileName = file.getName();
    const fileID = file.getId();
    updateList(fileID, fileName, existingIds, sheet);
  }
} 

function updateList (fileId, fileName, existingIds, sheet) {
  // ID已存在则跳过,不修改原有数据
  if (existingIds.has(fileId)) return;
  // ID不存在则追加到表格最后一行
  const newRow = sheet.getLastRow() + 1;
  sheet.getRange(newRow, 1).setValue(fileId);
  sheet.getRange(newRow, 2).setValue(fileName);
  // 状态列写入「新文件」标识
  sheet.getRange(newRow, 3).setValue("新文件");
  // 把新增的ID加入Set,避免本次运行重复添加相同ID的文件
  existingIds.add(fileId);
}

使用说明

  • 先把代码中rootFolderId替换为你需要同步的谷歌云盘根文件夹的ID
  • 首次运行时,表格中导入的所有初始文件可以手动把第三列统一填充为「旧文件」即可
  • 后续每次点击「更新列表」按钮,只会追加云盘中新增的文件,原有旧文件的数据不会被修改,新增文件状态自动标记为「新文件」

修改点对应需求

  • 正常对比ID:一次性读取所有现有ID存入Set,避免逐行读取的性能问题和逻辑错误,判断准确率100%
  • 仅追加新增文件:ID已存在的文件直接跳过,只有新增文件会被写到表格末尾,原有数据完全保留
  • 状态列标记:新增文件写入时自动在第三列填充「新文件」,原有旧文件的状态不受影响

内容的提问来源于stack exchange,提问作者Vishnu Kumaran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:36:09