３日坊主になんてもうさせない！日記アシスタントLINE Bot「日記ちゃん」

### :frowning2: 10年日記とかやってみたいけど、続いた試しがない・・・！

初めて日記を書いたのは小学校低学年の時、3日坊主どころか2日坊主だった私。大学時代に留学した時には、留学の記録を残そうと出発当日から日記を書き始めるも、到着した後は全く書かないというまさかの1日坊主！

それでも日記が書きたい！~~彼氏とのデート記録をつけて、あとからうふふって振り返りたい！！~~ 業務日報とか溜めちゃって、いつもバタバタと数日分まとめて書いちゃうタイプの人でも**コツコツ書き込める方法**や、よく現場を巡回する人が**チームで情報を共有するツール**があったら便利ですよね。ほら、PCとかなくても簡単に書き込めるし。

ということで・・・
## ノーコードツールmakeと出会って5日の私でもできました！日記を簡単にしてくれるLINE Bot

### :information_desk_person_tone1:LINE Bot「日記ちゃん」完成形
さっそく完成形を見てください！
かわいい日記アシスタントができました。

https://x.com/tabisurujapaniz/status/1823285607583600880

### :information_desk_person_tone1:「日記ちゃん」にできること
・LINEに日記を送ったら、日付と一緒に保存してくれる
・日記が書けたらほめてくれる
・読みたい日付の日記を取り出して見せてくれる

### :information_desk_person_tone1:makeのシナリオ全体像
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/d4decf13-3778-751a-9354-c247b258c4aa.png)
**1⃣メッセージを受け取る**
↓
**フィルター❶：メニュー指定ワードを除外する**
ユーザーは「日記を書く」「日記を読む」のうちどちらかを最初に入力します。入力しなくても２つの機能は使用できますが、**日記検索の形式の指示**と**それっぽさの演出**のために導入しています。この２ワードはこれより先に進まないようにフィルターします。
↓
**2⃣日記内の日付欄を検索する**
「日記を書く」アクションなのか、「日記を読む」アクションなのかの判別はさておき、既に書かれた日記の日付欄から、メッセージと合致するものがないか検索していきます。
↓
**フィルター❷：「日記を書く」と「日記を読む」どちらのアクションか判別**
ユーザーが日記を読む場合には日付を入力⇒検索結果がヒット⇒モジュール3⃣へ
ユーザーが日記を書く場合には文章を入力⇒検索結果がヒットしない⇒モジュール4⃣へ
↓
**3⃣特定の日付の日記の内容を返信する**
「日記を読む」に対して、検索された日付の日記の内容を返信する。

**4⃣日記を書き込む**
「日記を書く」に対して、投稿日時と日記の内容を記録する。
↓
**5⃣日記の保存完了を報告して褒める**

---
### 0. LINE Official Account Managerでの設定
まずはLINE Official Accocunt Managerのアプリ/サイトで、**リッチメニュー**と**応答メッセージ**の設定をします。
![WhatsApp Image 2024-08-11 at 20.23.08_1fa6b097.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/568ea403-d7ad-f744-26d9-8d6ad2d34fa1.jpeg)

#### リッチメニュー
トーク画面に表示させて、ユーザーがタップでアクションを起こせるようにします。今回は２つのボタンを設定していて、それぞれ「日記を書く」「日記を読む」というテキストを即送信するボタンにしています。
#### 応答メッセージ
特定のテキストが送られてきた場合に、決まったテキストで応答する機能です。今回は「日記を書く」「日記を読む」の２種類のテキストに対して、自動応答を設定しています。

以下の画像の最下部の２つのボタンがリッチメニュー、「日記を読む」への返答「まかせて～」が応答メッセージです。

![WhatsApp Image 2024-08-11 at 20.28.04_a45ed94d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/39bd98b9-f2e7-b787-5a6b-38b4c4eb3ed7.jpeg)

---
### 1. モジュール1⃣＆フィルター❶：LINEメッセージを受信して判別
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/d4decf13-3778-751a-9354-c247b258c4aa.png)

#### 使用モジュール
・LINE Watch Events

トリガー（シナリオスタートのきっかけ）をLINE Watch Eventsに設定し、モジュール2⃣のGoogle Sheets Search Rowsをつなげておきます。

次に、モジュール1⃣と2⃣の間のルートにフィルターを設定していきます。これは、先ほどのLINE Official Account Managerで設定しておいた「日記を書く」「日記を読む」というメニュー選択のテキストに対して、シナリオが反応しないように除外するためです。

設定は以下の通り。
このとき、各キーワードに対するルールが必ず“Text operators: Not equal to”になっていることと、もう１つのルールは“and”で追加することに注意してください。
そうでないと、フィルターをすり抜けて、日記に「日記を書く」「日記を読む」と書かれてしまいます(笑)

![WhatsApp Image 2024-08-11 at 21.05.19_5f40e0f2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/ce24f282-1fff-38cf-bd9c-099b4c7ac911.jpeg)

### 2. モジュール2⃣：メッセージと合致する内容をSpreadSheetで検索
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/d4decf13-3778-751a-9354-c247b258c4aa.png)

#### 使用モジュール
・Google Sheets Search Rows

リンクするGoogle Spreadsheetは、事前に自分のGoogle Driveに作成して、シート名と列タイトルを入力しておいてください。

**・Sheet1（書き込み用）**：A列にタイムスタンプ、B列に日記が追加されるように作成。
**・Sheet2（検索用）**：Sheet1のタイムスタンプはグリニッジ標準時で押されるので、日本時間での日時に合わせて表示するよう転記（ここが面倒くさいポイント）

![WhatsApp Image 2024-08-11 at 22.34.40_67c17ac9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/50ccf765-ea1b-eb66-3b5e-0de7751825e5.jpeg)

#### Google Spread Sheet Sheet2（検索用）での関数設定
:::note warn
後々のステップで作成する「日記を書く」アクションでは、新しいデータの「書き込み」ではなくAdd a Rowつまり行の追加が行われます。元のシートから情報を転記する場合にはINDIRECT関数を使用します。
:::

転記をするときに =A2 などと直接セル番号を入力してしまうと、「日記を書く」＝行の追加が行われて、セル番号と参照先がどんどんずれてしまうんです。（これ伝わるかな・・・？）
 
INDIRECT関数を使って、行番号と列番号を固定で指定することで、このずれが起きなくなります。
Sheet1（LINE Botから情報が追加されるシート）のA列の内容を転記したい場合は以下の関数を転記先のセルに入力します。この方法でタイムスタンプと日記の内容をSheet2に転記します。
```ruby:行列を固定して転記
=INDIRECT("Sheet1!A"&row())
```

つぎに、タイムスタンプを日本時間での日付に直す作業です。
同時に、後からデータを検索するとき（「日記を読む」アクション）の都合上、テキストのフォーマットに変更しておきます。

```ruby:日付（日本時間）－ B列
=TEXT(DATEVALUE(MIDB(A2,1,10))+TIMEVALUE(MIDB(A2,12,8))+TIME(9,0,0),"yyyymmdd"
```
```rbby:時刻（日本時間）－ C列
=TEXT(DATEVALUE(MIDB(A2,1,10))+TIMEVALUE(MIDB(A2,12,8))+TIME(9,0,0),"hh:mmAM/PM"
```
ここには5つの関数を使いました・・・勉強になる・・・

・TEXT：値の形式を文字列にする
・DATEVALUE：日付を指定する
・TIMEVALUE：時刻を指定する
・TIME：時間を足したり引いたりする(時,  分, 秒) 日本はグリニッジ+9時間
・MIDB関数/MID関数：文字列から必要な部分を切り出す(元にするセル, ○文字目から, ○文字を抜き出す) 
※MIDBだとバイト数で数えられて、MIDだと文字数(半角でも全角でも1文字は1文字)で数えられる。

最後にこれらの情報が入った4列を一番下までコピーしておきます。
（私は4000行にしたので10年くらい日記書けます）
A列とD列にはINDIRECT関数、B列とC列にはタイムスタンプを変換する関数を入れて、日記が書かれた後の表示はこんな感じになります↓
![WhatsApp Image 2024-08-11 at 22.38.03_0b330096.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/a64ce7dd-b43b-ff55-a675-52fd6020cc51.jpeg)

#### Google Sheets Search Rowsモジュールの設定
ここは検索用シートの設定なのでSheet2を選択します。
また、フィルターでは次の２つの条件を設定していきます。

・指定した列（ここではB列の日付）に値が存在する　かつ
・指定した列がLINEのメッセージと一致する

詳しい設定は以下の通りです。
![WhatsApp Image 2024-08-11 at 22.30.04_597c17f4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/ff9a97ee-a53b-8744-aaee-50d14b6a90f9.jpeg)
![WhatsApp Image 2024-08-11 at 22.31.24_d4f0de94.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/caa4f645-e669-c9a6-a6b9-7a9aaff73e4e.jpeg)
![WhatsApp Image 2024-08-11 at 22.32.09_a54ebca6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/b9649482-c85a-8955-19e3-ce06685bd123.jpeg)

---
### 3. フィルター❷：検索結果がヒットする/しない場合で分岐
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/d4decf13-3778-751a-9354-c247b258c4aa.png)
ルーターを追加して、それぞれのルートに条件を設定します。

#### 「日記を読む」モジュール3⃣へのルートの設定条件
・LINEメッセージの内容が存在する　かつ
・日付の検索結果がヒットする

設定は以下の通りです。
![WhatsApp Image 2024-08-11 at 23.40.49_967af5a1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/8792d8ca-28c1-9d29-009b-f06f3ce2d4ce.jpeg)

#### 「日記を書く」モジュール4⃣へのルートの設定条件
・日付の検索結果がヒットしない

設定は以下の通りです。
![WhatsApp Image 2024-08-11 at 23.41.07_3d355f2e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/a695912d-97e8-146e-8910-b0a96de7ad5c.jpeg)

***
### 4. モジュール3⃣：見つかった日記をLINEメッセージで返信
#### 使用モジュール
・LINE Send a Reply Message

検索した日付の日記の内容を２つのメッセージで返信します。
設定は以下の通りです。
![WhatsApp Image 2024-08-11 at 23.52.44_d628566a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/9c9b7965-5e32-dc09-f151-413a13779b47.jpeg)
![WhatsApp Image 2024-08-11 at 23.53.20_c498220c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/1057ecaf-d1c4-13f8-7707-4abec2315adc.jpeg)

***
### 5. モジュール4⃣：メッセージ内容をSpreadSheetに転記
#### 使用モジュール
・Google Sheets Add a Row

送られたメッセージの内容を日記として登録します。
同時に送信された時刻のタイムスタンプも記録します。
設定は以下の通りです。
![WhatsApp Image 2024-08-11 at 23.59.51_978d1a74.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/f7b7704a-de2b-5e43-5ae2-f2c90a885d66.jpeg)
![WhatsApp Image 2024-08-12 at 00.00.08_ef9f7648.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/ee07c698-cd82-0fb5-7f92-b18050e84365.jpeg)

***
### 6. モジュール5⃣：保存したことを誉め言葉とともにLINEメッセージで報告
#### 使用モジュール
・LINE Send a Reply Message

記録完了したこととお褒めの言葉を返信します。
設定は以下の通りです。
![WhatsApp Image 2024-08-12 at 00.03.14_72613123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/b069bce0-be1d-e796-aed5-e13e5d76a30f.jpeg)

***
### :confetti_ball:できた！！！
色々と試行錯誤しながら、かわいいかわいいオリジナルLINE Botができました💖
このbotは最終的にはAI連携しないことにしましたが、制作途中でChatGPTとつなげてみたりと色々な可能性が見えました。
makeを知って5日でここまでできたので、これから色々挑戦してみたいと思います！
（ところで、LINE Botをつくるよりも、この記事を書く方がよっぽど時間がかかりました:sweat_smile:）

### :gear: 追記: 去年の今日の日記を見せてくれる機能を追加

この「日記ちゃん」、今の段階では日記を読むために、日付を指定して呼び出す必要があります。でも本来の日記のいいところって、去年と今年の変化を見て「ああ、私も成長したな」「去年はこんなにがんばってたのに、最近はだらけているな」とか、感じられるところだと思うんです！

そこで、日記を書き込むと“去年の今日”の日記を見せてくれる機能を追加してみました。

LINEの画面はこんな感じ↓
![WhatsApp Image 2024-08-18 at 12.19.20_05d51e77.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/3c70e15f-6220-2810-f423-f28293024a0f.jpeg)

去年の私は不健康だったのに、今年の私は元気に推し活している！！！
成長！！！というより、整腸・・・？

makeのシナリオの変更点は２つだけ！

・GoogleSheets Get a Cellのモジュールを追加
・LINE Send a Reply Messageに返信の内容を追加

![WhatsApp Image 2024-08-18 at 12.30.41_f51e6781.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/85c8e201-57a7-ddf9-f617-7280a8e44dd9.jpeg)

### 1．Google Sheets Get a Cellモジュールの追加

makeでの設定は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/890c9701-dcb8-11f7-b069-742ab07cb24b.png)

Sheet2のI1を参照するわけですが、そこに何が書いてあるかというと・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/511f2c3f-e0da-7fee-eaa2-143a211aa416.png)

去年の日記が書かれています。
H1とI1それぞれの使用関数はこちら。
```rbby:去年の今日の日付（H1）
=year(today())-1&text(today(),"mmdd")
```
こちらは、今年－１の年の今日と同じ日付を出す関数です。

```rbby:去年の今日の日記（I1）
=xlookup(H1,B:B,D:D,"書いてなかったみたいね・・・",0,1)
```
こちらは、日記上でH1の日付を検索して、去年の今日の日記を探してくる関数です。
"書いていなかったみたいね・・・"は、検索に該当する日付がなかった場合に返される文字列です。
これを書いておくことで、日記を書いていなかった場合でも、２で設定するLINEでの返信に自然につなげることができます。

### 2. LINE Send a Reply Messageの返信内容追加

返信項目のItem1には、日記を保存したことを報告する文が入っているので、Item2を追加して、ここにGet a Cellの結果を返すようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/ba2a9d81-7827-1c22-7f38-b28b053afb6c.png)

さて設定はこれで完了です。
毎回日記を保存したときに、去年の日記をひっぱってきて見せてくれる新たな「日記ちゃん」！
これで私の10年日記がどこまでも続いていくはず！！

## おまけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819429/f6b61a0c-0079-cedd-6d11-259bdb428212.png)

スプレッドシートを編集して、
・明確な日付は覚えてないけど、この辺の時期の出来事を振り返りたい
・連続した期間を見たい
・もっと昔の日記が見たい

そんなときに見やすいように、Sheetを追加して年別で見られるようにしてみました。日記をパラパラめくる感覚ですね。

それではみなさん、良き日記・日誌ライフを～！