【发布时间】:2015-11-27 11:04:41
【问题描述】:
我编写了一个 Google Apps 脚本函数,它使用 Domain-Wide Delegation of Authority(Oauth 2 服务帐户)和 Google Drive API 将用户(用户 A)拥有的所有 Google 云端硬盘文件的所有权转移给另一个用户(用户 B ),然后添加第三个用户(用户 C)作为所有文件的编辑器。
我这样做的原因是因为我想在员工离开公司时自动执行保存文件的过程,并为负责其职责的任何人提供访问这些文件的权限。
- 用户 A 是离开公司的人,
- 用户 B 是一个专门用于存档的 Google 帐户 离开公司的人的文件,
- 用户 C 是负责接管用户 A 的人 责任。
Google 为应用程序管理员提供了Transfer Ownership tool,但它不能作为自动化过程的一部分通过脚本调用,只能通过管理控制台 GUI 调用。
我已经能够使用 API 成功执行此过程的每个步骤,但每个文件需要多次 API 调用。因此,如果用户在其 Drive 中拥有数百或数千个文件,则该功能可能会超过 5 分钟的脚本执行限制。
有没有一种方法可以组合或删除这些步骤中的任何一个,并且仍能实现相同的目标?
这是我想出的过程:
以用户 A 身份验证
使用 Files: list,列出用户 A 拥有且不在回收站中的所有云端硬盘文件
遍历结果的每一页并将文件详细信息(id、标题、父母等)存储在一个数组中
-
使用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 的驱动器的根目录中(当您单击每个文件时,它会显示两个父文件夹:容器文件夹和我的驱动器根文件夹),所以现在从每个文件的父数组中删除根文件夹(使用Files: patch)
使用 Permissions: delete,从文件中删除用户 A 的权限(因为他们的帐户将被设置为“保险柜前雇员”,这会导致他们仍然显示在 Google 云端硬盘共享窗格中,但他们不应该t 因为他们不再在公司工作)。
【问题讨论】:
-
我一直在使用免费的 GAS,虽然我必须让他们打开一个已登录的 Google 帐户的已发布页面,这对你有用吗,让他们在何时登录此页面离开公司?同样这样,它永远不会命中 API 调用,因为它只是 GAS 脚本,没有高级服务,并且不会运行到执行时间,因为它从 HTMLPage 发出数百次调用,每个调用都有自己的计时器。
-
为了效率和安全,我们不能依赖用户做任何事情。作为管理员,我已经建立了一个完整的自动化流程来处理离开公司的员工的“离职”,其中包括:更改密码、转移到不强制执行 2SV 的某个子组织、转移日历的所有权事件、谷歌网站、分配谷歌保险柜许可证、移动到保险柜子组织、暂停用户、从组中删除、从 GAL 中删除、创建电子邮件转发组等。
-
所以除了传输云端硬盘文件外,整个过程都是自动化的,所以我的一个团队成员实际上必须以用户身份登录,做一个谷歌外卖(因为谷歌传输工具失败了很多,离开到处都是“孤立”文件),然后使用 GUI 中的传输工具,然后手动触发其余步骤。无论如何,我很好奇你是如何做到这一点的 - 它是使用 HTMLservice 完成的吗?如果不是 Drive API,它用什么来与文件交互?
标签: performance google-apps-script permissions google-api google-drive-api