8

我必须使用谷歌电子表格。我正在使用一些模板电子表格,它们都包含很多指向其他电子表格的链接。问题是,每当我复制模板电子表格以使用大多数链接(使用 importrange 函数创建)时,都需要我再次授予它们访问权限 在此处输入图像描述

我想做的是制作一个脚本,让我可以一键导入所有链接。我试图制作一个应用程序脚本,但我找不到任何使用“允许访问”按钮访问文本框的方法,以便我可以制作我的脚本。我的问题是:有没有办法以编程方式访问“允许访问”按钮?或者有没有其他方法可以解决我的问题并允许一键访问所有链接?

4

5 回答 5

4

我不得不面对同样的问题。避免此允许访问 importrange 的唯一方法是将链接的文档(importrange 的目标)公开,或通过链接共享,这也是公开的,但如果读者有链接。那么就不需要授权importrange。如果这两个文件来自同一所有者,谷歌应该避免这种授权访问,我不明白这里的安全漏洞在哪里。

于 2015-10-03T20:18:57.020 回答
3

好吧,我所做的并没有真正解决问题,但有很大帮助。我将我想要的所有电子表格的范围导入到第三个电子表格中。然后我将该范围导入我的模型。因此,当创建一个新文件时,您只需要允许访问一个电子表格而不是许多。

正如我所说,它不能解决问题,但它是一个很好的解决方法。

于 2015-06-10T19:55:50.650 回答
1

不,您不能以编程方式访问“允许访问”按钮,因为这将是系统中的安全漏洞。

我认为授予访问权限的最佳方法是遍历电子表格的 id 列表并像这样打开它们:

var idList = [...]; // here are all the ids

for (var i = 0; i < idList.length; i++) {
    SpreadsheetApp.openById(idList[i]); // trying to open the spreadsheet by id
}

这样,应要求用户授予对脚本的访问权限以自动访问每个电子表格。

然后您应该能够从脚本而不是从电子表格本身导入范围。特别是使用电子表格和工作类以及getRange()方法。

于 2014-08-07T10:20:35.487 回答
0

对“导入”文档的访问似乎是由创建“宿主”文档(而不是模板)时导入文档的共享设置决定的。

例如:

  1. 模板 A 使用 importrange() 包含来自文档 B 的数据
  2. 文档 B 上的共享设置为“Internet 上知道此链接的任何人都可以查看”以外的任何内容
  3. 模板 A 用于创建文档 C

文档 C 将无法从文档 B 导入内容。您必须手动允许访问。

如果在手动允许访问之前关闭文档 C,将 B 上的共享更改为“Internet 上的任何人都可以通过此链接查看”,然后重新打开文档 C,它仍然无法从 B 导入数据。 当文档 C 被创建它无权访问要导入的文档 B,因此除非您手动授予访问权限,否则它将永远无法访问。

另一方面:

  1. 模板 A 使用 importrange() 包含来自文档 B 的数据
  2. 文档 B 上的共享设置为“Internet 上知道此链接的任何人都可以查看”
  3. 模板 A 用于创建文档 C

现在文档 C 可以毫无问题地从文档 B 中导入数据。

如果您现在将文档 B 上的共享更改为“受限”,文档 C 将继续导入数据。与第一种情况类似,当创建文档 C 时,它可以访问文档 B,因此它始终可以访问。

importrange() 在创建主文档时对导入的文档使用共享。

基于此和 Adrian Mole 提供的代码,我设置了一个从模板创建文档的工作流程,如下所示:

  1. 在 Google Apps 脚本中运行包含的文档 ID 列表并将共享设置为公开:

    var idList = { "doc-id-1", "doc-id-2", "doc-id-3", [...] };
    for( id=0; id < idList.length; id++ ) {
      DriveApp.getFileById(id).setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);
    }
    
  2. 从模板创建多个文档

  3. 回到 Google Apps 脚本使用类似的代码来关闭对所有导入文档的访问:

     var idList = { "doc-id-1", "doc-id-2", "doc-id-3", [...] };
     for( id=0; id < idList.length; id++ ) {
       DriveApp.getFileById(id).setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.EDIT);
     }
    

我创建的文档都可以正确导入数据(每个都包含多个 importrange() 函数),但是当我完成后,所有导入的文档都会再次得到完全保护。

请注意,在从模板创建文档的第 1 步和第 3 步之间,导入的文档都可以公开搜索并在 Internet 上可用。理论上,恶意人员可以在自己的电子表格中创建 importrange() 来导入您的文档,并且在执行第 3 步并再次“锁定”您的文档后,他们将继续拥有该访问权限。

于 2021-04-24T14:43:10.923 回答
0

基本上,您只需要在输入importrange功能之前通过链接访问任何人。它应该如下所示:

DriveApp.getFileById(id).setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);

然后再次将其设为私有。在这种情况下,无需单击授予访问按钮即可importrange立即工作。

DriveApp.getFileById(id).setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.EDIT);

您可能还需要flush().

于 2020-09-29T13:49:02.987 回答