从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
相关产品推荐
相关产品推荐

