多个电子表格的批量更新授权

问题描述

我有大约 500 个电子表格使用同一个库。

当我授权它们时(一个一个,在创建时,经过大约一年的交叉) - https://www.googleapis.com/auth/script.container.ui 授权丢失了,因为它不需要。

现在需要它,用于新功能

有没有一种方法可以批量更新所有电子表格的授权,而不必逐个删除访问权限并重新允许?

电子表格有界脚本:

function mainFunction(e) { // with installable onEdit trigger
  myFunctionA(e);
  myFunctionB(e);
}

function myFunctionA(e) {
  myLibrary.myFunctionA(e);
}

...

库脚本:

function myFunctionA(e) {
  var htmlOutput = HtmlService
    .createHtmlOutput('<p>some text</p>')
            .setWidth(250)
            .setHeight(200);
  SpreadsheetApp.getUi().showModelessDialog(htmlOutput,'some title');
}
...

解决方法

TL;DR

您可以使用 Drive API 的权限资源来获取、更新、撤销和/或添加权限。

答案

可以使用 Drive v3 API 的权限资源 (see its documentation) 以编程方式更新文件权限。这允许您控制所有权限。我会尝试不做任何更改地调用 update,如果它不起作用,则使用 deletecreate 撤销并重新分配具有完全相同参数的权限。为此,您可以使用任何您喜欢的客户端库(official libraries,还有很多非官方的)。

您也可以使用 Google Apps 脚本来执行此操作。它不支持开箱即用,但您可以使用高级服务 (see Drive service documentation)。请注意,您需要将它们添加到项目中。此外,它还使用 Drive v2 API (see v2 permissions resource documentation),因此可能会发生一些变化。

还值得注意的是,您可能有数百个请求要处理,尤其是在一次性处理完所有文件的情况下。为了加快速度,我建议使用批量请求 (see Drive v3 performance guide here)。在 Apps Script 中这样做很痛苦,因为您必须手动发出 HTTP 请求。我建议使用本地应用程序,您可以在其中轻松使用库,并且在它被杀死之前没有最长时间。

可能的算法大纲

如果不改变任何参数的简单更新不起作用,我使用的算法将类似于:

  1. 获取所有需要更新的文件并保存其 ID。
  2. 对于每个文件,获取权限列表。如果有多个页面,请确保获取所有页面。确保您有此列表的备份。如果出现任何问题,您可能必须以编程方式恢复正确值的唯一方法。
  3. 准备要撤销和重新授予的权限列表。
    • 获取权限列表的副本。
    • 删除所有没有类型 writercommenterreader 的权限。
    • id 保存在列表中(待撤销)。
    • 将可写字段保存在要授予的列表中。
  4. 撤销权限并重新授予权限。

分步制作的想法是能够编写 5 个小脚本而不是 1 个大脚本,从而减少出错的可能性。它还允许您进行备份,这非常重要。

我会同时对所有文件执行步骤 1-3,因此在开始进行更改之前,您需要准备好所有必要的数据。在第 4 步,我会通过许可撤销并重新授予他们许可。

参考文献

PD:您提出这个问题是一种解决方法,但我想留下答案以供将来参考。