shikaの雑記ブログ

web系エンジニアの雑記ブログ

技術

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

投稿日:

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で出力される住所が日本語になります。
設定しないと英語で帰ってくる。読みづらッ!

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

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

いざ、デプロイ。

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

なお、自分(GASの所有者)以外の同ドメインのG Suiteアカウントでもこのbotを使えるようにするには、

  1. 作成したGASの実行権限の付与!
  2. bot自体のインストール権限の付与

    が必要です。

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


住所でもイケます。

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

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

-技術
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

schtasks.exe – コマンドを時刻指定して実行する

1日の業務の中で決まった時刻に特定のコマンドを実行したい場合には、タスクスケジューラで登録すると便利です。 手順と概略 Windowsではタスクスケジューラとして schtasks.exe が用意され …

クロスドメイン制約を回避するChromeショートカットを作る

No 'Access-Control-Allow-Origin' header is present on the requested resource. のエラーのせいでドメイン …

jsでメール本文の初期値を設定

メールリンクをクリックしてメーラーを起動した際に、 メール件名や本文、BCCが初期値として入力させるには <a href="mailto:mail@sample.com?bcc=tes …

jQueryにてリンク先のドメインを一括置換

htmlのaタグ内に設定された特定のドメイン部分のみを、 開発サーバなど別環境に設置されている時にはその時のドメインに後から置換する、という処理を要求されたので locationやreplaceやRe …

2重線が重なり合うスタイルを組むには(No 画像, Yes CSS!)

この画像のように、2重線が少しズレて重なっている枠線の実装に迫られましたが、 通常のborderとbox-shadowを少しずつずらせばcssのみで実現できました。 画像も疑似要素も使用してませんよ! …