はじめに
私はアレルギー疾患を専門とする小児科医ですふだんは複数の医師が勤務し、地域の救急医療などを担う役割のある病院で勤務しています。複数の医師を複数の勤務先へ派遣しています。
人間はイレギュラーなイベントはどうしても忘れてしまします。もちろん、色々な方法で皆が個々に管理しているのですが、完璧に続けるのは難しいです。すると、どうしても時にミスが起こります。ミスは指摘するのも、指摘されるのも嫌な思いになりますよね
そこで、前回の投稿でお伝えした通り、私はプログラミングという果てしない道のりを歩き始めたので、この課題を解決するために今回のシステムを作ってみました。ただし、今回はオリジナルな部分はほとんどなく、先人のシステムをそのまま使用しており、個人の備忘録としての側面が大きいことを先にお断りしておきます
今回のシステムでできること
✔️ あなたが仕事仲間で作成したLINEグループに
✔️ Googleカレンダーに入力したシフトの仕事を
✔️ 仕事の当日の任意の時間に
✔️ リマインドメッセージを送れます
実際はこんな感じ
グループLINEのプロフィール画像は、Canvaで作成しました。
システム構成はこんな感じ
LINE Notifyの設定
はじめに、ふだん使っているスマホのLINEアプリで、リマインドをしたいメンバーでグループを作成します。
次にPCでLINE Notifyを開けて、右上の「ログイン」をクリックしログインします。ログインにはご自身のスマホからQRコードログインが便利だと思います。
ログインすると、画面右上がご自身の名前に変わりますのでそこをクリックします。マイページをクリックし、画面下の「トークンを発行する」をクリックします。トークン名には任意の名前を入力してください。今回のシステムではこの名前が、実際に送られてくるLINEメッセージの一番上に表示されます。実際はこんな感じ、の写真では初めに[外のお仕事カレンダー]と表示されていますが、これがトークン名です。通知を送信するトークルームは、はじめに作ったLINEのグループを選択します。そして、下の「発行する」をクリックするとトークンが発行されるので「コピー」をクリックして、どこかに保存してください
ご自身のLINEのLINE Notifyアカウントに下の写真の様な通知が届きます。この通知に従って、リマインドをしたいメンバーのグループにLINE Notifyを招待してグループの一員にしてください
Googleサービスの連携
今回はこのサービスを提供するために、新たなGoogleアカウントを作成しました。まずGoogleCalendarに予定を入力します。次に、下の写真を参考に、GoogleDriveの左上にある「新規」をクリックし、GoogleAppsScriptをクリックします。
GoogleAppsScriptの設定
GoogleAppsScriptが開いたら、はじめに記載されているコードは全て消して、下のコードを全てペーストしてください。ペーストしたコードの中で"LINE Notifyのトークンをここへ貼り付けてください。"の箇所へ、先ほどLINE Notifyで発行して保存したトークンをペーストしてください。この時に「"」は消さないように注意してください
次に、画面左の時計マークのトリガーをクリックします。表示された画面右下の「トリガーを追加」をクリックして、以下の設定にします。「時刻を選択」は、リマインドLINEを飛ばしたい時間を選択してください。下の写真の通りだと「7時〜8時」にLINEが来る設定です。
この設定だけでは、LINEで通知される時間が正確ではありません。上の画面だと7時から8時のどこかで送られます。これを正確にするためには以下の様に、コードにそれぞれ◯時、◯分を入力してください。
これらの設定ができたらデプロイします。デプロイは、5分でつくるLINEBotの「GoogleAppsScriptのコードにトークンを書き込んで、デブロイをします」を参考にしてください。これで、完成です!
しかし、このままだと実際にこれが正しく機能するか確認するためには翌日の8時まで待つしかありませんもちろん、そんな馬鹿げたことをする必要はありません。エディタ画面の「実行」をクリックすると、トリガーによる発動がなくてもLINEにメッセージを送ることができます。下の写真の赤丸で囲まれた箇所をクリックして、LINEに当日のリマインドが届くことを確認してください
コード
const LINE_NOTIFY_TOKEN = "LINE Notifyのトークンをここへ貼り付けてください。";
const WEEKDAY = ["日", "月", "火", "水", "木", "金", "土"];
function main() {
try {
let nowDt = new Date();
let dt = Utilities.formatDate(nowDt, 'Asia/Tokyo', `MM/dd(${WEEKDAY[nowDt.getDay()]})`);
let message = `\n本日のリマインドです。\n\n--- ${dt} ----\n`;
let userMessage = '';
let calendarList = CalendarApp.getAllCalendars();
for (let i in calendarList) {
let calendar = calendarList[i];
let eventMessage = '';
let eventList = calendar.getEventsForDay(nowDt);
for (let j in eventList) {
let event = eventList[j];
eventMessage += `${event.getTitle()}\n`;
}
if (0 < eventMessage.length) {
userMessage += eventMessage;
}
}
if (0 < userMessage.length) {
message += userMessage;
} else {
message += '本日は外のお仕事の予定がありません。皆様いつもありがとうございます!';
}
sendLineNotify(message);
} catch (e) {
console.error(e.stack);
}
}
function getEventTime(str) {
return Utilities.formatDate(str, 'Asia/Tokyo', 'HH:mm');
}
//トリガー発動時間を正確にするためのコード
function setTrigger() {
var triggerDay = new Date();
triggerDay.setHours(8); //( )時
triggerDay.setMinutes(00); //( )分
ScriptApp.newTrigger("main").timeBased().at(triggerDay).create();
}
function sendLineNotify(message) {
let url = 'https://notify-api.line.me/api/notify';
let options = {
'method': 'post',
'headers': {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Authorization': `Bearer ${LINE_NOTIFY_TOKEN}`
},
'payload': `message=${message}`
};
let response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText('UTF-8'));
}
終わりに
相変わらずプログラミング、というより先人の遺産を最大限に利用して小手先の修正を加えることで、今回のシステムが完成しました。オープンソースの文化には本当に感動しっぱなしです
さて、このLINEは運用開始してまだあまり時間が経っていませんが、このリマインドシステムは便利!との声をいただいたので、個人的には満足しています身の回りの課題を少しずつ解決しながら、これからもプログラミング、ITの山を登り続けたいと思います。最後までお読みいただきありがとうございました!