使用 Google 驱动器 API 转移用户所有文件所有权的最有效过程
Most efficient process for transferring ownership of all of a user's files using the Google Drive API
我编写了一个 Google Apps 脚本函数,该函数使用 Domain-Wide Delegation of Authority (Oauth 2 service account), and the Google Drive API 将一个用户(用户 A)拥有的所有 Google 云端硬盘文件的所有权转移给另一个用户(用户 B) ),然后添加第三个用户(用户 C)作为所有文件的编辑者。
我这样做的原因是因为我想在员工离开公司时自动化保存文件的过程,并为将要处理其职责的任何人提供对这些文件的访问权限。
- 用户A是离职人员,
- 用户 B 是一个 Google 帐户,专门用于存档
来自公司离职人员的文件,
- 用户C是负责接管用户A的人
职责。
Google 为 Apps 管理员提供了一个 Transfer Ownership tool,但它不能作为自动化过程的一部分通过脚本调用,只能通过管理控制台 GUI 调用。
我已经能够使用 API 成功执行此过程的每个步骤,但每个文件需要多次 API 调用。因此,如果用户拥有数百或数千个文件,在他们的 Drive 中,该函数可能会超过 5 分钟的脚本执行限制。
有没有一种方法可以组合或删除这些步骤中的任何一个并仍然实现相同的目标?
这是我想出的过程:
验证为用户 A
使用 Files: list,列出用户 A 的所有云端硬盘文件,这些文件属于他们所有且不在回收站中
遍历每一页结果并将文件详细信息(id、标题、parents 等)存储在数组中
使用 Files: insert,创建一个 root-level“容器”文件夹,最终将包含用户 A 的所有文件和文件夹,用于组织目的(称为“来自用户 A (日期)"
遍历文件详细信息数组中的每个文件。如果文件的 parent 是其驱动器的根目录,请将 parent 设置为容器文件夹(使用 Files: patch)。这会将他们拥有的所有文件移动到容器文件夹中,但会保持 subfolders/files 的目录结构不变。
使用Permissions: insert,将用户 B 设置为容器文件夹的所有者。这使得容器文件夹出现在用户 B 的驱动器的根目录中。但是,这不会将所有者权限级联到容器文件夹中包含的所有 files/folders。
使用 Permissions: insert,将用户 C 设置为容器文件夹的编辑者,以便该文件夹显示在他们的 "Shared with me" 文件夹中。
再次遍历文件详细信息数组中的每个文件并:
使用Permissions: insert,将用户 B 设置为每个文件的所有者
使用 Permissions: insert,将用户 C 设置为编辑者(使用 sendNotificationEmails=false 参数,这样用户 C 就不会被成千上万的通知电子邮件淹没)
以用户 B 身份验证,再次遍历文件详细信息数组中的每个文件并:
步骤 8-1 使每个文件也显示在用户 B 的驱动器的根目录中(当您单击每个文件时,它会显示两个 parent 文件夹:两个容器文件夹和 My Drive 根文件夹),所以现在从每个文件的 parents 数组中删除根文件夹(使用 Files: patch)
使用Permissions: delete,从文件中删除用户 A 的权限(因为他们的帐户将被设置为“Vault 离职员工”,这导致他们仍然显示在 Google Drive Sharing 窗格,但它们不应该出现,因为它们已不在公司。
Google 刚刚发布了一个 Data Transfer API 来完成大部分工作。它不处理与用户 C 相关的部分,但它删除了大部分耗时最长的步骤 运行。
我编写了一个 Google Apps 脚本函数,该函数使用 Domain-Wide Delegation of Authority (Oauth 2 service account), and the Google Drive API 将一个用户(用户 A)拥有的所有 Google 云端硬盘文件的所有权转移给另一个用户(用户 B) ),然后添加第三个用户(用户 C)作为所有文件的编辑者。
我这样做的原因是因为我想在员工离开公司时自动化保存文件的过程,并为将要处理其职责的任何人提供对这些文件的访问权限。
- 用户A是离职人员,
- 用户 B 是一个 Google 帐户,专门用于存档 来自公司离职人员的文件,
- 用户C是负责接管用户A的人 职责。
Google 为 Apps 管理员提供了一个 Transfer Ownership tool,但它不能作为自动化过程的一部分通过脚本调用,只能通过管理控制台 GUI 调用。
我已经能够使用 API 成功执行此过程的每个步骤,但每个文件需要多次 API 调用。因此,如果用户拥有数百或数千个文件,在他们的 Drive 中,该函数可能会超过 5 分钟的脚本执行限制。
有没有一种方法可以组合或删除这些步骤中的任何一个并仍然实现相同的目标?
这是我想出的过程:
验证为用户 A
使用 Files: list,列出用户 A 的所有云端硬盘文件,这些文件属于他们所有且不在回收站中
遍历每一页结果并将文件详细信息(id、标题、parents 等)存储在数组中
使用 Files: insert,创建一个 root-level“容器”文件夹,最终将包含用户 A 的所有文件和文件夹,用于组织目的(称为“来自用户 A (日期)"
遍历文件详细信息数组中的每个文件。如果文件的 parent 是其驱动器的根目录,请将 parent 设置为容器文件夹(使用 Files: patch)。这会将他们拥有的所有文件移动到容器文件夹中,但会保持 subfolders/files 的目录结构不变。
使用Permissions: insert,将用户 B 设置为容器文件夹的所有者。这使得容器文件夹出现在用户 B 的驱动器的根目录中。但是,这不会将所有者权限级联到容器文件夹中包含的所有 files/folders。
使用 Permissions: insert,将用户 C 设置为容器文件夹的编辑者,以便该文件夹显示在他们的 "Shared with me" 文件夹中。
再次遍历文件详细信息数组中的每个文件并:
使用Permissions: insert,将用户 B 设置为每个文件的所有者
使用 Permissions: insert,将用户 C 设置为编辑者(使用 sendNotificationEmails=false 参数,这样用户 C 就不会被成千上万的通知电子邮件淹没)
以用户 B 身份验证,再次遍历文件详细信息数组中的每个文件并:
步骤 8-1 使每个文件也显示在用户 B 的驱动器的根目录中(当您单击每个文件时,它会显示两个 parent 文件夹:两个容器文件夹和 My Drive 根文件夹),所以现在从每个文件的 parents 数组中删除根文件夹(使用 Files: patch)
使用Permissions: delete,从文件中删除用户 A 的权限(因为他们的帐户将被设置为“Vault 离职员工”,这导致他们仍然显示在 Google Drive Sharing 窗格,但它们不应该出现,因为它们已不在公司。
Google 刚刚发布了一个 Data Transfer API 来完成大部分工作。它不处理与用户 C 相关的部分,但它删除了大部分耗时最长的步骤 运行。