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

如何优化获取共享云端硬盘当年修改Google Docs的脚本以提速

优化Google Apps Script运行速度的方案

原脚本功能正常,但频繁的API交互和低效的文件遍历方式导致运行缓慢,以下是针对性的优化措施:

1. 批量写入Spreadsheet,减少API调用开销

原脚本每找到一个文件就执行一次setValues写入Sheets,每次API调用都有网络往返开销,累积后会大幅拖慢速度。优化方式是先把所有符合条件的文件数据收集到内存数组中,最后一次性写入Sheet。

2. 用Drive Advanced Service批量查询文件,替代递归遍历

递归遍历每个文件夹的方式需要多次发起Drive API请求,效率极低。改用Drive Advanced Service的files.list方法,通过查询条件一次性筛选出所有目标文件:

  • 筛选Google Docs类型文件
  • 限定最后修改时间在当年
  • 指定共享驱动器ID
  • 一次性获取所有需要的字段(文件名、修改时间、修改者、所属文件夹等)

3. 移除冗余的Sheet数据读取逻辑

原递归函数中每次都读取整个Sheet数据来构建folderFileNames,但主函数已经执行了clearContents()清空内容,此时Sheet中只有表头(或为空),这个去重逻辑完全多余,直接删除即可减少不必要的Sheets API调用。

4. 批量获取最后修改者信息,避免单独API调用

原脚本每个文件单独调用Drive.Revisions.list获取修改者,开销极大。在files.list的字段参数中直接指定lastModifyingUser(emailAddress),就能在批量查询时同步拿到修改者邮箱,无需额外API请求。

优化后的完整代码

function listGoogleDocsModifiedInCurrentYear() {
  const folderId = "SHARED FOLDER ID HERE"; 
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const currentYear = new Date().getFullYear();
  const startOfYear = new Date(currentYear, 0, 1).toISOString();
  const endOfYear = new Date(currentYear, 11, 31, 23, 59, 59).toISOString();
  
  // 获取或创建目标Sheet
  const sheetYear = getOrCreateSheet(spreadsheet, `${currentYear} Docs`);
  sheetYear.clearContents();
  
  // 设置表头(如果不存在)
  const headers = ["Last Modified", "Title", "Type", "Link", "Last Modifier", "Folder Name"];
  const headerRange = sheetYear.getRange(1, 1, 1, headers.length);
  if (headerRange.getValues()[0][0] !== headers[0]) {
    headerRange.setValues([headers]);
    headerRange.setFontWeight("bold").setHorizontalAlignment("left");
    sheetYear.setFrozenRows(1);
  }
  
  // 批量查询符合条件的文件
  const allFileData = [];
  let pageToken = null;
  do {
    const response = Drive.Files.list({
      q: `mimeType='application/vnd.google-apps.document' 
          and lastModifiedTime >= '${startOfYear}' 
          and lastModifiedTime <= '${endOfYear}' 
          and driveId='${folderId}' 
          and trashed=false`,
      fields: "nextPageToken, files(id, name, lastModifiedTime, lastModifyingUser, parents)",
      driveId: folderId,
      includeItemsFromAllDrives: true,
      supportsAllDrives: true,
      pageToken: pageToken
    });
    
    // 处理查询到的文件
    if (response.files && response.files.length > 0) {
      for (const file of response.files) {
        // 获取所属文件夹名称
        let folderName = "";
        if (file.parents && file.parents.length > 0) {
          const parentFolder = Drive.Files.get(file.parents[0], {
            supportsAllDrives: true,
            fields: "name"
          });
          folderName = parentFolder.name;
        }
        
        // 组装文件数据
        allFileData.push([
          new Date(file.lastModifiedTime),
          file.name,
          "Google Doc",
          `https://drive.google.com/file/d/${file.id}/view`,
          file.lastModifyingUser?.emailAddress || "No modifier",
          folderName
        ]);
      }
    }
    pageToken = response.nextPageToken;
  } while (pageToken);
  
  // 一次性写入所有数据
  if (allFileData.length > 0) {
    sheetYear.getRange(2, 1, allFileData.length, allFileData[0].length).setValues(allFileData);
  }
}

function getOrCreateSheet(spreadsheet, sheetName) {
  let sheet = spreadsheet.getSheetByName(sheetName);
  if (!sheet) {
    sheet = spreadsheet.insertSheet(sheetName);
  }
  return sheet;
}

额外优化提示

  • 确保已启用Drive Advanced Service:在脚本编辑器中依次点击「资源」→「高级Google服务」,找到「Drive API」并启用。
  • 如果共享驱动器文件数量极大(超过1000个),files.list会自动分页,代码中已处理分页逻辑,无需额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:25:35