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

从Shared Drive导出文件夹信息时pageToken分页仅返回100项异常

分页失效核心原因

代码无法拉取全量条目是三个问题叠加导致的:

  • 调用Drive.Files.list时缺少corpora参数,Shared Drive场景下默认查询域不覆盖共享盘资源,返回的nextPageToken本身为无效值,循环执行一次就直接终止。
  • 循环内的Drive.Files.get调用没有全量传Shared Drive支持参数,访问共享盘根目录下的文件夹时会直接抛错,错误被catch块捕获后没有做重试或透传,直接终止分页流程。
  • 空结果判断写在do-while循环内部,一旦某一页返回空值就直接return退出整个函数,不会继续处理后续分页逻辑。
修复后可直接运行的代码
function getFolderURLs() {
  const TARGET_PARENT_FOLDER_ID = "132vqY8oyd6xKpnxxxxxxxxxxx"; // 替换为目标父文件夹ID
  let pageToken = null;
  const foldersArray = [["Folder Name", "Link", "Folder ID", "Filepath"]];
  const driveRequestArgs = {
    supportsAllDrives: true,
    includeItemsFromAllDrives: true,
    corpora: "allDrives", // 关键:指定查询域覆盖所有盘(含共享盘)
    pageSize: 100,
    q: `"${TARGET_PARENT_FOLDER_ID}" in parents and trashed = false and mimeType = "application/vnd.google-apps.folder"`
  };

  do {
    try {
      // 拉取当前分页的文件夹列表
      const listParams = {...driveRequestArgs, pageToken: pageToken};
      const res = Drive.Files.list(listParams);
      const currentPageFolders = res.items || [];
      
      // 处理当前页的文件夹
      currentPageFolders.forEach(folder => {
        const name = folder.title;
        const link = folder.alternateLink;
        const id = folder.id;
        // 拉取父文件夹信息,补全所有必填参数
        const folderMeta = Drive.Files.get(id, {
          supportsAllDrives: true,
          includeItemsFromAllDrives: true,
          fields: "parents(id)"
        });
        const parentId = folderMeta.parents[0].id;
        const parentMeta = Drive.Files.get(parentId, {
          supportsAllDrives: true,
          includeItemsFromAllDrives: true,
          fields: "title"
        });
        const filepath = `${parentMeta.title}/${name}`;
        foldersArray.push([name, link, id, filepath]);
        // 加短休眠避免触发接口限流
        Utilities.sleep(100);
      });

      // 更新下一页token
      pageToken = res.nextPageToken;
    } catch (err) {
      Logger.log('请求出错:%s,当前分页token:%s', err.message, pageToken);
      // 遇到限流错误等待1s后重试,其他错误直接抛出终止流程
      if (err.message.includes("429") || err.message.includes("Rate limit")) {
        Utilities.sleep(1000);
        continue;
      }
      throw err;
    }
  } while (pageToken);

  // 结果写入表格
  const ss = SpreadsheetApp.create('Clients Folder ID Listing');
  const sheet = ss.getActiveSheet();
  sheet.getRange(1,1,foldersArray.length, 4).setValues(foldersArray);
  Logger.log(`共拉取到${foldersArray.length - 1}个文件夹`);
}
注意事项
  • 首次运行需要授权Drive高级服务权限,确保在Apps Script编辑器的「服务」列表里已经添加了Drive API v2。
  • 如果共享盘文件夹层级极多,可以适当调大Utilities.sleep的等待时长,避免触发Google API的配额限制。
  • 当前代码默认拉取目标父文件夹下的直接子文件夹,和原始需求逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:24:20