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

如何通过Google Drive API判断文件归属及解决spaces参数异常?

Google Drive 变更同步脚本问题与解决方案

原脚本代码

$idChangeHistory = [] ;
do {
    $response = $service->changes->listChanges($startPageToken, [ 'spaces' => 'drive' ] ) ;
    if ( (! is_null($response->newStartPageToken))) {
        $savedStartPageToken = $response->newStartPageToken ;
        $historyRow['nextStartPageToken'] = $savedStartPageToken ;
        $updateHistory = true ;
    }

    // 收集变更ID:单个文件可能有多次变更,我们只关心文件是否变更,不统计变更次数
    foreach ($response->changes as $change) {
        $googleId = $change->fileId ;
        if (array_key_exists($googleId, $idChangeHistory))
            $idChangeHistory[$googleId]['count']++ ;
        else
            $idChangeHistory[$googleId] = [ 'count' => 1 ] ;
        $idChangeHistory[$googleId]['removed'] = $change->removed ; // 标记文件是否已从云端永久删除
    }
    $startPageToken = $response->nextPageToken ;
} while ($startPageToken) ;

foreach ($idChangeHistory as $googleId => $elements) {
    // 处理每个变更对象
    $fileObj = $service->files->get($googleId, [ 'fields' => 'id,name,mimeType,fileExtension,size,parents,createdTime,modifiedTime,trashed,md5Checksum' ] ) ;
    // ... 此处编写对象处理逻辑
}

问题描述

脚本整体运行正常,但偶尔会出现不属于自身Google Drive的「幽灵文件」:

  • 他人共享给我且近期打开过的文件
  • 我共享出去的非Drive原生文件(如Google Sheets)

原本以为通过spaces参数设为drive可以过滤这类文件,但实际并未生效。目前通过判断父文件夹值是否为null识别共享文件,但该方法不可靠。曾查阅文档提到共享文件与自有Drive文件的部分属性「未填充」,但实际发现这些属性大多为null,甚至driveId在两类文件中均为null。

核心疑问与解答

1. 如何可靠判断文件是自有Drive文件还是共享文件?

通过扩展files->get接口的fields参数,新增ownedByMe字段即可直接判断:

  • ownedByMe为true:文件是你自己拥有的自有Drive文件
  • ownedByMe为false:文件是共享文件

2. 如何区分共享文件是他人共享给我,还是我共享出去的?

结合owners和permissions字段分析:

  • 若owners[0]->emailAddress不是你的邮箱,但permissions中包含你的访问权限:说明是他人共享给你的文件
  • 若owners[0]->emailAddress是你的邮箱,且permissions中存在其他用户的访问权限:说明是你共享出去的文件

3. 为什么设置spaces=>'drive'仍会出现共享文件?

spaces=drive参数的作用是包含用户「Drive空间」内的所有文件,这不仅包括自己的My Drive文件,还涵盖了已添加到Drive的共享文件、近期访问过的共享文件等。它本身不具备过滤共享文件的功能,因此这类文件仍会出现在变更列表中。

解决方案更新

修改files->get的fields参数,新增关键归属字段后可实现可靠判断:

$fileObj = $service->files->get($googleId, [ 'fields' => 'id,name,mimeType,fileExtension,size,parents,createdTime,modifiedTime,trashed,ownedByMe,driveId,owners,permissions,md5Checksum' ] ) ;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:48:10