使用应用程序脚本 api 从另一个谷歌表访问谷歌表

时间:2021-03-12 21:24:44

标签: google-apps-script google-sheets

这是一个谷歌表格和应用脚本问题。我想要做的是有两张工作表,其中一张我将称为客户端工作表,另一张我将称之为服务器工作表。这些工作表中的每一个都有一个绑定的应用程序脚本。

服务器工作表的绑定应用脚本将部署为网络应用,以“用户访问网络应用”的身份执行,并设置为“拥有 Google 帐户的任何人”均可访问。

客户表将与作为查看者的多个不同用户共享,以便他们可以制作自己的副本。

每个用户都可以修改他们的客户工作表实例。然后,每个客户端工作表中的绑定脚本应用程序将调用绑定到服务器电子表格的 Web 应用程序,并向其传递一些数据。 Web 应用程序将访问它的电子表格,进行一些处理并将结果返回给调用脚本,调用脚本将使用结果修改它的客户表。

这里的目的是对用户隐藏服务器表和脚本的逻辑。以“用户访问 Web 应用程序”身份执行的原因是为了使用用户的 api 限制,因为如果服务器应用程序脚本以“我”身份执行,那么如果正在进行大量处理,这些限制可能会很快超出。

我在尝试从绑定到 Google 表格的应用脚本调用网络应用时遇到了授权问题(响应 401)。此外,如果以用户身份执行,我不确定 Web 应用程序脚本是否能够访问它的电子表格。

有没有办法使用谷歌表格和容器绑定脚本来做到这一点?或者有没有更好的方法来创建这个设置?

1 个答案:

答案 0 :(得分:0)

没有办法绕过“像我一样执行”

如果您使用“用户访问网络应用程序”,那么通过扩展,他们将需要访问“服务器”表。这是因为脚本代表用户。因此,如果用户无权访问工作表,那么脚本也不会。

作为“服务器”,如果您想限制呼叫者的访问权限,确实没有办法让服务器完成“工作”。

最小的例子

“服务器”脚本

function doGet() {
  return ContentService.createTextOutput("hello world!");
}

部署为“像我一样执行”“任何拥有 Google 帐户的人”

“客户端”脚本

function myFunction() {
  let webappURL = '[YOUR_DEPLOYMENT_URL]'
  let response = UrlFetchApp.fetch(webappURL)
  Logger.log(response.getContentText())
}

其输出 hello world!

配额

检查配额页面:

<块引用>

https://developers.google.com/apps-script/guides/services/quotas

您的 Web 应用程序在接听电话和阅读电子表格方面似乎没有限制。不过,同时执行的次数有限制,为 30,不过有些人报告说它只是低于这个数字。

另一种选择:将数据发布到网络

enter image description here

如果您只需要访问数据,那么您可以将电子表格数据发布为 .csv 文件,然后您的客户可以调用该文件:

function getData() {
  let sheetURL = '[LINK_GENERATED_BY_PUBLISH_DIALOG]'
  let response = UrlFetchApp.fetch(sheetURL)
  Logger.log(response.getContentText())
}

如果服务器表有这些值:

enter image description here

响应将是:

enter image description here

参考资料

相关问题