Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 复制文件时保持受保护的范围_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 复制文件时保持受保护的范围

Google apps script 复制文件时保持受保护的范围,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我们在Googlesheets上有一个文件模板,它有受保护的范围。我们希望复制此文件(文件,制作副本),并为制作此文件副本的每个人保留保护范围,以便他们只能填充某些特定单元格。问题是,每当有人制作副本时,他/她就会自动成为副本的所有者。这使得不可能针对此人保护此副本的范围(无论发生什么情况,所有者似乎都可以完全访问电子表格)。有人能解决这个问题吗?有一个选项: 如果用户不查看文件,而只填充它——考虑让它们提交一个表格,它将自动填充所需的页的范围。 < P> 有一个选项:>/P> 如果用户不查

我们在Googlesheets上有一个文件模板,它有受保护的范围。我们希望复制此文件(文件,制作副本),并为制作此文件副本的每个人保留保护范围,以便他们只能填充某些特定单元格。问题是,每当有人制作副本时,他/她就会自动成为副本的所有者。这使得不可能针对此人保护此副本的范围(无论发生什么情况,所有者似乎都可以完全访问电子表格)。有人能解决这个问题吗?

有一个选项:


如果用户不查看文件,而只填充它——考虑让它们提交一个表格,它将自动填充所需的页的范围。

< P> <强>有一个选项:>/P>

如果用户不查看文件,而只填充它——考虑让它们提交一个表格,它将自动填充所需的页的范围。

UL>
  • 您想让用户将谷歌硬盘上的电子表格复制到用户的谷歌硬盘上。
    • 您的电子表格有几个受保护的范围
    • 您的电子表格将与用户共享
    • 用户没有与您共享自己的文件夹
  • 您希望为用户保护电子表格的范围。也就是说,您希望将用户从受保护范围的编辑器中删除
  • 您希望使用谷歌应用程序脚本实现这一点
  • 如果我的理解是正确的,那么这个答案呢

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

    • 当您的Google Drive中的电子表格复制到用户的Google Drive时,它需要由用户的帐户运行
    • 当电子表格被复制到用户的Google Drive by user时,受保护范围的所有者将成为用户。因此,用户可以编辑受保护的范围。并且用户无法通过用户从编辑器中删除该用户。
      • 为了使用户不编辑受保护的范围,需要更改电子表格的所有者,然后将用户从受保护范围的编辑器中删除
    • 这里又出现了两个问题。
    • 为了将电子表格的所有者更改为您,需要由用户帐户运行该电子表格
    • 要将用户从受保护范围的编辑器中删除,必须由您的帐户运行,该帐户不是用户的帐户
    因此,为了使用脚本实现上述目标,需要用户和您运行脚本

    解决方法: 在我的解决方案中,使用2个脚本和2个帐户,它实现了上述目标。此解决方法的要点是使用2个Web应用程序。请将此视为几种变通方法之一。此解决方案的流程如下所示

    解决方案流程: 在此解决方案中,使用了两个Web应用程序,即Web应用程序“A”和Web应用程序“B”

  • 用户访问您部署的Web应用“A”。
    • 在这种情况下,Web应用程序以用户身份执行。
  • 运行Web应用程序“A”时,
  • 您的电子表格将从您的Google驱动器复制到用户的Google驱动器
  • 复制的电子表格的所有者是用户。因此,将所有者从用户更改为您
  • 访问脚本中的Web应用“B”。
    • 在这种情况下,Web应用程序将按您的身份执行。
  • 当Web应用程序“B”运行时,
  • 用户将从受保护范围的编辑器中删除
  • 脚本的使用: 准备: 请创建2个独立脚本类型的项目

    • 一种是网络应用程序“A”
    • 另一个是网络应用程序“B”
    Web应用程序“B”的独立脚本: 首先,请部署Web应用程序“B”,因为Web应用程序“B”的URL用于Web应用程序“A”的脚本。请复制以下脚本并将Web应用部署为
    以执行该应用为:*我**
    谁有权访问该应用:*任何人,甚至匿名**
    。请复制此Web应用程序“B”的URL,并将其粘贴到Web应用程序“A”脚本的
    URL

    Web应用程序“A”的独立脚本: 请复制以下脚本并设置
    srcSpreadsheetId
    url
    的变量。在本例中,
    url
    是在Web应用程序“B”中检索到的url。然后,请将Web应用部署为
    执行应用为:*访问Web应用的用户**
    和有权访问该应用的
    用户:*任何人**
    。请复制此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应用程序的URL“A”。当用户访问Web应用程序“A”时,将显示Google的登录屏幕。通过登录谷歌,将显示授权屏幕。通过授权,Web应用程序“A”的脚本运行,Web应用程序“B”由Web应用程序“A”运行。授权只需执行一次

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

    这样,您的Google驱动器中的电子表格将复制到用户的Google驱动器,电子表格的所有者将被修改为您,然后用户将从受保护范围的编辑器中删除。因此,用户无法编辑受保护的范围

    如何部署Web应用程序:
  • 在脚本编辑器上,通过“发布”->“部署为web应用”打开对话框
  • 选择“用户访问web应用程序”“我”作为“执行应用程序:”选项
  • 选择“任何人”“任何人,甚至匿名”“谁有权访问该应用:”
  • 单击“部署”按钮作为新的“项目版本”
  • 自动打开“需要授权”对话框。
  • 单击“R”
    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());
    }