问题描述
过去几天,我花了大量时间阅读有关我的主题的帖子,但找不到解决方案。
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"]);
}
- 我在Google表格中创建了(调用方)脚本。
调用方脚本在清单中具有以下范围:
"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 account与domain-wide delegation结合使用。
这意味着:
- 请勿创建WebApp
- 在WebApp inot中执行当前包含的代码,以实现用户调用的脚本
- 如果您创建服务帐户并允许域范围内的委派,则意味着您域中的任何用户都可以代表您执行请求(您已授权范围),而无需WebApp。
- 要在Google Apps脚本中实现服务帐户,您需要使用apps-script-oauth2 library
- 有关实现示例,请参见here