これは ドリコム Advent Calendar 2019の22日目です。
21日目は homma suzuka さんによる、ファインアート出の人間がUIについて学びました。 です。 こんにちは。
ドリコムで情シスと総務を兼務している渡部です。
本稿では日々のヘルプデスク業務の傍らで GoogleAppsScript(GAS) を使ってメールやカレンダーの情報を Chatwork と連携させて漏れなくスピーディーに対応できる環境を整えた話を紹介致します。
コピペするだけで GAS から Chatwork へ投稿するサンプルスクリプト付きですので、GAS の初めの一歩としてご覧いただければ幸いです。

きっかけ

ドリコムでは G Suite(Gmail, Googleカレンダー, Googleドライブ等) と Chatwork を利用しており、全社的なお知らせや業務連絡などもチャットで行うくらい チャット >>>>> メール 文化です。
私自身、チャットは常に利用しつつ、カレンダーでその日の予定を確認しながら、数時間おきにメールを確認しに行くというスタイルになっています。

さて、ここで問題です。
チャットとカレンダーにはあってメールにはないもの。それは何でしょう。

・・・
・・・
・・・

答え『プッシュ通知』です。

プッシュ通知とはー
新しい情報や、状態に何か変化が起きた時にお知らせしてくれる機能の事です。

「え、メール(Gmail) にもあるでしょ」という声が聞こえる気がしますが、私は Gmail のプッシュ通知は ON にしていません。理由は “メールが来すぎるから” です。
「フィルタすればええやん」という声も聞こえる気がしますが、情シス&総務という立場で様々な購買をしている関係上、多種多様な送信元からの様々なDMに紛れて契約更新期限のお知らせメールも届くので自動で既読/アーカイブしてしまうと見逃す可能性がある為、敢えてフィルタしていません。

その点、チャットはリアルタイムの会話で画面の向こう側に今まさに相手がいますし、カレンダーも予定開始前にタイトルと会議室を通知してくれるのはすごく助かります。

Gmail も欲しい情報(メール)だけを Chatwork に投稿すれば、プッシュ通知として機能するので、今回は実際に利用している事例を二つご紹介します。

プッシュ通知実現までの大まかな流れ

(準備するもの)
・Chatwork の API キー (※後述の Chatwork API に関するリンクを参照)*1
・Chatwork の通知したい部屋の room_id (※ブラウザで開いた時の URL の数字の部分)
・スプレッドシート

上記が準備できたらー
スプレッドシートの ツール > スクリプトエディタ 画面を開く
function myFunction() の中にスクリプト(GAS)*2 を書く
function myFunction() {
var CW_ROOM_ID = "(通知したいチャットワークルームID)";
var CW_TOKEN = "(投稿するアカウントの API キー)";
var POST_TEXT = "初めての人も大丈夫! GoogleAppsScript(GAS) と Chatwork で作るお手軽プッシュ通知";
// 送信データ
var params = {
headers : {"X-ChatWorkToken" : CW_TOKEN},
method : "post",
payload : {
body : POST_TEXT
}
};
var url = "https://api.chatwork.com/v2/rooms/" + CW_ROOM_ID + "/messages";
UrlFetchApp.fetch(url, params);
}
基本はコレだけ。
スクリプトエディタの再生(実行)ボタンを押せば1回実行できます。
※ 初回実行時のみ、許可を求めるダイアログが複数回出ますので「許可」してください
上記との合わせ技で、任意のタイミングで定期的に自動実行したい場合は、スクリプトエディタの 編集 > 現在のプロジェクターのトリガー > トリガーを追加 から自動実行設定を行います。

事例1: システムアラートメール

あるあるですね。
管理しているシステム(サーバ)に何か異常が発生した際にメールを送信する仕組みです。
このメールを受信したら Chatwork に通知を飛ばします。

Gmail のデータは以下のコードで取得できます。
※ ML = Mailing List
// Gmail データの取得
var threads = GmailApp.search("to:(対象のML) newer_than:2d",0,100);
search の第一引数で指定しているのは Gmail のフィルタ条件です。*3
アラートメールが届くMLと、2日以内のメールと指定する事で処理対象を絞っています。
取得対象を0~100スレッドにしているのは、50だと欲しいメールが取得できていない事があったので100にしています。

あとは for 文(繰り返し処理)で Chatwork に通知していないメールなら通知するだけなのですが、上記で取得できるメールがスレッド形式のみなのでなかなか厄介でした。
アラートメールの A)障害発生と B)障害解消 がそれぞれ別スレッドになっており、GmailApp.search で取得すると新しいスレッドから取得されるので、チャットワークへの通知が B)障害解消 → A)障害発生 の順番になっていました。。
仕方がないので通知すべきメールの内容と受信日時を一旦スプレッドシートに記録したあと、受信日時の古い順にソート(並べ替え)したものを for 文(繰り返し処理)でチャットワークに投稿するという二段構えになりました。
スクリプト(プロジェクトのトリガー)は、5分間隔で自動実行しており、いまのところ問題なく動いています。

事例2: 共有カレンダーの予定重複通知

Googleカレンダーのリソース(会議室)とは別で、社内のとある施設について共有カレンダーに予定を登録する事で運用しているものがあるのですが、予定が被っている(施設予約が取れていない)事に気付かない事があり、被っている場合は Chatwork に通知する仕組みを作りました。
var cal = CalendarApp.getCalendarById( CALENDAR_ID );
var now = new Date();
// 3ヶ月(90日)先までチェック
var period = new Date(now.getTime() + (90 * 24 * 60 * 60 * 1000));
var events = cal.getEvents(now, period);
今日から3ヶ月先の予定(events)を取得して内容をスプレッドシートに記録した後、for 文(繰り返し処理)で上から順に被っている予定がないか確認し、時間帯の被っている予定があれば通知する。という流れです。
こちらは前述の事例1とは違い緊急性は低いので、日に1回(朝)だけチェックして通知しています。

やってみて思った事

上記事例以外に、スプレッドシートの情報をもとにカレンダーに予定登録するスクリプト等も作って使っていますが、
・サーバーを用意する必要がなく(つまりお金がかからない!)
・Googleドライブのファイルからスクリプトエディタを開くだけでコードが書けて
・毎分/毎時/毎日など定期的に実行もできるし
・G Suite の各サービスの情報が相互にやりとりできる
というメリットづくしなので、是非触ってみる事をオススメします!

但し、作った本人にしか分からない仕組み(システム)は後に遺恨を残すことが多々ありますので、『コメントや資料はキチンと残しておきましょう』が先人から伝わる私の教訓です。ではでは。


[ 参考リンク ]
*1
Chatwork API リファレンス
http://developer.chatwork.com/ja/
*2
GAS の API リファレンス
https://developers.google.com/apps-script/reference
*3
Gmail で使えるフィルタ条件(演算子)詳細
https://support.google.com/mail/answer/7190?hl=ja

明日は 渡辺 祥二郎 さんの記事です。
ドリコムでは一緒に働くメンバーを募集しています!(情シスも絶賛募集中です☆)
募集一覧はコチラを御覧ください!