0

フュージョン テーブルに行を挿入する Google Apps スクリプト関数を開発しています。私のフュージョン テーブル インターフェイスのほとんどは正常に動作しますが、これは SQL 'POST' クエリでの最初の試みです。ここのドキュメントに基づいて、SQLステートメントをPOST本文に入れることができるはずです。トラブルシューティングのためにOAuth Playgroundに自分自身を減らしましたが、次のエラーが引き続き発生します。私はSQL挿入ステートメントを使用しようとしてきましたがsql=INSERT INTO {fusionId} (HeadingName) VALUES (ValueOne)、このステートメントのさまざまなバリエーションを試してみましたが、役に立ちませんでした。これを行うための適切な構文または方法を判断するのを手伝ってください。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Required parameter: sql",
    "locationType": "parameter",
    "location": "sql"
   }
  ],
  "code": 400,
  "message": "Required parameter: sql"
 }
}

これを理解したら、コード内でプレイグラウンド操作を複製する必要があります。これは(私が思うに)次のようになります。

function fusionRequest(methodType, sql, oAuthFields) {
  OAL.googleAuth(oAuthFields);
  var options =
    {
      oAuthUseToken : "always",
      oAuthServiceName : 'fusiontables',
      method : "POST",
      payload : "sql=INSERT INTO {fusionId} (Heading) VALUES (ONE)",
      contentType : "application/json"
    };
Logger.log(options)
  var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options);
  return JSON.parse(fetchResult.getContentText());  
}

コンテンツタイプの問題もあると思っていましたが、途方に暮れています。助けてください。

更新 #1 Sanya のアドバイスを使用して、OAuth Playground でリクエストを機能させることができました。ただし、コード内のリクエストにはまだ苦労しています。コードの実行時に承認のリクエストが繰り返されます (または、デバッグ時に一般的な OAuth エラーが発生します)。ここでの私の以前の経験から、これは私のペイロードにまだ何か問題があることを意味すると思います。これに関するアドバイスは大歓迎です。

var oAuthFields = {
  'clientId' : '523606257547.apps.googleusercontent.com',
  'scope' : 'https://www.googleapis.com/auth/fusiontables',
  'fetchUrl' : 'https://www.googleapis.com/fusiontables/v1/',
  'clientSecret' : 'L-f8DgwK4rs7Qmw9k5IFL7lZ',
  'fusionId' : '1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI',
  'service' : 'fusiontables',
  'queryUrl' : 'https://www.googleapis.com/fusiontables/v1/query/'
};
function fusionRequest(methodType, sql, oAuthFields) {
  OAL.googleAuth(oAuthFields);
  var options =
    {
      oAuthUseToken : "always",
      oAuthServiceName : 'fusiontables',
      method : "POST",
      payload : "sql=INSERT INTO {fusion id} (\'Heading\') VALUES (\'ONE\')",
      contentType : "application/x-www-form-urlencoded"
    };
  var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options);
  return JSON.parse(fetchResult.getContentText());  
}

文脈上、 googleAuth() 関数とこの関数の全体的なレイアウトは、融合テーブルに列を追加するために使用する関数と同じです (機能します)。

4

2 に答える 2

2

ドキュメントに欠陥があり、いくつかの詳細が欠落しています。

リクエスト url でsql=... パラメータを使用できます。通常、ContentType ヘッダーは application/json ですが、API はおそらく他の ContentTypes も受け入れます。この場合、URL の長さは 2048 文字に制限されています。

POST body でsql=... を使用することもできます。この場合、ContentType を application/x-www-form-urlencodedに設定する必要があります。1 回のリクエストで 500 個の INSERT ステートメントに制限されています。

もう 1 つのオプションは、importRows メソッドを使用することです。ここでは、CSV を POST body として使用します。この方法では、アップロードされるデータが 100MB に制限されます。ContentType は "application/octet-stream" である必要があります。注意: URL は上記とは異なります: https://www.googleapis.com/upload/fusiontables/v1/tables/tableId/import。また、本文に UTF-8 以外の文字を指定する場合は、&encoding=... url パラメーターを指定する必要があります 詳細はこちら: importRows リファレンス

于 2013-03-29T13:19:38.967 に答える
0

成功!多くの調査の後、私は問題を解決しました。これはペイロードや contentType の問題ではありませんでした (実際、.fetch が自動的に "application/x-www-form-urlencoded" エンコーディングにデフォルト設定されることがわかりました)。問題は承認にありました。James Ferreira の Fusion Table Library をモデルとして使用し、自分のコードとライブラリの両方で のLogger.log(UrlFetchApp.getRequest(url, fetchArgs))前に挿入しました。UrlFetchApp.fetch(url, fetchArgs).getContentText()

//log entry for library
{oAuthServiceName=fusion, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT INTO 1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI ('Heading', 'Heading 2') VALUES ('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.google.com/fusiontables/api/query}

//log entry for my code
{oAuthServiceName=fusiontables, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT+INTO+1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI+('Heading',+'Heading+2')+VALUES+('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.googleapis.com/fusiontables/v1/query}

次に、作業中のライブラリのログと自分のログを比較したところ、3 つの違いが見つかりました。

  1. 私が思うのは、SQLステートメントのエンコーディングの違いです(「INSERT INTO」と「INSERT + INTO」)。
  2. リクエストの「サービス」パラメーターが異なっていました (「fusion」と「fusiontables」)。
  3. qpi クエリの URL が異なっていました。(「www.google.com/fusiontables/api/query」対「www.googleapis.com/fusiontables/v1/query)」。

いくつかの実験の後、私はそれを決定しました...

  1. 想定されるエンコーディングは、私のエラーとは無関係でした。
  2. サービス パラメータも無関係でした。さまざまなドキュメントで両方を見てきましたが、どちらも機能しているようです。
  3. イライラすることに、これが問題でした。APIのドキュメントには、機能しないものを使用するように記載されているため、イライラします。どうやら、www.googleapis.com/fusiontables/v1/query は OAuth2.0 で使用するためのものです。OAuthConfig (私が GAS で使用しているビルトイン認証ツール) は 2.0 に移行されていないため、ドキュメントが不足していました。OAuthConfig を移行するための機能リクエストをここに送信しました。対処したい場合は、そのスレッドに愛情を注いでください。
于 2013-03-30T20:28:59.680 に答える