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

如何通过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的需求。


可行解决思路

核心是通过文件的父文件夹归属与权限来区分两类文件:

  • 他人在我共享文件夹内创建的文件,其至少有一个父文件夹是我所有且我拥有编辑/所有者权限(即我主动共享出去的文件夹)
  • 他人直接共享给我的文件,其所有父文件夹要么不属于我,要么是他人共享给我的文件夹

具体实现步骤

  1. 获取非自有文件列表:保留原有查询逻辑,获取所有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()
    )
    
  2. 校验父文件夹权限:对每个返回的文件,遍历其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
    
  3. 筛选目标文件:调用上述函数,过滤出符合条件的文件:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:43:27