Google Drive API v3:service.files().list 未返回所有文件夹

xdl*_*xdl 3 python google-drive-api google-drive-shared-drive

我正在根据 Google Team Drive 文件的内容实现一个基于树的查看器;为此,我遵循此处给出的建议:How do I search sub-folders and sub-sub-folders in Google Drive? ,即执行 2 个 API 调用 - 一个用于获取所有文件夹,另一个用于获取这些文件夹的直接子级的所有文件。

但是,我注意到获取所有文件夹的调用并未返回所有文件夹:


res = service.files().list(
corpora='teamDrive',
pageSize=1000,
supportsTeamDrives=True,
includeTeamDriveItems=True,
teamDriveId=TEAM_DRIVE_ID,
fields='files(id,parents,name,mimeType)',
q="mimeType='application/vnd.google-apps.folder' and trashed=false"
).execute()

len(res['files'])
# 460

Run Code Online (Sandbox Code Playgroud)

在这里,文件不应该超过pageSize,但我肯定从这个结果中丢失了大量文件夹,例如 id 为 的特定文件夹specified_id


len([x for x in res['files'] if x['id'] == specified_id])
# 0

Run Code Online (Sandbox Code Playgroud)

我不认为这是权限问题,因为我可以正常获取此文件:


specific_file = service.files().get(
    fileId=specified_id,
    supportsTeamDrives=True,
).execute()

specific_file

{'id': '...',
 'kind': 'drive#file',
 'mimeType': 'application/vnd.google-apps.folder',
 'name': '...',
 'teamDriveId': '...'}

Run Code Online (Sandbox Code Playgroud)

为了实现在一个 API 请求中获取 Google(团队)云端硬盘中的所有文件夹的目标,有关尝试其他事情的任何其他提示将不胜感激。

pin*_*yid 5

您的代码中有一个错误。您的代码假设如果您有(比如说)500 个文件夹,则通过给出 a pageSize=1000,所有 500 个文件夹将包含在单个 list.execute 中。云端硬盘不是这样工作的。

pageSize 只是最大值,因此最多会包含 1000 个文件夹。API 不保证包含最多 1000 个的所有文件夹。您需要迭代请求中的list.execute包含内容,直到。pageTokennextPageToken==null