我编写了一个使用Domain-Wide Delegation of Authority(Oauth 2服务帐户)的Google Apps脚本功能,Google Drive API将用户(用户A)拥有的所有Google云端硬盘文件的所有权转让给另一个用户(用户B)然后添加第三个用户(用户C)作为所有文件的编辑器。
我这样做的原因是因为我想在员工离开公司时自动执行保存文件的过程,并为任何处理他们职责的人提供访问权限的过程。
Google为应用管理员提供Transfer Ownership tool,但无法通过脚本作为自动流程的一部分调用,只能通过管理控制台GUI进行调用。
我已经能够使用API成功执行此过程的每个步骤,但每个文件需要多次API调用。因此,如果用户拥有数百或数千个文件,则在其驱动器中,该功能可能会超过5分钟的脚本执行限制。
有没有办法合并或删除任何这些步骤,仍然可以实现相同的目标?
以下是我提出的流程:
以用户A身份进行身份验证
使用Files: list,列出用户A拥有且不在垃圾箱中的所有云端硬盘文件
遍历每个结果页面并将文件详细信息(id,title,parent等)存储在数组中
使用Files: insert创建一个根级“容器”文件夹,该文件夹最终将包含用户A的所有文件和文件夹,用于组织目的(称为“来自用户A(日期)”
循环遍历文件详细信息数组中的每个文件。如果文件的父级是其驱动器的根目录,请将父级设置为容器文件夹(使用Files: patch)。这会将他们拥有的所有文件移动到容器文件夹中,但保持子文件夹/文件的目录结构不变。
使用Permissions: insert,将用户B设置为容器文件夹的所有者。这使容器文件夹显示在用户B的驱动器的根目录中。但是,这不会将所有者权限级联到容器文件夹中包含的所有文件/文件夹。
使用Permissions: insert,将用户C设置为容器文件夹的编辑器,以便该文件夹显示在“与我共享”文件夹中。
再次遍历文件详细信息数组中的每个文件,并执行以下操作:
使用Permissions: insert,将用户B设置为每个文件的所有者
使用Permissions: insert,将用户C设置为编辑器(使用sendNotificationEmails = false参数,以便用户C不会充斥着成千上万的通知电子邮件)
作为用户B进行身份验证,再次遍历文件详细信息数组中的每个文件,并执行以下操作:
步骤8-1也会导致每个文件都显示在用户B的驱动器的根目录中(当您单击每个文件时,它会显示两个父文件夹:容器文件夹和My Drive根文件夹) ),现在从每个文件的parents数组中删除根文件夹(使用Files: patch)
使用Permissions: delete,从文件中删除用户A的权限(因为他们的帐户将被设置为“Vault Former Employee”,这会导致他们仍然显示在Google云端硬盘共享窗格中,但他们会不应该因为他们已经不在公司了。)