复制文件时保持保护范围

时间:2019-07-16 06:54:33

标签: google-apps-script google-sheets

我们在Googlesheets上有一个文件模板,该模板具有受保护的范围。我们希望复制该文件(file,进行复制),并为每个复制此文件的人保留受保护的范围,以便他们只能填充某些特定的单元格。问题是,每当有人制作副本时,他/她都会自动成为副本的所有者。这使得无法保护此副本不受此人的攻击(无论如何,所有者似乎都拥有对电子表格的完全访问权限)。有人可以解决此问题吗?

2 个答案:

答案 0 :(得分:0)

prevent commenters and viewers from copying or downloading the file有一个选项:

snippet from support.google.com: enter image description here

如果用户只看到文件而不是看到文件,请考虑让他们提交一个表格,该表格将自动填充所需的工作表范围。

答案 1 :(得分:0)

  • 您想让用户将Google云端硬盘上的电子表格复制到用户的Google云端硬盘。
    • 您的电子表格有几个受保护的范围。
    • 您的电子表格已与用户共享。
    • 用户没有与您共享自己的文件夹。
  • 您要为用户保护电子表格的范围。即,您要从受保护范围的编辑器中删除该用户。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解正确,那么这个答案如何?

问题:

在上述情况下,我认为以下几点是瓶颈。

  • 当您将Google云端硬盘中的电子表格复制到用户的Google云端硬盘时,必须由该用户的帐户来运行。
  • 当用户将电子表格复制到用户的Google云端硬盘时,受保护范围的所有者将成为该用户。因此,用户可以编辑受保护的范围。并且用户不能由用户将其从编辑器中删除。
    • 为了使用户不编辑受保护范围,需要更改电子表格的所有者,然后要求从受保护范围的编辑器中删除用户。
  • 在这里,还有2个问题。
    1. 为了将电子表格的所有者更改为您,它必须由用户帐户运行。
    2. 为了从受保护范围的编辑器中删除用户,它必须由您的帐户(而不是用户帐户)运行。

结果,为了使用脚本实现超出您的目标,该脚本需要由用户和您运行。

解决方法:

在我的解决方法中,使用2个脚本和2个帐户,可以达到上述目标。该解决方法的重点是使用2个Web Apps。请认为这只是几种解决方法之一。此解决方法的流程如下。

解决方法流程:

在此替代方法中,使用了两个Web应用程序,分别是Web应用程序“ A”和Web应用程序“ B”。

  1. 用户访问您部署的Web应用程序“ A”。
    • 在这种情况下,Web Apps是作为用户执行的。
  2. 运行Web应用程序“ A”时,
    1. 您的电子表格已从您的Google云端硬盘复制到用户的Google云端硬盘。
    2. 复制的电子表格的所有者是用户。因此,将所有者从用户更改为您。
    3. 访问脚本中的Web应用程序“ B”。
      • 在这种情况下,Web Apps是按您执行的。
    4. 运行Web应用程序“ B”时,
      1. 该用户已从受保护范围的编辑器中删除。

脚本的用法:

准备工作:

请创建2个独立脚本类型的项目。

  • 一个用于Web应用程序“ A”。
  • 另一个是针对Web应用“ B”的。

Web应用程序“ B”的独立脚本:

首先,请部署Web应用程序“ B”,因为Web应用程序“ A”的脚本中使用了Web应用程序“ B”的URL。请复制以下脚本并将Web Apps部署为Execute the app as: **Me**Who has access to the app: **Anyone, even anonymous**。并且,请复制此Web Apps“ B”的URL,并将其粘贴到Web Apps“ A”的脚本的url中。

function doGet(e) {
  var id = e.parameter.id;
  if (id) {
    var owner = Session.getActiveUser().getEmail();
    var ss = SpreadsheetApp.openById(id);
    var protectedRanges = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
    protectedRanges.forEach(function(p) {
      var removes = p.getEditors().filter(function(e) {return e.getEmail() != owner});
      p.removeEditors(removes);
    });
  }
  return ContentService.createTextOutput("Done");
}

Web应用程序“ A”的独立脚本:

请复制以下脚本并设置srcSpreadsheetIdurl的变量。在这种情况下,url是在Web应用程序“ B”处检索的URL。然后,请将Web Apps部署为Execute the app as: **User accessing the web app**Who has access to the app: **Anyone**。并且请复制此Web应用程序的URL“ A”。该URL供用户访问。

function doGet() {
  var srcSpreadsheetId = "###"; // Please set your source Spreadsheet ID.
  var url = "###"; // Please set the URL of Web Apps B.

  var srcSS = SpreadsheetApp.openById(srcSpreadsheetId);
  var dstSS = srcSS.copy(srcSS.getName());
  var file = DriveApp.getFileById(dstSS.getId()).setOwner(srcSS.getOwner().getEmail());
  var res = UrlFetchApp.fetch(url + "?id=" + file.getId(), {muteHttpExceptions: true}); // Here, run the script of Web Apps "B".
  return ContentService.createTextOutput(res.getContentText());
}

运行:

当用户使用上述脚本时,请使用户使用自己的浏览器访问Web应用程序“ A”的URL。当用户访问Web应用程序“ A”时,将显示Google的登录屏幕。登录Google后,将显示授权屏幕。通过授权,将运行Web应用程序“ A”的脚本,并由Web应用程序“ A”运行Web应用程序“ B”。授权只需要执行一次。

当用户浏览器中显示“完成”时,用户可以在根文件夹中看到复制的电子表格。

这样,您的Google云端硬盘中的电子表格便被复制到用户的Google云端硬盘中,并且电子表格的所有者也被修改为您,然后该用户从受保护范围的编辑器中删除。因此,用户将无法编辑受保护的范围。

如何部署Web Apps:

  1. 在脚本编辑器上,通过“发布”->“作为Web应用程序部署”打开一个对话框。
  2. 为“执行应用程序为:”选择“用户正在访问网络应用程序” “我”
  3. 为“谁有权访问该应用程序:”选择“任何人” “任何人,甚至匿名”
  4. 单击“部署”按钮作为新的“项目版本”。
  5. 自动打开“需要授权”对话框。
    1. 点击“查看权限”。
    2. 选择自己的帐户。
    3. 在“此应用未验证”中单击“高级”。
    4. 点击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 复制“当前Web应用程序URL:”。
    • 就像https://script.google.com/macros/s/#####/exec
  7. 单击“确定”。

重要提示:

  1. 修改Web应用程序的脚本后,请重新部署Web应用程序为新版本。这样,最新脚本将反映到Web Apps。如果即使修改了脚本也没有重新部署Web Apps,则不会使用最新的脚本。请注意这一点。
  2. 请确认您要复制用户的电子表格已与用户共享。

参考:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。