LINE Botに2段階の対応をしてもらいたい！

# 一問一答じゃ足りない！！
みなさん、Make(旧Integromat)を使ってLINE Botって作ったことありますか？

プログラミングの知識も必要なし
コードも書く必要なし

で簡単に作れるんですが、実際に業務でも使えそうなものを作るとなると、ひと手間必要だったりします。


今回、こんな風に2段階で処理を実行してくれるLINE Botを作ったのでその解説をしようと思います
![実際の挙動.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/b1761898-8de5-08b0-f5ff-6eb72d114531.gif)

## 入口はひとつのまま色んなパターンに対応させたい
実際に業務で使用するとなると、聞かれる内容は人によってバラバラです

その内容ごとに専用のBotを作っていては、めちゃくちゃめんどくさいですよね？
そもそもそんなBotは誰も使ってくれなくなります。。。

そこで、入り口はひとつのまま、人それぞれの色んなパターンに対応できるようなものを目指して今回サンプルを作ってみました


## 使用イメージ
* 「天気」「ニュース」等、知りたい情報は人によってバラバラだから、出来る事は多くしたい
* 「ニュース」はさらに人によって知りたいトピックが違うからそれにも対応したい
* 「ニュース」を選択すると、「何のニュースが知りたいか」をさらに聞いてくれる

こんな風に作れば、一問一答のBotよりもはるかに対応力が上がると考えました



# LINEモジュールだけだと1回の対応しかできない！
では、実際にMakeで処理を組み立てていくのですが、
2段階の処理を作ろうとするとこんな問題が起こります

**LINEのモジュールでは1回分の処理しかできない！！！**

その原因は次の通りです

**「LINEのWatch Eventsモジュールは処理の最初にしか配置できない」**

（Makeを使い始めたのはごく最近なので間違ってるかもしれません。。。あくまでも僕が調べた限りの情報なのでご了承ください）

たとえば次のような処理を見てください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/c692d57a-3add-9ec0-5dff-bcee7c729d1c.png)


だいぶ端折りますが、ざっくり言うとこんな処理です

**1.LINEで何かが送られてきたらそれに反応して処理がスタート**

↓

**2.なんやかんやあってLINEでメッセージを返す**


ニュースのやり取りで例えると

**1.LINEで「ニュース」と送信する**

↓

**2.「なんのニュースが知りたい？」とメッセージが返ってくる**

こんな感じです

ここで僕は思いました

**「最後の処理の後にもう一回 Watch Eventsモジュール入れればいいんじゃね？」**

で、結果はこの通りです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/295001b2-01de-6940-8eb1-a689074c8f52.png)

どれだけ探しても Watch Eventsが存在しないんですね。。。


**「Watch Eventsは処理の最初にしか使用できない」**
みたいです。。。


# スプレッドシートに処理の内容を記録
そこで今回使用した方法が

**Googleスプレッドシートとの連携です**

予めこんな感じのスプレッドシートを作成してGoogleドライブの適当な場所に保存しておき、
この処理が実行されるたびにその内容を自動で記録するようにします（処理配置のイメージは後述）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/2e1d2065-855e-8a65-4d78-302756f74224.png)

スプレッドシートの各項目の役割は次の通りです

A列　：実行された処理に番号を振る
B列　：LINE Bot上の選択肢から、どの項目が選択されたかを記録
C列　：「ニュース」を選択した場合に、2段階目の質問時に入力された内容を記録（「ニュース」が選択された場合のみ使用）
D列　：実行された処理のステータスを入れる

処理の流れはこんな感じです

**1.LINEから「ニュース」と送信する**

↓

<font color="Red">2.スプレッドシート内をチェックし、ステータスが未完了のものが無いかチェック</font>

↓

**3-A.未完了の処理が無ければ、通常の処理に分岐**
**or**
**3-B.未完了の処理があれば、2段階目の処理に分岐**

↓

**4.LINEでメッセージを返す**

↓

<font color="Red">5.最終的な処理内容をスプレッドシートに記録</font>

## スプレッドシートへの記録イメージ
実際に処理を動かした後のスプレッドシートはこんな風になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/e20d2fff-e173-35ed-9f26-5dae91ad574d.png)

<dl>
  <dt>1回目の処理</dt>
  <dd>「今日の天気」と入力したので天気を返信して完了（ステータス：done）</dd>
  <dt>2回目の処理</dt>
  <dd>「ニュース」と入力したので「何のニュース？」的なメッセージを返信（ステータス：waiting）</dd>
</dl>

「ニュース」と入力された時にはステータスを'waiting'にすることで、

**「あ、まだ完了していない処理があるぞ」**
とMakeが認識してくれるようになります

では、この動画のように「Toyota」と入力したらどのようにスプレッドシートに記録されるか見てみましょう
![実際の挙動.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/453528e3-a078-2f3e-463e-95ed3ce564bb.gif)



スプレッドシートの中身です↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/08a84e9f-4df7-32ca-3a9b-f59b84f7d459.png)
C列に入力内容が記録され、D列のステータスもdoneになっているのが分かると思います

ここで初めて「ニュース」と入力した場合の処理が完了します

# 実際のMakeの画面
では、実際のMakeの画面はどんな風になっているかというと。。。
![LINE BOT Make画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/579f8478-e460-8809-5920-96fb825a2542.png)
すみません
ごちゃごちゃしてますね。。。

今回説明した<font color="Red">スプレッドシート内をチェックし、ステータスが未完了のものが無いかチェック</font>
というのはこの部分です↓
![Make画面　分岐部分.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467782/7c0d7ac9-e531-6b86-c695-1bee6b7f5a59.png)

* ステータス'waiting'が無ければ上の処理
* ステータス'waiting'があれば下の処理

という風に分岐させています

# 色んな応用ができそう
今回はとりあえずのサンプルとして、天気とかニュースを聞けるようなBotを作成してみましたが、

**「スプレッドシートに処理を記録する」**

というやり方は色んなことに応用できそうです

* LINEのユーザーIDを記録しておくことで、ユーザーごとの情報の登録と呼び出しが可能
* より複雑でより階層の多い分岐処理の作成
* 単純にログとして使用

などなど
まだまだ初心者なのでパッと思いつきませんが他にも色々できそうです

もしみなさんも何か良い活用法が思いつけば是非実践してみてください！

# 今回説明できなかったその他の処理について
また今回は紹介できませんでしたが、
この一連の処理の中では以下のような動作も組み込んでいますので、これらについても気が向けば記事にしようかと思います

* スプレッドシートの内容を読み取る
* スプレッドシートに書き込む
* 条件に合うものがスプレッドシートに複数ある場合にそれらを全て取得する
* 配列形式のデータを1つの文字列に変換する
* LINEに入力された日時を基に対応する日付をスプレッドシート内で検索する

もし個別に質問頂ければ、出来る限りお答えするつもりです

ではまた