今日、明日の出勤メンバーは？　いつでもどこでも確認できるLINE Botを作成しました。

こんにちは。小売業で働いているtakumaといいます。

私は当日や翌日に、他に誰が出勤しているかによってやらなければならない仕事や、仕事の優先順位がよく変わります。

「今日はあれやって、これやって…そういえば今日アルバイトいたっけ？」
「明日の朝あの人いたっけ？」
ふと思った時にシフト表を確認するのですがこれが結構 __面倒__ です。
文字は小さいし、シフト表の左にある日付から指でなぞって誰がいるのか追うのが手間。
手元にシフト表がないときはもう __最悪__ です。

毎日ちゃんとメンバーを把握しなさいと言われればそれまでですが…
今回は __LINE Bot__ に助けてもらいたいと思います。

今回作成したのは出勤日をLINEで送るとその日のメンバーとそれぞれの出勤時間を確認できるLINE Botです。ついでに自分のシフトも確認できるようにしました。

https://x.com/taxumx/status/1926689002280595712　

# 使用ツール
 __・Make__　
 __・LINE__
 __・Googleスプレッドシート__

# Makeシナリオ

![スクリーンショット 2025-05-26 013447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/0a0b4096-edba-4d05-a5ef-3fe6e04f08e7.png)

## LINE Botを作成するための準備
LINE Botを作成するために __LINE Messaging API__ の設定が必要になります。
こちらの記事を参考に設定を完了させましょう。

https://qiita.com/tomorrow56/items/3fe31d709fcc0ba1c806

## 出勤メンバー確認機能

上半分のルートはLINEで日付をMM/DD（スプレッドシート内と同じ形式）または「今日」「明日」「明後日」と送信するとGoogleスプレッドシートに記入したシフトを参照してその日の出勤メンバーが返信されます。



**シフトを記入したスプレッドシート**![スクリーンショット 2025-05-23 114218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/0b151b70-3501-4175-8647-3524a11aef59.png)




 __Tools__ の*Set multiple variables* でMM/DD以外の「今日」「明日」「明後日」といった入力を日付に変換します。
![スクリーンショット 2025-05-28 152609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/1d801c72-5e69-4dbf-abe6-e953b9aac140.png)

 Varirable valueには以下のコードを入力しました。
（ChatGPT様に教えていただきました！）

```ruby:
{{
  if(contains(32.events[].message.text; "今日");
     formatDate(now; "MM/DD");
     if(contains(32.events[].message.text; "明日");
        formatDate(addDays(now; 1); "MM/DD");
        if(contains(32.events[].message.text; "明後日");
           formatDate(addDays(now; 2); "MM/DD");
           32.events[].message.text
        )))
}}

```
これはLINEで受け取ったメッセージに「今日」「明日」「明後日」などが含まれている場合に、それに対応する日付を返す仕組みです。

これを作り始めた当初の私のように「なんだこのわけ分からない文字は…。」とさっぱり意味が分からない人は以下で分解して説明します！
<details><summary>分解して説明</summary> 

`if(contains(32.events[].message.text; "今日"); 
     formatDate(now; "MM/DD");if～`

こちらを分解します。

　__if(条件; 真のとき; 偽のとき)の役割__　
・条件を見て、当てはまれば「真のとき」を返す
・当てはまらなければ次の if(...) に進む（入れ子になってる）

 ここでいう条件はこの部分
`contains(32.events[].message.text; "今日")`

　 __contains(...)の役割__ 
・(...)に特定の単語が含まれているかどうかを調べる

つまりこれは`32.events[].message.text`（LINEのメッセージ）に「`今日`」が含まれているかということ！

; 真のとき; 偽のときはこの部分です。
`;formatDate(now; "MM/DD");if～`

　 __formatDate(now; "MM/DD")の役割__ 
・今日の日付を「月/日」の形式で表示

`32.events[].message.text`に今日が含まれていたら（真のとき）`formatDate(now; "MM/DD")`=今日の日付を月/日の形式で表示する。含まれていなかったら（偽のとき）次の`if～`に進みます。

