フェルマータ

個人用のメモ。ソフトウェアの導入とかが多くなる予定。ライセンスの気になる方はこのブログに載せたコードは修正 BSD に準ずるものと考えてください。

令和 3 年度川口市保育所探しのための自宅と駅からの距離算出 Google Apps Script を作成した

ポエム

普段ポエムと趣味を垂れ流しながらコードを書くブログが唐突に現実の話をするのだが、去年第一子が幸いなことに母子ともに無事産まれ妻の職場復帰を目指して保育所探しをすることになった。保育所を探すにあたり妻から保育所のリストを作成せよとの要望があったので、市のホームページから保育所一覧を出し我々の通いやすい保育所を探そうとした。我が家の保育所選びの条件として、そもそもゼロ歳児保育をしているかなどの諸々の条件はあったのが、結局の所近場に通うのが最も良いだろうということで、預けに行くときには家からの距離が迎えに行くときには駅からの距離が肝要という話になり、自宅からと駅からの距離が一定距離より近いことを挙げた。とはいえ 174 箇所もある保育所すべての距離を手で Google 先生に聞くのはそれなりに骨であったので、遊びを兼ねて Google Apps Script を作成し簡単に計算できるようにした。

作ったもの

// コピペ元:https://it-soudan.com/how-to-get-distance-with-google-map-api/

function calcDistance(src, dest) {
  var directionFinder = Maps.newDirectionFinder()
    .setOrigin(src)
    .setDestination(dest)
    .setMode(Maps.DirectionFinder.Mode.DRIVING)
    .setLanguage("ja");
  var directions = directionFinder.getDirections();
  var route0 = directions.routes[0];

  directionFinder.setAvoid(Maps.DirectionFinder.Avoid.HIGHWAYS);
  directions = directionFinder.getDirections();
  var route1 = directions.routes[0];

  return [route1.legs[0].distance.value / 1000, route0.legs[0].distance.value / 1000];
}

function setUpDistance() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var list = ss.getSheetByName("保育所リスト");
  var addresses = ss.getSheetByName("自宅と駅の場所");
  
  var home = addresses.getRange(1, 2).getValue();
  var station = addresses.getRange(2, 2).getValue();;

  var dat = list.getDataRange().getValues();

  // 各行を順に処理する
  for (var i = 1; i < dat.length + 1; i++){
    const src = list.getRange(i, 3).getValue().replace("(地図)", "");

    if(list.getRange(i, 4).getValue() !== true && !list.getRange(i, 7).getValue()) {
      list.getRange(i, 6).setValue(calcDistance(src, home));
      list.getRange(i, 7).setValue(calcDistance(src, station));
    }
  }
}

使い方

「自宅と駅の場所」シートに自宅・駅の住所を書き、上記スクリプトsetUpDistance 関数を実行すると諸々の距離が計算される。ただ、全部の保育所を二回計算すると Google の距離算出 API の呼び出し回数制限に引っかかってしまうので、試す場合は予め保育所を絞った上で実行したほうが良いかもしれない。また、川口市保育所としているがあくまでリストが川口市のものなだけで、他の地域のリストに変更すれば同様に距離を算出することはできる。中身については参考にした下記の記事を参照されたい。

it-soudan.com

普段あんまりこういう形でのコードは書かないのでそれなりに新鮮ではあった。ただ、この手のコードを解説するのはあんまりおもしろくなくやる気が全く出ないのがわかったのでもう少し込み入ったコードを書きたい。