LoginSignup
3
4

More than 1 year has passed since last update.

住所と緯度経度を教えてくれるChatbot作った

Last updated at Posted at 2018-12-11

G suiteアカウント向けにリリースされたHangouts Chatでは、誰でも簡単にbotが作れちゃうとか。

せっかくなんで何か社内業務に課題でもないかガサ入れしていたら、
「ある施設の緯度と経度をググってコピペする…」という単純作業を泥臭く繰り返していたので、
コイツを効率化すべく、投げかけた施設の住所・緯度経度とついでに検索時のGoogle MapのURLを返してくれるbotを
Google Apps Scriptで実装しました。

いいからコード見せろ

はい。

function onAddToSpace(event) {
  if (event.space.type == "DM") {
    var name = event.user.displayName;
    return {
      text: "@" + name +
      " さん、追加ありがとうございます。場所の名前を入力してみてください。"
    };
  } else {
    return {
      text: event.space.displayName + "への追加ありがとうございます。場所の名前を入力してみてください。"
    }
  }
}

function onMessage(event) {
  // Creates a new Geocoder object.
  var geocoder = Maps.newGeocoder();
  // Creates a Geocoder with the language set to Japanese.
  geocoder = geocoder.setLanguage('ja');

  var msg = event.message.argumentText;
  // Delete Space
  msg = msg.replace(/ /g, '');

  var response = geocoder.geocode(msg);

  for (var i = 0; i < response.results.length; i++) {
    var result = response.results[i];
  }

  if (result){
    return {
      text: "住所: " + result.formatted_address
      + "\n" + "緯度: " + result.geometry.location.lat
      + "\n" + "経度: " + result.geometry.location.lng
      + "\n" + "URL: https://www.google.co.jp/maps/search/" + msg + "/"
           };
  } else {
    return {
      text: "結果が出力できませんでした。 \n 入力内容をお確かめの上、再度入力してください。"
    };
  }
}

function onRemoveFromSpace(event) {
  return {
    text: "退出します。"
  };
}

コード解説

簡単に言うと、Hangouts Chat APIのなかでGeocoding APIを呼んでいます。

Hangouts Chatの部分

Hangouts Chat APIの公式ドキュメントに「メッセージをそのままオウム返しするbot」のスクリプトが載っているので、
まずはそのコードをGASで実装します。
受け取ったメッセージ event.message.argumentText を、そのあとの処理でゴチャゴチャいじくり回していく感じ。
ちなみにメッセージのバラし方も公式リファレンスにて解説してくれてます、親切ぅ!

Geocode部分

Class Geocoderの公式リファレンスを参考に、
formatted_address(住所)、geometry.location.lat(緯度)、geometry.location.lat(経度)と、
ついでにGoogle Mapでの検索URLを返してくれます。

newGeocoder()オブジェクトに日本語を設定(.setLanguage('ja'))しておくと、formatted_addressで出力される住所が日本語になります。
設定しないと英語で帰ってくる。読みづらッ!
address_eng.png

そしてDMでなくグループで遣われた場合、送られるメッセージは「@botname 施設名」になりますが、
この時のevent.message.argumentTextの値が施設名。チクショウ。
なので余計な半角スペースを.replaceで消しちゃいます。
この辺の処理の手軽さはjsの便利なところですね。

そしてそしてちゃんとresultの値がtrueかの判定を入れておかないと、
Geocodeに失敗したら「応答がない」と応答が帰ってくるので注意。
latlng_err.png

いざ、デプロイ。

【GAS】Hangouts Chat botsをGoogle Apps Scriptで試してみたに詳細な手順を書いてくれていたので、この記事に従いデプロイ。
ぶっちゃけ本botの作成自体がこの記事のおかげです、ありがとうございます!

なお、自分(GASの所有者)以外の同ドメインのG Suiteアカウントでもこのbotを使えるようにするには、
1. 作成したGASの実行権限の付与iam_mng2.png
2. bot自体のインストール権限の付与gcp.png
が必要です。

挙動したらこーんな感じ。

latlng01.png
住所でもイケます。
latlng02.png

gist にて、割愛した部分を含むソースを公開しています。

Class Geocoderの公式リファレンスにはreverseGeocode(緯度・経度から住所を出す、いわゆる"逆"Geocode)もあるみたい。
そっちの需要も(たま~に)あるので、メッセージが数値かどうかでgeocode(msg)するかreverseGeocode(msg)するかの判定を追加したら、同じbot上で両方のGeocode処理ができそう。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4