从GAS请求WebApp在GSheets中

问题描述

过去几天,我花了大量时间阅读有关我的主题的帖子,但找不到解决方案。

  1. A创建了一个简单的(独立的)WebApp,该WebApp修改了表格(此示例为appendRow)。该WebApp执行AS ME,每个人都可以访问:
function doGet(e) {
  Logger.log("Call WebApi ok");
  //var idSheet = e.parameter.idu;
  var idSheet = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";
  //Logger.log(idSheet);
  var ss = SpreadsheetApp.openById(idSheet);
  var sh = ss.getSheetByName('tab1');
  sh.appendRow(["Test"]);
}
  1. 我在Google表格中创建了(调用方)脚本。
function go() {
  var url = "https://script.google.com/a/AAAAA/macros/s/XXXXXXXXXXXXXXXX/exec";
  var params = {
    method: "get",headers: {"Authorization": "Bearer " + ScriptApp.getoAuthToken()},};
  UrlFetchApp.fetch(url,params);
}

调用方脚本在清单中具有以下范围:

"oauthScopes": ["https://www.googleapis.com/auth/drive","https://www.googleapis.com/auth/script.external_request","https://www.googleapis.com/auth/spreadsheets"]

->如果我使用与WebApp所有者不同的帐户执行调用者脚本,则该脚本不起作用。 我收到403错误

->但是,如果我在Chrome中打开Publish WebApp的URL,则可以使用!

您是否知道为什么表格中的调用者脚本不起作用?

感谢! 路易斯

解决方法

我测试了您的代码,并且以WebApp所有者或任何其他帐户身份执行调用程序时,调用程序脚本可以正常工作。唯一失败的情况是在隐身模式下执行时(某些Google Apps脚本函数在隐身模式下表现怪异)。

尝试以隐身方式执行它,或者由于您未使用 getOAuthToken ,请更改您的 go()函数,如下所示

function go() {
  UrlFetchApp.fetch("https://script.google.com/a/AAAAA/macros/s/XXXXXXXXXXXXXXXX/exec");
} 
,

如果您的WebApp是公开部署的,则无需提供授权标头即可提取WebApp,也不需要提供oauth范围。

但是,如果以隐身模式从脚本中调用WebApp,则不足以将其部署为“任何人都可以访问”。

您需要将其发布为“任何人,甚至是匿名的”。

更新

如果发布对“任何人,甚至匿名”都可以访问的WebApp对您来说是不可接受的解决方案,并且从浏览器中调用该WebApp,则您需要实现另一种方法。

要实施仅应为您的域授权的请求,最合适的解决方案是将service accountdomain-wide delegation结合使用。

这意味着:

  • 请勿创建WebApp
  • 在WebApp inot中执行当前包含的代码,以实现用户调用的脚本
  • 如果您创建服务帐户并允许域范围内的委派,则意味着您域中的任何用户都可以代表您执行请求(您已授权范围),而无需WebApp。
  • 要在Google Apps脚本中实现服务帐户,您需要使用apps-script-oauth2 library
  • 有关实现示例,请参见here