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を使えるようにするには、
- 作成したGASの実行権限の付与!
- bot自体のインストール権限の付与
が必要です。
挙動したらこーんな感じ。
住所でもイケます。
gist にて、割愛した部分を含むソースを公開しています。
Class Geocoderの公式リファレンスにはreverseGeocode
(緯度・経度から住所を出す、いわゆる"逆"Geocode)もあるみたい。
そっちの需要も(たま~に)あるので、メッセージが数値かどうかでgeocode(msg)
するかreverseGeocode(msg)
するかの判定を追加したら、同じbot上で両方のGeocode処理ができそう。