尝试将Google Apps脚本发出的JSON请求作为发出请求的用户。经过一段时间的思考,我意识到这不起作用,因为服务脚本需要被授权以调用他的用户身份运行,因此调用脚本必须添加一些授权信息,而不是,我不知道如何添加该信息(这实际上是我的问题:要添加到http请求的哪些信息,以及从哪里获取它)。
但是,当我从浏览器中调用该服务器时,它的工作原理是因为浏览器(我在其中登录了我的Google帐户)在http请求中发送了正确的信息以证明它已被授权。
这个问题在某种程度上与问题How to use Google Apps Script ContentService as a REST server有关,但那里给出的答案正是我不想要的:调用的JSON服务器不应该在我的帐户下运行,而是在调用用户的帐户下使用用户资源(scriptdb,drive,...)。 所以问题是:如何从一个脚本中提供从Google帐户到另一个脚本的信息,以便其他脚本可以在该帐户中运行?我知道使用gas-libraries解决了这个问题,但我希望将它作为JSON客户端/服务器(主要用于解耦依赖关系)。要添加一些代码(以保持Stack Overflow-spirit运行),我的客户端:
var scriptUrl="https://script.google.com/macros/s/paperlapapp1231231/exec";
function callIt (nm, args) {
var a=[nm];
for (x in args) {
a.push(args[x]);
}
return Utilities.jsonParse(UrlFetchApp.fetch(scriptUrl+"?args="
+encodeURIComponent(Utilities.jsonStringify(a))).getContentText());
}
function testFunction (p1, p2, p3) { // this is the proxy
return callIt ("testFunction", arguments);
}
// Testroutine
function callTest() {
var r=testFunction (9, "XXXlala", {"dudu":1, "dada":"xxx"});
Logger.log ("r="+Utilities.jsonStringify(r));
}
我的服务器:
function doGet(request) {
var ret=null;
try {
Logger.log ("I got called with "+JSON.stringify(request));
var args=JSON.parse(decodeURIComponent (request.parameters.args));
ret=ContentService.createTextOutput(
JSON.stringify(this[args.shift()].apply (this, args)))
.setMimeType(ContentService.MimeType.JSON);
}
catch (e) {
ret=ContentService.createTextOutput(JSON.stringify(e))
.setMimeType(ContentService.MimeType.JSON);
}
return ret;
}
function testFunction (p1, p2, p3) { // this is the implementation
var s="testing called p1="+p1+", p2="+p2+", p3="+p3;
Logger.log (s);
return {testingResult:s};
}
修改
制定了解决方案,但需要Chrome扩展程序和中间代理服务器。请参阅https://bitbucket.org/pbhd/gas-rest-server-as-calling-user
上的代码答案 0 :(得分:1)
编辑:以前这是不可能的,正如下面的答案所反映的那样。
但是,Google现在允许这样做,请参阅Execution API
https://developers.google.com/apps-script/execution/rest/v1/scripts/run
无法通过Google Apps脚本执行此操作。如果我理解正确,您将使用urlFetch调用另一个Google Apps脚本。
由于Google Apps脚本没有oAuth范围,因此您无法进行经过身份验证的调用。您只能调用以匿名发布的webapp服务,因此将始终在所有者权限下运行。
除非使用用户权限而不是所有者调用初始脚本,否则不能使用库。