如何高效搜索Google Drive子文件夹,批量校验用户视频上传状态
核心优化点
- 预扫描全量用户文件夹生成映射:仅遍历1次存储所有用户文件夹的根目录,提取邮箱与对应文件夹的映射关系,避免原代码每次循环都重复遍历根目录的冗余操作,这是最核心的性能提升点
- 批量写入表格数据:将所有需要更新的状态、链接先暂存在内存数组中,最后一次性写入表格范围,代替原代码逐行调用
setValue的高频API操作,可减少90%以上的接口耗时 - 新增round1文件夹内容校验:找到round1文件夹后额外判断文件夹内是否存在文件,避免空文件夹被误标记为已上传
- 自动跳过已处理行:仅处理状态未标记为
Subido的行,已处理过的记录不会重复查询Drive
完整优化代码
// 请将下面的MASTER_FOLDER_ID替换为你存储所有用户文件夹的根目录ID const MASTER_FOLDER_ID = "替换为你的根文件夹ID"; function main() { var s = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Unique"); let header = s.getRange(1, 1, 1, s.getLastColumn()).getValues()[0]; let colEmail = header.indexOf("Email"); let colState = header.indexOf("Archivo"); let colURL = header.indexOf("Link"); const FLAG = "Subido"; let nrows = s.getRange(1, colEmail+1, s.getLastRow()).getValues().filter(String).length; let data = s.getRange(1, 1, nrows, s.getLastColumn()).getValues(); // 跳过表头行 data.shift(); // 第一步:预扫描所有用户文件夹,生成邮箱->文件夹对象的映射,仅执行1次 const userFolderMap = {}; const masterFolder = DriveApp.getFolderById(MASTER_FOLDER_ID); const allUserFolders = masterFolder.getFolders(); while (allUserFolders.hasNext()) { let userFolder = allUserFolders.next(); let fname = userFolder.getName(); try { // 提取邮箱 let compare = fname.split('(')[1].split(')')[0]; userFolderMap[compare] = userFolder; } catch (e) { // 命名不符合规则的文件夹直接跳过 continue; } } // 第二步:遍历表格行,处理未标记的记录 const outputData = s.getRange(2, 1, nrows-1, s.getLastColumn()).getValues(); for (var i = 0; i < data.length; i++) { var row = data[i]; var generado = row[colState]; // 已经标记为已上传的直接跳过 if (generado == FLAG) continue; var folderName = row[colEmail]; // 从预先生成的映射里直接获取用户文件夹,无需重复遍历Drive let userFolder = userFolderMap[folderName]; if (!userFolder) { outputData[i][colState] = "未找到用户文件夹"; continue; } // 查找round1文件夹 let round1Folder = null; let innerFolders = userFolder.getFolders(); while (innerFolders.hasNext()) { let f = innerFolders.next(); if (f.getName() == "round1") { round1Folder = f; break; } } if (!round1Folder) { outputData[i][colState] = "No ha subido archivo por ahora"; continue; } // 新增判断:round1文件夹内是否存在上传的视频 let hasFiles = round1Folder.getFiles().hasNext(); if (!hasFiles) { outputData[i][colState] = "No ha subido archivo por ahora"; continue; } // 符合条件,写入链接和状态 outputData[i][colURL] = userFolder.getUrl(); outputData[i][colState] = FLAG; } // 第三步:一次性批量写入所有更新内容,仅调用1次API s.getRange(2, 1, outputData.length, outputData[0].length).setValues(outputData); }
使用说明
- 把代码里的
MASTER_FOLDER_ID替换为你存储所有用户文件夹的根目录ID - 直接运行
main函数即可,900条记录预计10-30秒即可跑完,不会出现超时问题 - 原代码的分批处理变量
iterador已经不需要,优化后的代码可一次性处理全量数据
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

