「晩ごはんのメニュー決め」という妻の悩みをLINE Botが手助けする

# 発端
平日、妻が一番悩むのは「晩ごはんのメニュー」だという。

「ぐぐったらいろいろ出てくるんじゃないの？」と答えてみたところ、以下のように４倍返しされた。

妻、曰く

- ネットで見つかるのは「レシピ」が多く、手元にない材料が出てきても困るだけ
- 子供も食べれるものを求めているのに、ググって出るのは大人向けのメニューばかりで使えない
- そこで子供向けでぐぐると「ケチャップ多めで子供も満足」といったレシピが出てくるが、子供たちは濃い味付けが苦手でマッチしない
- 今ある材料と経験をもとにして自分が作れる料理を知りたいのであって、新しい料理を知りたいわけではない

ということで、晩ごはんメニュー決めにネットは全くアテに出来ないらしい(もちろん新しいメニュー開拓時は除く)。

同じような話はネット界隈にごろごろしていて、世の奥様方は毎日悩ませている問題というのはよくわかったので、少なくとも妻を救えるものはできないものかと思って手を動かしてみた。

# 仕様
大枠は以下の3点とし、ちょこちょこ作っては試しての試行錯誤を繰り返して、肉付けしていった。

- 普段よく使っているLINEをインタフェースにする
- 極力、文字入力することなく、ボタンぽちぽちで遷移する
- 料理データは我が家オリジナルの情報を蓄積・参照できること

ユーザの扱いとかデータの流れはLINEに任せつつ上に作りたいものを乗せるだけで、あっという間に「スマホを使ったなにか」を実現できるというのは本当に楽。

# 方式
先日作ったLINE Botは「LINE＋Node.js(heroku)]だったが、今回は料理データを蓄積する必要があったので、ひとまず「LINE＋Google Apps Script(GAS)＋Googleスプレッドシート」で手軽に実現することとした。

LINE Bot＋GASについてはQiitaを始めとしていろんなところで公開されているので実現性は心配なかった。

参考：

- [Google Apps ScriptでLINE BOTつくったら30分で動かせた件](https://qiita.com/hakshu/items/55c2584cf82718f47464)
- [GAS × LINE Messaging APIで画像も音声もわかる攻略botを作った話](https://qiita.com/zawascript/items/319c37f3b4c6243b6164)
- [【LineAPI×GAS】bot作成時における動作しない（応答しない）時]
(https://qiita.com/japwork/items/1e4b3ac39c404c466fc0)

しかし、文字入力を避けるために「クイックリプライ」を使えるようになるまでは結構躓いた。おかげでLINE Messaging APIの仕様の理解が進んだので結果オーライだったとは思うが。

# 機能
自分の思い付き＋妻のコメントを組み入れていって、現時点ではこんな機能を実装した。

- 今日の晩ごはん＞肉・魚・野菜などを選ぶ＞材料などを選ぶ＞料理名を複数提示
![qiita_20201207_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/3623aa18-c92b-45ad-f975-a60522034ca7.png)

- 今の気分＞がっつり・さっぱりなどを選ぶ＞料理名を複数提示
![qiita_20201207_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/193f561d-0b93-6652-838a-fa26c5047c74.png)

- 何食べた＞過去１週間分の晩ごはんを列挙
![qiita_20201207_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/90f31b04-c4fd-8588-9ae6-450163acd02f.png)

当初は文字入力が必要であったが、現段階ではLINEリッチメニューおよびクイックリプライによってボタンのみで遷移できるようになった。

一方、日々の晩ごはんについてはスプレッドシートに手動で記録することを考えたが、絶対に登録するのを忘れると思ったので、暫定的にLINE経由で登録・削除できるようにした。

- 「料理名」を文字入力＞当日の晩ごはんとして登録
- 「削除」と文字入力＞最新の晩ごはんを１件削除

また、データについては

- 肉、野菜、がっつり、さっぱり、ぶた、とりといった選択肢のリスト
- 選択肢に則した料理のリスト
- 晩ごはんの記録(日付、料理名)
- Botが返すメッセージリスト

をGoogleスプレッドシート1ファイル・別シートで保存した。

最初は動きを見るためにプログラムにメッセージやデータを直に書き込んでいたが、徐々にスプレッドシートに外出ししてプログラムを書き換えずに済むようにした。これで、現時点では料理データさえメンテすれば、我が家オリジナルで運用できる状態にはなった。

# 苦労したところ
本記事で一番言いたいこと。

GASやLINE Bot、Messaging APIについて調べればたくさん情報が出てくるのだが、デバッグ以降の手番で苦労した。ちゃんと調べればいい方法があったのかもしれないが、なんか同じような問題にぶち当たってる情報が目立ってなかなか解決方法が見つからなかったので、とりあえず人力で対応することとした。

- LINEからのメッセージ受信してのGASのデバッグができない？
doPost()でメッセージ受信後の動きをデバッグしようにも、受信したデータ実体がないためエラーとなる。なので、ロジックとLINEとのI/F部分は切り離し、ロジックはダミーデータで確認する一方、LINE I/Fはぶっつけ本番でやった。デバッグ用に受信データのダミー作ればいけるだろうが、~~面倒だった~~疎通確認にはならないので見送った。

- GASで公開した版に合ったプログラムに戻せない？
スケジュール機能を追加した辺りでLINEとのI/Fが必ずエラーになってしまう事象にぶつかり、原因がわからず元に戻そうとしたのだが、<B>公開APIの版数は戻せてもそれに合ったプログラムに戻す方法がわからなかった。</B>なので、今は区切りがいいところで全コピして手動保存している。

なお、エラーの原因は変数名を一括置換した際にLINEへ応答するメッセージの一部まで書き換わってしまったという単純なものだったが、上記にある通りデバッグがしづらくて原因追及も難しく、いたずらに時間を使ってしまった(１時間以上迷走した)。

LINE＋GASはちょっと実装・確認するにはお手軽ゆえ他にもやってみたいことが出てきたので、そのときに備えてGAS APIのよいデバッグ方法があったら知りたいところ。

# やりたいこと
現時点で動くものができたのは満足なのだが、こんなこともやってみたい。

- 材料に紐づいた料理を列挙するのではなく、最近食べたものがあったらそれを提示するようにしたい(５日前にカレーたべたよーとか)
- 文字ばっかりでさみしいので、リッチメニューを画像にしたり、クイックリプライのボタンにアイコンを設定したい
- やる意味あいは薄いのだが、現状では我が家オリジナルしかデータを持てないので、複数ユーザでも対応できるようにしてみたい
- 晩ごはんの登録・削除はもうちょっとなんとかしたい
- (妻からのリクエスト)選択に関係なく、最近食べていないメニューを教えてほしい

しかし、その前につぎはぎ状態でソースが汚いので、一旦きれいにしないと。
おんなじコード、どんだけ書いてるんだか。
 
# おわりに
作成中、ちょこちょこ妻に使ってみてもらったところ、あれやこれやとたくさんアイデア・要望を貰えたので、普段、如何に苦労しているかがよくわかった(お肉の下に「ひき肉」を選びたいと言われ、その観点はなかったなーと目からウロコだった)。やはり課題を持ってる人に使ってもらってこそ、ブラッシュアップはできるなーと。

些細なことだけど、普段使ってるITで実現できる(しかも無料の範疇で)というのは面白いものです。

なお、記事中の画面にある料理名は開発中のものであり、実際の食生活を表しているものではありません。