2

リクエストを行っているユーザーとして、Google Apps Script によって作成された JSON リクエストを処理しようとしています。しばらく考えた後、私はこれが機能しないことに気付きました。なぜなら、サービング スクリプトは彼を呼び出すユーザーとして実行することを承認される必要があるため、呼び出しスクリプトはいくつかの承認情報を追加する必要がありますが、そうではありません。その情報を追加する方法がわかりません(それは実際に私の質問です:どの情報をhttpリクエストに追加し、どこから取得するか)。

しかし、それにもかかわらず、ブラウザー内からそのサーバーを呼び出すと、ブラウザー (Google アカウントにログインしている) が http 要求で正しい情報を送信して、承認されていることを証明するため、機能します。

この質問は、How to use Google Apps Script ContentService as a REST serverという質問に何らかの形で関連していますが、そこで与えられた答えはまさに私が望んでいないものです: 呼び出された JSON-Server は自分のアカウントでは実行されませんが、アカウントの下で実行されます呼び出し元のユーザーの、そのユーザーのリソース (scriptdb、ドライブなど) を使用します。問題は、Google アカウントから実行されたあるスクリプトから別のスクリプトにその情報を提供して、この別のスクリプトがそのアカウント内で実行できるようにする方法です。ガスライブラリを使用するとその問題が解決することはわかっていますが、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でコードを参照してください

4

1 に答える 1

1

編集:以下の私の回答が反映されているため、これは以前は不可能でした。ただし、Google は現在これを許可していますExecution API 。https://developers.google.com/apps-script/execution/rest/v1/scripts/runを参照してください。


Google Apps Script からそれを行うことはできません。私が正しく理解している場合は、urlFetch を使用して別の Google Apps Script を呼び出しています。

Google Apps Script には oAuth スコープがないため、認証された呼び出しを行うことはできません。匿名として公開されている webapp サービスのみを呼び出すことができるため、常に所有者のアクセス許可で実行されます。

初期スクリプトも所有者ではなくユーザー権限で呼び出されない限り、ライブラリでも実行できません。

于 2013-04-25T22:28:59.947 に答える