尝试以发出请求的用户的身份提供由 Google Apps 脚本发出的 JSON 请求。想了一会儿,我意识到这是行不通的,因为服务脚本需要被授权以调用他的用户身份运行,所以调用脚本必须添加一些授权信息,它没有,我不知道如何添加该信息(这实际上是我的问题:将哪些信息添加到 http-request,以及从哪里获取它)。
但是,尽管如此,当我从浏览器中调用该服务器时,它仍然有效,因为浏览器(我在其中登录到我的 Google 帐户)在 http-request 中发送了正确的信息以证明它是经过授权的。
这个问题与How to use Google Apps Script ContentService as a REST server问题有某种关系,但给出的答案正是我不想要的:调用的 JSON-Server 不应该在我的帐户下运行,而是在帐户下运行调用用户并使用该用户的资源(scriptdb,驱动器,...)。所以问题是:如何从一个从谷歌帐户运行的脚本提供该信息到另一个脚本,以便另一个脚本可以在该帐户中运行?我知道使用 gas-libraries 可以解决这个问题,但我希望将它作为 JSON-client/server(主要是为了解耦依赖项)。要添加一些代码(以保持 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上的代码