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'
};