次のif～である２個目以降もほぼ同じ形ですが
`"明日")formatDate(addDays(now; 1)`
`"明後日")formatDate(addDays(now; 2)`
と少し変わっています。
`(addDays(now; 1)`は今日の日付に１日足すという意味です。２の場合は２日足した日付を表示します。

つまりこのコードは
　 __「今日」を含むメッセージが来たとき、今日の日付を月/日で表示。
「今日」を含まないメッセージで「明日」を含むメッセージが来たら今日に１日足した日付を表示。
「今日」も「明日」も含まないメッセージで「明後日」を含むメッセージが来たら今日に２日足した日付を表示する__　という意味になります。


</details>

**Google Sheets**の*Search Rows* でLINEで送られてきた該当日が書いてある行から勤務情報を取得します。
     その後*Get Range Values*でそれぞれの列から社員名を取得します。
 
 ![スクリーンショット 2025-05-26 004617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/c67aeab8-31a7-4fce-a890-dc4966b78040.png)

それらを掛け合わせてLINEで返信！
 `Get Range Valuesから得たC列の社員名`　`Search Rowsで得た該当日のC列の出勤情報`
 `Get Range Valuesから得たE列の社員名`　`Search Rowsで得た該当日のE列の出勤情報`
 `Get Range Valuesから得たG列の社員名`　`Search Rowsで得た該当日のG列の出勤情報`...
 といった形で見やすいよう整形しました。

![スクリーンショット 2025-05-25 235707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/a09f50b5-64e0-48ee-a5ca-448526184f02.png)

**LINEのトーク画面**
![IMG_3052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/5ef949ab-d091-48fa-8baf-6cb0a565b5d3.png)

 
## 自分のシフト確認機能
下半分のルートは「シフト」と入力すると自分の1か月分のシフトが返信されます。

**自分のシフトを記入したスプレッドシート**![スクリーンショット 2025-05-26 014157.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/e2fe50b9-6e54-4d53-9919-8f4b45fbf9c8.png)

 __Router__ で「シフト」と入力すると下半分のルートに繋がるように条件を設定。
 
![スクリーンショット 2025-05-26 014605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/47f86a9a-e528-48f9-96d0-63fc3c3e86b3.png)

*Get Range Values*で1か月分の日付、曜日、出勤時間を取得し、 __Tools__ の*Text aggregator*で見やすいテキストに整形し、LINEで返信！
 
![スクリーンショット 2025-05-26 014628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/d23ca560-ef31-4bee-9dc9-0a237071bf56.png)

**LINEのトーク画面**![IMG_3051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4080274/9f24af4b-073b-4790-8439-3d4a6928eb2a.png)

## もっと使いやすくするためには
**・日付入力に柔軟性を持たせたい。**
現状、日付はMM/DDで入力しなければならず、それ以外は「今日」「明日」「明後日」のみ対応しています。「30日」など他の入力形式でも対応できるようにしたい。
**・指定した条件に当てはまる人のみを抽出し返答できるようにしたい。**
「出勤者のみ」や「17時以降に勤務している人」など条件を絞り込んで表示できるようにしたい。
**・特定の名前や日付を指定し、勤務計画を表示したい。**
「Aさんの30日のシフトは？」といった内容に回答できるようにしたい。

今回作成したLINE Botは改善点がたくさんあります。つまり __伸びしろしかありません。__　今後私の成長とともにこのツールも進化させていきたいと思います。
## 感想
今回、出勤確認ができるLINE Botを作成しました。正直、私はデジタルツールに対して少し苦手意識があり、Makeもまったくの初心者だったので最初は**さっぱり訳が分かりませんでした。**　コードもなんだか難しそうな文字がいっぱいで意味がわからないという感じでした。

ですが、色々調べながら実際に手を動かしてみると「こうすれば動くんだ！」という発見の連続で、次第に仕組みがわかっていくことが楽しくなってきました。作る過程ではつまずくこともありましたが、ひとつずつ解決していく中で、自分が**成長**していくのを実感できたのがとても嬉しかったです。

そして何より、「自分の手で役立つツールを作れた」という達成感は本当に大きなものでした。まだまだ改善できる部分や、追加したい機能もたくさんあるので、これからさらに進化させていきたいと思っています。