2

尝试以发出请求的用户的身份提供由 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上的代码

4

1 回答 1

1

编辑:这在以前是不可能的,正如我在下面的回答所反映的那样。但是,Google 现在确实允许这样做,请参阅Execution API https://developers.google.com/apps-script/execution/rest/v1/scripts/run


它不可能从 Google Apps 脚本中做到这一点。如果我理解正确,您正在使用 urlFetch 调用另一个 Google Apps 脚本。

由于 Google Apps 脚本没有 oAuth 范围,因此您无法进行经过身份验证的调用。您只能调用以匿名方式发布的 webapp 服务,因此将始终在所有者权限下运行。

除非使用用户权限而不是所有者调用初始脚本,否则您也不能使用库来执行此操作。

于 2013-04-25T22:28:59.947 回答