Google 驱动器复制,团队驱动器(服务)到我的驱动器(用户)

Google Drive Copying, Team Drive (Service) to My Drive (User)

我正在尝试执行我认为会很简单的操作,但我在使用 Google API 时遇到了一些问题。我有两个 Google 凭据,一个来自服务帐户,另一个 Access/Refresh 来自已通过应用程序身份验证的用户。

服务帐户具有全域委派。

在服务帐户可以访问的团队驱动器(模板)上,我有一个文档,我想将其复制到用户的“我的驱动器”(root)中。我通过以下方式获得了文件夹的 ID:

String userRootId = userCredential.drive().files().get( "root" ).setFields( "id" ).execute().getId();

哪个 returns 正确的标识符。当我使用服务帐户复制文件时,我可以整天在团队驱动器中进行复制。当我将它复制到用户的驱动器时,我得到 "File not found: $userRootId"。

我假设这是因为服务帐户无法访问用户的“我的云端硬盘”。我怎样才能使这个操作工作?有人试过吗?

好的,所以我想出了一种适用于我的实现的方法。我有目标用户驱动器的 Access/Refresh 令牌。如果你没有那个,我不确定你如何让它发挥作用。步骤如下:

  1. 获取服务帐户根,使用:

    String serviceRootId = this.serviceManager.drive().files().get( "root" ).setFields( "id" ).execute().getId();
    
  2. 使用服务账号复制文件

    • 移除团队云端硬盘
    • 将父级设置为服务根 ID。这会将其从团队驱动器中删除,因此您实际上可以对其进行一些操作。
  3. 将文件共享给具有 "writer" 权限的用户(这消除了任何域问题)
  4. 现在,使用用户的令牌,复制您刚刚共享的文件
  5. 删除服务帐户与用户共享的文件。

这一切看起来有点傻,但鉴于 Google Drive 的当前限制,我认为这是唯一的方法。我本来希望允许具有域范围委派的服务帐户只复制该内容,但似乎没有。

如果有更好的方法,我很高兴学习,但现在这似乎可行。