読者です 読者をやめる 読者になる 読者になる

アドベントカレンダー9日目の編集後記(GASでのJSONP、ジオコーディング等)

GoogleAppsScript GoogleAppEngine

Advent Calendar in 信州松本(だけじゃなくてもいいよ)向けのネタは無事終了しましたが、その時に調査した内容などをまとめていなかったため、複数回に分けて残しておきます(リンク多)。
今回は9日目のネタの編集後記となります。
GoogleAppEngineとGoogleAppsScriptでアルクマを追いかける - メモ的な思考的な



Googleスプレッドシートの「ImportHtml」が使えるか?

Googleスプレッドシートの関数には「ImportHtml」というものがあり、これによりHTMLのテーブルデータを簡単に取得することができます。
Google spreadsheets function list - Drive Help


ただ、残念なことに、日本語の入っているテーブルデータを正しく取得できないため、今回のネタでは利用することができませんでした。



GoogleAppsScript(以下、GAS) でのJSONPレスポンスについて

作れば分かる本のエントリーでGoogleAppEngine(以下、GAE)でJSON連携はしたことがあったため、jQueryを使ってなにかうまく連携できないかを考えていました。
そんな中、以下の記事を見つけたことで、JSONPでいけると確信がもてました。stackoverflowは凄い。
jquery ajax - Google Apps Script (GAS) - Create ContentService API to serve JSON data from Google Drive - Stack Overflow


なお、GASでjQueryにレスポンスを返す場合には、受け取った「callback」パラメータの値を付けておきます。

/**
 * GETを受け取るところ
 */
function doGet(e) {

  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  
  var json = JSON.stringify(createJSONFromCalendar());
  
  // jQueryに返すため、受け取ったパラメータにある「callback」の値を先頭につけておく
  var jsonp = e.parameters.callback + "(" + json + ")";
  output.setContent(jsonp);

  return output;
}

GASでのWebサービス公開について

以下のドキュメントを参考にして、Webサービスとして公開することができました。


なお、GASでdoGet()のレスポンスをみるには、以下にある通り、hurlを使って確認することができました。
google apps script - doPost(e) does not return parameters but doGet(e) does? - Stack Overflow



GASでのジオコーダーについて

以下の方法にてジオコーディングすることができました。
Googleマップを利用する(4/8):Google Apps Scriptプログラミング [中級編]


jQueryJSONPを扱う方法について

jQueryの公式ドキュメントを見ると、ver1.5からいろいろと手が加えられていました。
jQuery - jQuery.ajax()


そのため、以下のパラメータを設定することにしました。

パラメータ名
crossDomain true
dataType jsonp
scriptCharset 'utf-8'
cache false


一番最後のcacheについてはIEのために設定してみることにしました。
jQueryのajax通信がIE8で動かない|シラサヤ備忘館



参考:GAEでクロスドメイン通信する方法

今回はjQueryにて対応しましたが、GoogleAppEngineの場合は、以下にまとめられています。
Google App Engineでクロスドメイン通信 | Zafiel