忘れてはいけないシフト業務を、嫌な思いをせずに/させずにLINEでリマインドするシステムを作ってみた〜プログラミング初心者小児科医の備忘録

# はじめに
私はアレルギー疾患を専門とする小児科医です:smiley:ふだんは複数の医師が勤務し、地域の救急医療などを担う役割のある病院で勤務しています。複数の医師を複数の勤務先へ派遣しています。
人間はイレギュラーなイベントはどうしても忘れてしまします。もちろん、色々な方法で皆が個々に管理しているのですが、完璧に続けるのは難しいです。すると、どうしても時にミスが起こります。ミスは指摘するのも、指摘されるのも嫌な思いになりますよね:scream_cat:
そこで、[前回の投稿](https://qiita.com/ytktkmr/items/df824bf94e41d0f17336)でお伝えした通り、私はプログラミングという果てしない道のりを歩き始めたので、この課題を解決するために今回のシステムを作ってみました。ただし、今回はオリジナルな部分はほとんどなく、先人のシステムをそのまま使用しており、個人の備忘録としての側面が大きいことを先にお断りしておきます:bow:

# 今回のシステムでできること
✔️ あなたが仕事仲間で作成したLINEグループに:walking_tone1::walking_tone2::walking_tone3::walking_tone4:
✔️ Googleカレンダーに入力したシフトの仕事を:card_index:
✔️ 仕事の当日の任意の時間に:clock8:
✔️ リマインドメッセージを送れます:slight_smile:

# 実際はこんな感じ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/56b748b6-2c77-552b-6a8f-3ff47e3a42b0.jpeg"width=80%>

グループLINEのプロフィール画像は、[Canva](https://www.canva.com/)で作成しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/05bd276d-cb88-cdcd-5740-e844a3bfd599.jpeg"width=60%>


# システム構成はこんな感じ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/5f6ba594-8a9e-0856-5e4c-f8dd7917e20a.jpeg"width=120%>

## LINE Notifyの設定
はじめに、ふだん使っているスマホのLINEアプリで、リマインドをしたいメンバーでグループを作成します。
次にPCで[LINE Notify](https://notify-bot.line.me/ja/)を開けて、右上の「ログイン」をクリックしログインします。ログインにはご自身のスマホからQRコードログインが便利だと思います。
ログインすると、画面右上がご自身の名前に変わりますのでそこをクリックします。マイページをクリックし、画面下の「トークンを発行する」をクリックします。トークン名には任意の名前を入力してください。今回のシステムではこの名前が、実際に送られてくるLINEメッセージの一番上に表示されます。実際はこんな感じ、の写真では初めに[外のお仕事カレンダー]と表示されていますが、これがトークン名です。通知を送信するトークルームは、はじめに作ったLINEのグループを選択します。そして、下の「発行する」をクリックするとトークンが発行されるので「コピー」をクリックして、どこかに保存してください:relieved:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/2f29877d-2143-9a1f-cdfa-b12600b411d0.jpeg"width=90%>
ご自身のLINEのLINE Notifyアカウントに下の写真の様な通知が届きます。この通知に従って、リマインドをしたいメンバーのグループにLINE Notifyを招待してグループの一員にしてください:grinning:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/6ad3c623-e923-ecfd-18db-d40ab92b2d4a.jpeg"width=90%>


## Googleサービスの連携
今回はこのサービスを提供するために、新たなGoogleアカウントを作成しました。まずGoogleCalendarに予定を入力します。次に、下の写真を参考に、GoogleDriveの左上にある「新規」をクリックし、GoogleAppsScriptをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/82a92115-b0d8-2da9-3cca-c3d54e2f1d7f.jpeg"width=80%>

## GoogleAppsScriptの設定
GoogleAppsScriptが開いたら、はじめに記載されているコードは全て消して、下のコードを全てペーストしてください。ペーストしたコードの中で"LINE Notifyのトークンをここへ貼り付けてください。"の箇所へ、先ほどLINE Notifyで発行して保存したトークンをペーストしてください。この時に「"」は消さないように注意してください:sunglasses:
次に、画面左の時計マークのトリガーをクリックします。表示された画面右下の「トリガーを追加」をクリックして、以下の設定にします。「時刻を選択」は、リマインドLINEを飛ばしたい時間を選択してください。下の写真の通りだと「7時〜8時」にLINEが来る設定です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/274bff4b-fc36-a6a3-e7c2-e25b6e06f528.png"width=80%>
この設定だけでは、LINEで通知される時間が正確ではありません。上の画面だと7時から8時のどこかで送られます。これを正確にするためには以下の様に、コードにそれぞれ◯時、◯分を入力してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/c360b40b-7a8b-a44c-e9b4-437baa510568.png"width=80%>
これらの設定ができたらデプロイします。デプロイは、[5分でつくるLINEBot](https://qiita.com/cog1t0/items/0d121ee6d48a8c1634fc)の「GoogleAppsScriptのコードにトークンを書き込んで、デブロイをします」を参考にしてください。これで、完成です！
しかし、このままだと実際にこれが正しく機能するか確認するためには翌日の8時まで待つしかありません:sweat_smile:もちろん、そんな馬鹿げたことをする必要はありません。エディタ画面の「実行」をクリックすると、トリガーによる発動がなくてもLINEにメッセージを送ることができます。下の写真の赤丸で囲まれた箇所をクリックして、LINEに当日のリマインドが届くことを確認してください:relieved:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919962/ea748feb-a046-82fe-bea3-fd28cebcdc4c.jpeg"width=120%>

# コード
```diff_javascript
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'));
}
```

# 終わりに
相変わらずプログラミング、というより先人の遺産を最大限に利用して小手先の修正を加えることで、今回のシステムが完成しました。オープンソースの文化には本当に感動しっぱなしです:sob:
さて、このLINEは運用開始してまだあまり時間が経っていませんが、このリマインドシステムは便利！との声をいただいたので、個人的には満足しています:yum:身の回りの課題を少しずつ解決しながら、これからもプログラミング、ITの山を登り続けたいと思います。最後までお読みいただきありがとうございました！

# 参考にしたもの
[[GoogleAppsScript]スケジュールをLINEに通知する](https://qiita.com/yun_bow/items/c239f62489dde19d3889)
[LINEでリマインダー的なものを作った話](https://qiita.com/kouchanne/items/0af6274a8445d0f75d01)