1

Fusion Table でホストしたいデータベースを構築しており、Fusion API とやり取りするためのテスト関数をいくつか開発しています。私は Google Apps Scripts を使用しており、このコードについては他のソースに大きく依存しています。私はこの問題の調査に一日のほとんどを費やしてきましたが、今は立ち往生しています。

スクリプト エディターで addNewColumn() を実行すると、(ログで確認できるように) "fetch ready" というログ エントリに到達し、(毎回) 認証プロセスを経て、停止します (決して到達しません)。 「実行されたフェッチ」ログエントリ)。スローされるエラーはありませんが、フェッチ コマンドは完了しません。

デバッグ モードで実行すると、認証が行われ、フェッチ行でハングします。「ステップイン」をクリックすると、単に「OAuth エラー」というエラーが表示されます。ここで何をすべきかよくわかりません。どんな助けでも大歓迎です。

function googleAuth() {
      var scope = "https://www.googleapis.com/auth/fusiontables";
      var service = 'fusion';
      var oAuthConfig = UrlFetchApp.addOAuthService(service);
      oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+
                 "OAuthGetRequestToken?scope="+scope);
      oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
      oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
      oAuthConfig.setConsumerKey('{consumer key}');
      oAuthConfig.setConsumerSecret('{secret}');
      return {oAuthServiceName:'fusion', oAuthUseToken:"always"};
}

function addNewColumn(){   
      var p = {
          'name' : "newColumn",
          'type' : "NUMBER"
      };

      Logger.log(addColumn(p));
}


function addColumn(parameters) {
  var url = "https://www.googleapis.com/fusiontables/v1/";
  var fetchArgs = googleAuth(); 

  fetchArgs.method = "POST";
  fetchArgs.payload = parameters;

  //if the fetch arg payload is set to null it will add an unnamed column
  //fetchArgs.payload = null;  

  url += "tables/"+"{table id}"+"/columns";
  url += '?key='+"{key}";

  Logger.log("fetch ready");

  var result = UrlFetchApp.fetch(url, fetchArgs).getContentText();

  Logger.log("fetch executed");

  return Utilities.jsonParse(result);  
}

アップパテ

テスト用に関数を単純化したところ、オプション本体のペイロード フィールドの「ペイロード」変数の代わりに「null」を挿入するだけで、コードがフュージョン テーブルに名前のない列を正常に作成することがわかりました。ただし、ペイロード変数を再挿入すると、機能しなくなります。

機能していない場合は、エディターから実行するたびに再認証を求めるか、Web アプリから実行すると「エラーが発生しました: そのアクションを実行するには認証が必要です」と表示されます。ペイロードは承認をどのように変更しますか? まったく同じペイロードをカットして OAuth2.0 プレイグラウンドに貼り付けたところ、完全に機能しました。助けてください。

function googleAuth() {
      var oAuthConfig = UrlFetchApp.addOAuthService(service);
      oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+
                 "OAuthGetRequestToken?scope=" + scope);
      oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
      oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
      oAuthConfig.setConsumerKey(clientId);
      oAuthConfig.setConsumerSecret(clientSecret);
      return {oAuthServiceName:service, oAuthUseToken:"always"};
}

function addColumn() {
  googleAuth();
  var payload = 
    {
      name : "IT WORKED",
      type : "STRING"
    };
  var options =
    {
      "oAuthUseToken":"always",
      "oAuthServiceName":service,
      "method" : "post",
      "payload":payload
    };
  var url = fetchUrl + "tables/" + fusionId + "/columns" + "?key=" + apiKey;
  var fetchResult = UrlFetchApp.fetch(url, options);
  Logger.log(fetchResult.getContentText());
  return Utilities.jsonParse(fetchResult.getContentText());
}

アップデート #2

エラーなしで実行できる方法を見つけましたが、要求された名前とタイプを新しい列に割り当てません。最近追加されたのは、以下に示すようにコンテンツ タイプを指定することでした。contentType を「application」または「json」に強制すると、実行されますが、意図したとおりにペイロードが渡されません。

  var options =
    {
      "oAuthUseToken":"always",
      "oAuthServiceName":service,
      "method" : "POST",
      "payload" : payload,
      'contentType' : 'application'
    };
4

3 に答える 3

0
  • これが他の urlFetch POST の例と異なるように見える理由は、Fusion Table Service が実際の JSON ペイロードを要求の "BODY" として想定しているためです。JSON オブジェクト (Stringify なし) を「ペイロード」として追加すると、UrlFetchApp は各名前/値のペアを Url エンコードされた要求文字列 (つまり、name=YES&type=STRING) に変換します。ただし、ペイロードが文字列の場合 (stringify を使用している場合のように)、UrlFetch は提供した文字列 (この場合は JSON 文字列) を URL エンコードするだけです。名前/値パラメータが必要なサービスに「投稿」する場合は、Stringify を使用しません。
  • 注:ここに投稿した他の関連する質問を認識し、明確にするために、この例では Oauth 1.0 を使用しています (addOAuthService は Oauth1.0 エンドポイントとプロトコルのみをサポートします)。
  • もう 1 つ注意: Utilities.jsonParse と JSON.stringify を混在させています。一貫性を保つために JSON.parse を使用します。
于 2013-03-17T12:31:59.210 に答える
0

Fusion テーブルからデータを取得して操作しようとして、同じ問題が発生しました。

Google の注目すべきスクリプト ライブラリにはフュージョン テーブル ライブラリがあります: https://developers.google.com/apps-script/notable-script-libraries?hl=pt-BR

そのライブラリをリンクしましたが、バグがあるようです。だから(デバッグ上の理由で)私はソースコードを私のプロジェクトにコピーし、それを動かしました:

https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/fusion-tables-class/fusion-source

そこにあなたの答えが見つかるかもしれません。

于 2013-02-20T08:49:14.507 に答える
0

解決しました!!! 解決策は次の 2 つでした。

  1. ペイロードは JSON.stringify() を介して文字列に変換する必要がありました
  2. contentType を手動で「application/json」に設定する必要がありました

これは、オンラインで見つけた複数のチュートリアルとは大きく異なりますが、実際のソリューションを共有したいと考えていました。

function addColumn(authToken) {
  googleAuth();
  var payload =
    {
      name : 'YES',
      type : 'STRING'
    };
  var options =
    {
      payload : JSON.stringify(payload),
      oAuthUseToken : "always",
      oAuthServiceName : service,
      method : "POST",
      contentType : "application/json"
    };
  var url = fetchUrl + "tables/" + fusionId + "/columns";// + "?key=" + apiKey;
  var fetchResult = UrlFetchApp.fetch(url, options);
  Logger.log(fetchResult.getHeaders());
  Logger.log(fetchResult.getContentText());
  return Utilities.jsonParse(fetchResult.getContentText());

}
于 2013-03-16T08:45:01.647 に答える