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

如何高效搜索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);
}

使用说明

  1. 把代码里的MASTER_FOLDER_ID替换为你存储所有用户文件夹的根目录ID
  2. 直接运行main函数即可,900条记录预计10-30秒即可跑完,不会出现超时问题
  3. 原代码的分批处理变量iterador已经不需要,优化后的代码可一次性处理全量数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:08