如何用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
相关产品推荐
相关产品推荐

