目的
「ある時間・ある場所を起点として、複数の場所に行く場合のそれぞれの到着予測時刻」を一挙に計算したかった。
具体的に言うと、定時後に会社ビルから色んなところ(日によって異なる)に行く場合に、それぞれいつ頃到着するのか、Google Mapや駅すぱあとで一々調べていくのは面倒だったので、自動化できないかなーと考えたのが始まりです。
Google App Scriptの利用は初めてだったので、学習を兼ねてコーディングしました。
情報共有のため、本記事を作成しました。(ある程度)
#結論
算出できました。
出発時間に「求めた移動時間」を加算すれば、到着予想時刻を求められます。
#内容
以下のコードによります。
Google Distance Matrix APIのAPIキーは、Google Maps Distance Matrix API - API をアクティベートして API キーを取得するで取得できます。
※注: URLパラメータのうち "mode='transit'" だけは、なぜかシングルクォートでくくらないと正しい出力が帰ってきません。
gas1.gs
function calcDptTimeFromSpecificPlaces() {
var colDst = 2; // 住所列
var colRes = 3; // 結果出力列
var APIKEY = "hoge"; // Google Distance Matrix APIのAPIキー
var bk = SpreadsheetApp.getActiveSpreadsheet();
var sh = bk.getActiveSheet();
var rowLst = sh.getLastRow();
for (var i = 2; i <= rowLst; i++) { // 2行目から処理
var org = "皇居"; // 起点となる場所
var dst = sh.getRange(i, colDst).getValue();
var url = "https://maps.googleapis.com/maps/api/distancematrix/json?units=metric" +
"&language=" + "ja" +
"&origins=" + org +
"&destinations=" + dst +
"&mode=" + "'transit'" +
"&departure_time=" + "1521220500" + // "2018/3/16 17:15:00" のUNIXタイム
"&key=" + APIKEY;
var res = UrlFetchApp.fetch(url);
var json = JSON.parse(res.getContentText());
if (json["status"] == "OK") {
var str_min = json["rows"][0]["elements"][0]["duration"]["text"];
var min = str_min.replace("分", ''); // "分"を除去
min = "00:" + min + ":00"; // hh:mm:ss の形式にする
sh.getRange(i, colRes).setValue(min);
}
}
}
#課題・展望
- 移動時間1時間以上に対応していません。
- 住所は、ググって手入力しています。"皇居"はAPIで通りますが、お店や会社名などは通ったり通らなかったりなので。だから**「地名から住所を出力するAPI」**なんかがあったら、地名入力しただけで到着時間が算出できるようになるため、捗りそう。
#文献
- Google Maps Distance Matrix API - スタートガイド
- Google Maps Distance Matrix API - デベロッパー ガイド:URLパラメータ理解に有用です。
- teratail - Google Maps Distance Matrix APIでmodeにtransitを指定すると徒歩で取得される:'transit'をシングルクォートでくくる事はここで知りました。
- Qiita - GoogleDriveSpreadSheet上の住所一覧を地図にプロット @tatesuke :似たようなことやってる人いるんやな~と思ったら、友人だった。