如何通过Google Drive API筛选本人Drive中非自有且非外部共享的文件
如何用Google Drive API筛选他人在我共享文件夹内创建的文件(排除他人共享给我的文件)
我想用Python结合Google Drive API,找出自己Drive里由其他账户在我共享的子文件夹内创建的文件,但要排除那些其他账户直接共享给我的文件。目前使用的筛选代码如下:
response = ( service.files() .list( pageSize=100, fields="nextPageToken, files(*)", includeItemsFromAllDrives=False, supportsAllDrives=False, q=f"not '{ACCOUNTNAME}' in owners", pageToken=page_token, ) .execute() )
这段代码能返回非我所有的文件,但会同时包含他人直接共享给我的文件。对比两种场景下的返回字段,未找到可区分二者的一致规律。查Drive API文档可知,includeItemsFromAllDrives和supportsAllDrives参数仅用于区分个人Drive和组织共享驱动器,无法解决此问题。之前找到的相关讨论仅限制在根目录搜索,不符合我搜索整个Drive的需求。
可行解决思路
核心是通过文件的父文件夹归属与权限来区分两类文件:
- 他人在我共享文件夹内创建的文件,其至少有一个父文件夹是我所有且我拥有编辑/所有者权限(即我主动共享出去的文件夹)
- 他人直接共享给我的文件,其所有父文件夹要么不属于我,要么是他人共享给我的文件夹
具体实现步骤
- 获取非自有文件列表:保留原有查询逻辑,获取所有
not '{ACCOUNTNAME}' in owners的文件,建议在fields中提前包含parents字段,减少后续API调用:response = ( service.files() .list( pageSize=100, fields="nextPageToken, files(id, name, owners, parents)", includeItemsFromAllDrives=False, supportsAllDrives=False, q=f"not '{ACCOUNTNAME}' in owners and trashed=false", pageToken=page_token, ) .execute() ) - 校验父文件夹权限:对每个返回的文件,遍历其
parents列表,查询父文件夹的所有者和权限信息:def is_file_in_my_shared_folder(file, service, account_name): if not file.get('parents'): return False for folder_id in file['parents']: folder = service.files().get( fileId=folder_id, fields='owners, permissions' ).execute() # 检查文件夹是否由我所有 folder_owners = [owner['emailAddress'] for owner in folder['owners']] if account_name not in folder_owners: continue # 检查我对该文件夹是否有编辑/所有者权限 for perm in folder['permissions']: if perm['emailAddress'] == account_name and perm['role'] in ['owner', 'writer']: return True return False - 筛选目标文件:调用上述函数,过滤出符合条件的文件:
target_files = [] for file in response.get('files', []): if is_file_in_my_shared_folder(file, service, ACCOUNTNAME): target_files.append(file)
优化提示
- 批量处理父文件夹查询:可以用
service.files().getBatch()来批量获取多个文件夹信息,减少API请求次数,提升效率 - 缓存已查询的文件夹信息:避免重复查询同一个文件夹的权限,进一步优化性能
内容的提问来源于stack exchange,提问作者ShawnC
相关产品推荐
相关产品推荐

