ピラティスのレッスンを無断欠席しないために…！リマインド用のLINE Botを作ってみた

# マシンピラティスに夢中な私
はじめまして。商業ディベロッパーに新卒で入社して6年目のOLです！
私は、今年の4月から週2～3回の頻度で、仕事終わりにグループレッスンのマシンピラティスに通い始めました。（回数無制限のプランです！）
この趣味を満喫するために、初めてLINE Bot作りに挑戦したので、紆余曲折をご覧いただければと思います。
![25292044.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/a60b5781-fe67-2c97-9a1b-6670622403bd.jpeg)

# マシンピラティスとは
マシンピラティスとは、専用のマシンを使ったピラティスのことです。
:mag:参考：[マシンピラティスとは？](https://rintosull.jp/about/)（私が通っているスタジオのHPではないです！）

私が3ヶ月間通ってみた結果、こんなところにハマってしまいました。
* 体が伸びてスッキリする
* ちょうどいい筋肉痛になる
* 汗だくにならずに済む（レッスンの内容によりますが）

マシンピラティスを始めてからは仕事中も姿勢を意識するようになり、以前よりはなんとなく健康的になった気がします。

最近は私と同じようにマシンピラティスに興味を持つ方が多いようで、レッスンに行く度に体験の方が入会手続きをしている様子を見かけます。

# 大人気だからこそ、レッスンの予約が取りづらい！

私が通っているスタジオはインストラクターを囲む形で約30台のマシンがあり、受講生1人につき1台を使用することになっています。
そのため、各レッスンにおいて受講生による予約の争奪戦が勃発しています。

そんな中、より多くの受講生がレッスンを受けられるように、下記の通り予約に関するルールが設けられています。
* **3件のレッスンしか予約ができない**
⇒レッスンが終わった瞬間（予約済のレッスンが2件になった瞬間）に、次のレッスンを予約する人が多い。
* **キャンセル期限は、レッスン開始時刻の1時間前まで**
⇒1時間前までにキャンセルしなかった場合は出席するものと見なされ、出席できなかった場合は無断欠席扱いになる。
* **月に2回無断欠席をすると、翌月の予約可能件数が3件から1件に減少する**

・・・この一番下のルールが、私にとって恐怖なのです:scream:
決して安くはない月額料金を払っていることもあり、週2～3回は通いたいので、1件ずつしか予約できなくなってしまったら予約争いに太刀打ちできません。

つまり、無断欠席をしないために**予約したレッスンの存在を失念してはいけない**のは当然のこと、突然の残業や会食が発生した場合には、**抜かりなく予約をキャンセルする**必要があります。

# 各種期限をリマインドしてくれるLINE Botを作ってみた

そこで、こんなLINE Botを作ってみました！

:bell:**翌日にレッスンがある旨を、前日の夜にリマインド**
　⇒レッスンを失念しないため
:bell:**当日のレッスンのキャンセル期限を、キャンセル期限の1時間前にリマインド**
　⇒急用が入った時にキャンセルを失念しないため
:bell:**次の予約をする旨を、レッスンの終了時間にリマインド**
　⇒レッスンが終わってすぐに次の予約をすることを失念しないため
:link:**マイページ（ジムの会員ページ）にログインできるリンクを、リッチメニューに設定**
　⇒予約やキャンセルの画面に到達しやすくするため
![0710_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/f59b3fa7-9354-5bb0-1dd7-219519c0462f.jpeg)


動いているところ⇓

https://x.com/ai_126485/status/1812707936231448920


# 使用ツール
* [LINE Developers](https://developers.line.biz/ja/)
* [Make](https://www.make.com/en/)
* [Google スプレッドシート](https://docs.google.com/spreadsheets/)

# Makeの全体像
![0710_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/4ea91be3-d852-326e-2275-9837aebc87aa.jpeg)


# 1.Google スプレッドシートの作成と連携
まずはじめに、リマインドしたい内容やリマインドしたい時間などの情報が入ったGoogle スプレッドシートを作成し、Make内のモジュールに連携しました。
#### ①レッスン日などを記入したGoogle スプレッドシートを作成
実際は3件ずつしか予約ができないのですが、1ヶ月分の予約したい日時を事前に考え、「予約ができたもの」として作成しました。
* A～C列：該当のレッスン日時
* D列：前日リマインドをしたい日時
* E～F列：キャンセル期限リマインドをしたい日時とキャンセル期限
* G～J列：次回予約リマインドをしたい日時と次回予約日時

:::note info
このとき、D・E・G列のリマインド時間は「YYYY/MM/DD HH:mm」の形式で記入しました。


:::
![0710_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/b57ca6d7-bb2f-8cf2-584e-fc4362c422e9.jpeg)
#### ②「Google Sheets（Search Rows）」モジュールに連携
* Googleのアカウントと連携して「Spreadsheet」の部分で該当のファイルを選択
* 「Sheet Name」の部分で該当のシートを選択

![0710_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/4fe54ed2-ffe5-27f5-583a-94ad2b2eb33d.jpeg)

# 2.リマインドの設定
次に、3つのリマインドの設定をしました。
操作方法は3つとも同じなので、ここでは「前日リマインド」の設定時の紹介をします。
#### ①「LINE（Send a Push Message）」モジュールの設定
「LINE（Send a Push Message）」モジュールで、リマインドを送りたい宛先の設定と、送りたいメッセージの記入をしました。
![0710_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/ae92bc8b-debf-3257-e896-b24d4215e0d2.jpeg)

:::note info
「To」の部分には、LINE Developers＞チャネル基本設定の下部にある「あなたのユーザーID」を入力しました。
![0710_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/037ce636-ae34-3b87-3d76-868fe7822967.jpeg)


:::

#### ②「Set up a filter」の設定
「前日リマインド時間」が「今の時刻」と一致したら送信するように設定しました。

* 「Condition」の上部の枠をクリック
* :star:をクリック
* Google スプレッドシートのD列「前日リマインド時間」を選択
![0710_07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/4fc31122-5654-ca2e-7c45-5213094d3acc.jpeg)
* 「Text operators:Equal to」を選択
![0710_09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/a11c2a28-9476-2af1-2156-a1d63b8ea28c.jpeg)

* 「Condition」の下部の枠をクリック
* :calendar_spiral:をクリック
* 「formatDate」をクリック
* 「;」前に「now」をクリック
* 「;」後にベタ打ちで「YYYY/MM/DD HH:mm」と入力
参考にさせていただいたサイト：[Make（integromat）で、昨日を指定する](https://info.datafarm.jp/blog/make/entry-534.html)

![0710_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/c9fab97d-1394-cf3b-109f-97ba4c161ee3.jpeg)

これで、3つのリマインドの設定が完了しました。

# 問題点：Run onceしないとリマインドが届かない（未解決）
設定が完了し、Googleスプレッドシートで直近の時間に変更して（下記画像の黄色部分）、Run onceをクリックしたところ、欲しい情報がきちんと手に入りました！
![0710_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/0ca31edc-5c93-4536-180f-c923a41156cc.jpeg)
![0710_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/9cbd2a24-771a-b165-61e7-1f612fa9d3d7.jpeg)


しかし、SCHEDULINGをONにした上で、Run onceをせずにその時間まで待っていてもリマインドが届きません。
よく考えると、Makeの設定時に触っていなかった部分がありました。
「Google Sheets（Search Rows）」モジュールの左下にある時計マーク:alarm_clock:です。
デフォルトでは「At regular intervals」になっていました。
クリックしてみると、沢山の選択肢があります。
![0710_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/742788b4-e1bd-9fb5-d1c2-9a869975260c.jpeg)

自動的に届くようにする方法を考えた結果、消去法で「On demand」か「At regular intervals」の2択で迷ったので、Makeのホームページで調べてみました。
参考：https://www.make.com/en/help/scenarios/scheduling-a-scenario

どうやら「On demand」はRun Onceをしないと実行しないようです。

となると「At regular intervals」でしょうか。
調べてみると、「デフォルトではシナリオは15分ごとに実行されますが、このパネル内で実行スケジュールと間隔をカスタマイズできます。」とあります。
ということは間隔を1分ごとにすれば、自動的にリマインドが届くのでは？とひらめいたのですが・・・

最短で15分とのことで、1分には設定できませんでした:scream:
![0710_17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/a4a63fb4-270c-dfcf-a417-f2ff33e7c939.jpeg)

Makeのホームページで調べたところ、1分間隔に設定できるのは有料プランの特権のようで、無料プランの私は試すことができませんでした。
参考：https://www.make.com/en/pricing

果たして有料プランになれば、自動的にリマインドが届くのか？
はたまた違う方法があるのか？
また色々調べてみようと思います。

# おまけ：リッチメニューの作成
せっかくなら予約やキャンセルができるマイページ（ジムの会員ページ）のリンクを常に表示させようと思い、リッチメニューを作成しました。

詳しい説明は省きますが、LINE Official Account Manager＞ホーム＞トークルーム管理＞リッチメニューで画像を作ったりリンクを設定したりして、完成いたしました！
![0710_18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/6b350b1b-b52e-45cd-c201-d80808cc6935.jpeg)
![0710_19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802235/be2f6585-e485-e331-1319-fd3a276503e2.jpeg)

# まとめ
このLINE Botを作ったことで無断欠席を予防でき、予約枠が1件に減ることなく、沢山ピラティスに通うことができそうです！
しかし現状のままでは自動的には稼働しないので、いろいろ勉強して改善し、実働させたいと思います。

はじめてのLINE Botづくりは分からないことばかりでとても大変でしたが、未知の世界にぐっと近付けた気がして素直に嬉しかったです。
これからもデジタルを実用的に使えるように頑張って参りますので、あたたかく見守っていただけますと幸いです！