如何转让 Google 电子表格的所有权并成为查看者

How to transfer ownership of a Google spreadsheet and to be a viewer

是否可以将所有者权限移交给其他用户并使用应用程序脚本将前所有者更改为查看者?

将所有者权限转让给其他用户并成为查看者

我正在尝试制作一个脚本,将所有者移交给另一个用户并将前所有者更改为查看者或禁止前所有者编辑 Google 电子表格。问题是脚本是前所有者 运行 并且脚本无法删除前所有者的编辑权限。

我试过的

我尝试了 setViewer()、sheet.protect() 和 contentRestictions.readOnly,但它们都不是一个可行的解决方案

  1. removeEditors()setViewer()

setViewer() 对编辑器的方法没有任何效果,并且在将 removeEditors() 应用于前所有者之后(当然是在更改所有者之后)脚本无法执行 setViewer() 因为它不有权限了。

  1. sheet.protect()

该方法为 运行 脚本的所有者和用户授予编辑受保护范围的权限。不符合资格。

  1. contentRestrictions.readOnly

编辑器可以解除限制。不可行。

我最近发现 contentRestrictions.readOnly 已实施到 Google 驱动器 API。虽然我认为这是限制编辑者修改文件内容的好方法,但我意识到即使文件被所有者锁定,作为编辑者的用户也可以通过单击“解锁”文件。

我不明白这个属性的用途,如果限制可以由编辑解决。 docs中的解释说,我们可以使用这个字段来防止修改标题、上传新修订版和添加评论。但是,编辑者很容易解锁文件,而浏览者无论如何也无法修改文件。

我在下面测试了我自己的文件,只有我可以访问该文件。

代码:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var file = DriveApp.getFileById(ssId);
  var owner = file.getOwner();

  var new_owner = 'new_owner@gmail.com';
  file.setOwner(new_owner);
  file.removeEditor(owner);    // After this line, you can't view/edit the file
  Logger.log(file.getOwner()); // Will fail
}

测试期间注意事项:

  • 运行 removeEditor 在将另一个用户设置为所有者后,您自己甚至会根据测试限制您查看该文件
  • 拥有者免疫removeEditor(不能被移除)
  • 只有所有者可以将所有权设置给其他用户

请看类似的question that has an answer pointing to this, it will give you some insights regarding Google Apps Domain-Wide Delegation of Authority

我相信你的现状和你的目标如下。

  • 您有一个 Google 电子表格和一个脚本。你是它们的主人。
    • 根据您的脚本,该脚本是电子表格的容器绑定脚本。
  • 当你运行脚本时,你想将电子表格的所有者转移给其他用户。
  • 所有者转让后,您想保留对电子表格的权限,因为reader不是作者。

修改点:

  • 在这种情况下,我认为驱动器API的“权限:插入”和“权限:更新”方法(在这种情况下,驱动器API与高级Google 服务。)也许能够用于实现您的目标。
  • 我的求婚脚本流程如下。
  1. 为您检索权限 ID。
    • 在当前阶段,您是文件的所有者。
  2. 转移文件的所有者(在您的情况下,它是电子表格。)。
    • 在当前阶段,您不是所有者。3.将您的权限从 writer 更新为 reader
  3. 将所有者传输的电子表格创建到根文件夹的快捷方式。
    • 因为,当所有者被转移时,可以在“与我共享”的文件夹中看到该文件。
    • 如果不需要创建快捷方式,请删除此部分。

这个流程反映到一个脚本中,变成如下。

修改后的脚本:

请将以下脚本复制并粘贴到 Google 电子表格的容器绑定脚本的脚本编辑器中。并且,在您使用此脚本之前,please enable Drive API at Advanced Google services.

function myFunction() {
  const email = "###"; // Please set the email. The owner of the file is transferred to this email.

  const fileId = SpreadsheetApp.getActive().getId();
  
  // 1. Retrieve the permission ID for you. In the current stage, you are the owner of the file.
  const permissionId = Drive.Permissions.list(fileId).items[0].id;

  // 2. Transfer the owner of file (in your case, it's Spreadsheet.). In the current stage, you are not the owner.
  Drive.Permissions.insert({role: "owner", type: "user", value: email}, fileId, {sendNotificationEmail: false, moveToNewOwnersRoot: true});

  // 3. Update your permission from `writer` to `reader`.
  Drive.Permissions.update({role: "reader"}, fileId, permissionId);

  // 4. Create a shortcut of the owner-transferred Spreadsheet to the root folder. Because, when the owner is transferred, the file can be seen at the folder of "Shared with me".
  Drive.Files.insert({mimeType: MimeType.SHORTCUT, shortcutDetails: {targetId: fileId}}, null);
}

注:

  • 当上述脚本为 运行 时,电子表格的所有者更改为 email。你的许可变成了reader。所以在这种情况下,您看不到Spreadsheet 的脚本。请注意这一点。
  • 在这种情况下,更改电子表格的所有者后,您将无法编辑电子表格和脚本。所以请注意这一点。

参考文献: