【GoogleAppsScript】GASとMessageAPIで作ったLINEbotにゴミ出しのリマインドをしてもらおう！【#1 設計・環境構築】

# ゴミ出しの日を覚えられない
ご覧いただきありがとうございます。
突然ですが、みなさんはうっかりゴミ出しを忘れてしまったことはありませんか？
私はしょっちゅう忘れてしまいます。
ゴミで自宅が溢れかえるのを防ぐために今まで様々なリマインダーを試して来ましたが、
どれもしっくり来ず、思い切って自分で作ることにしました。

今回ご紹介するシステムは完全無料で構築可能です。
ほぼコピペで導入できるので、良かったら試してみてください。

# 記事は3本立てです
1. **設計・環境構築**
    1. ゴミ出しの日を覚えられない
    1. 記事は3本立てです
    1. こんなの作りたい！
    1. LINEとGASを使おう
    1. 仕様決め
    1. 環境構築
1. **ゴミ出しリマインダーを実装する**
    1. ディレクトリ構成
    1. グローバル定数を宣言する
    1. 関数を定義する
    1. 動作確認
    1. トリガーを設定する
1. **通知の一時停止機能を実装する**
    1. ディレクトリ構成
    1. グローバル定数を宣言する
    1. 関数を定義する
    1. リッチメニューを作成する
    1. 動作確認
    1. トリガーを設定する
    1. さいごに

# こんなの作りたい！
- **ゴミ出しリマインダー**
    - ゴミ出しを自動でリマインドする。
    - リマインドは自分と家族（妻）の両方に通知する。
    - 通知のタイミングは、ゴミ出しの前日夜と当日朝とする。
- **通知の一時停止機能**
    - 前日夜にゴミ出しが完了した場合、通知を一時停止できる
    - 間違えて通知を一時停止してしまった場合、通知を再開できる。

# LINEとGASを使おう
今回はLINEbotのMessageAPIとGASを利用することで、システムを構築しました。
これらを採用した理由を解説します。

### LINEbotのMessageAPIを採用した理由
**1. 環境構築が容易**
   LINEbotであれば、クライアント側の環境構築は友達登録だけで完了します。
   また、LINE Developersの操作もWebで完結します。

**2. 複数人に通知を送信できる**
   我が家では夫婦で家事を分担しているため、
   先述の通り、ゴミ出しのリマインドを自分だけでなく妻にも通知する必要があります。

**3. リッチメニューにURLを埋め込める**
   後述の通り、通知の一時停止機能は特定のURLにアクセスすることで呼び出すことが可能です。
   リッチメニューに該当のURLを埋め込むことで、ボタン一つで機能が利用可能になります。

### GAS(GoogleAppsScript)を採用した理由
**1. 環境構築が容易**
   GASの利用に環境構築は不要です。
   Googleアカウントを所有していれば、ブラウザ上で、しかも無料で利用することができます。

**2. 自前でサーバを用意する必要がない**
   サービスの仕様上、サーバは常時稼働させておく必要があります。
   ローカル環境では電気代がかかりますし、EC2等クラウド上に構築するのでは利用料がかかります。

**3. 「トリガー」機能で自動実行が可能**
   サービスの仕様上、特定の時間に自動で処理を実行する必要があります。

# 仕様決め
それぞれの機能について解説します。
## 機能1 : ゴミ出しリマインダー
![スクリーンショット 2023-01-21 15.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/768347a8-19e2-6f05-0700-1e15f367ecd6.png)
※図の曜日は一例です。

### 特定の時刻に処理を実行する。
ゴミ出しの前日夜と当日朝に自動で処理を実行します。
例えば木曜日が燃えるゴミの日だとして、水曜日の20時、22時、木曜日の0時、7時に自動で処理を実行します。
今回はこの機能を実現するために、GASの「トリガー」機能を利用しました。

### 通知の可否を判定する。
後述の「通知の一時停止機能」に関連する機能です。
処理を開始する際、通知の可否を判定します。
通知可能な場合は通知送信の処理を実行、不可の場合は何もせず処理を終了します。

例えば水曜日の20時にゴミ出しが完了した場合、以降の3回の通知は不要ですよね。
「通知の一時停止機能」を利用することで、それ以降の通知を停止することができます。

### 時刻を取得する。
前日夜と当日朝では処理が異なります。
前日夜の場合は、翌日の曜日を取得した上で「明日は〇〇ゴミの日です。」という通知を送信します。
当日朝の場合は、当日の曜日を取得した上で「今日は〇〇ゴミの日です。」となります。

時刻によってどちらの処理を行うかを判別します。

### 曜日を取得する。
曜日を取得することで送信するべきメッセージを判別します。
また、段ボールゴミなど、隔週でのゴミ出しになる物は週番号を取得し、通知を送信するか、何もせず処理を修了するかを判別します。

### 通知を送信する。
通知を送信し、処理を終了します。

## 機能2 : 通知の一時停止
### 通知の可否を更新する。
![スクリーンショット 2023-01-18 20.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/d9fd9f5c-9f9c-a06c-cfc2-fcc4c71bb2fe.png)
先述の「通知の可否を判定する」機能に関連する機能です。

例えば水曜日の20時にゴミ出しが完了した場合、以降の3回の通知は不要ですよね。
「通知の一時停止機能」を利用することで、それ以降の通知を停止することができます。
また、間違えて一時停止してしまった場合は、再開することも可能です。

通知の可否を判別し、通知が可能な場合は通知を一時停止、
通知が一時停止されている場合は通知可能な状態に変更します。

この機能を実現するために、GASをウェブアプリとしてデプロイし、LINEbotのリッチメニューに埋め込むことで任意のタイミングで機能を呼び出せるようにしました。

## 機能3 : 通知可能な状態に更新する
![スクリーンショット 2023-01-18 20.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/28492715-f857-ba32-ae00-cf4ecfc564d2.png)

例えば、木曜日の燃えるゴミを水曜日に完了して通知を一時停止しても、
金曜日が燃えないゴミの日だったら、ずっと通知不可のままだと困りますよね。
木曜日の夜にはまた通知可能な状態にしなければいけません。

そのため、毎日特定の時刻に通知の可否をリセットする機能を実装しました。

# 環境構築
開発環境を構築します。
### 前提条件
GoogleとLINEのアカウントは既に持っているものとします。（どちらも個人用のものでOKです。）

### LINE側で必要な設定
時期によって仕様が変わっているかも知れませんが、最終的に以下の3つができればOKです。
- LINEbotを作成
- LINEbotを友達登録
- チャンネルアクセストークンを取得
- ユーザIDを取得

LINE Developersにアクセスします。

https://account.line.biz/login

「LINEアカウントでログイン」をクリックして、既にお持ちのLINEアカウントで認証してください。
![スクリーンショット 2023-01-21 14.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/e2b24921-e67f-8540-9efa-56e53c88d00c.png)

このようなページが表示されます。（2023年1月現在）
![スクリーンショット 2023-01-21 14.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/6eed78eb-8e59-be84-be5b-62cd5dedb440.png)

「Messaging API」をクリックします。
![スクリーンショット 2023-01-21 14.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/f1affafc-846d-c082-5a29-be8124c5f9c5.png)

「今すぐはじめよう」をクリックします。
![スクリーンショット 2023-01-21 15.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/5c305e17-866c-5598-ae66-c0da2a45f884.png)

「新規チャンネル作成」という画面が表示されるので、必須項目を入力していきます。
チャネルの種類：Messaging API
プロバイダー：新規プロバイダー作成
その他：任意の値を入力
![スクリーンショット 2023-01-21 15.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/cf5162d2-bae6-dba6-fe26-b3504a7d8687.png)

「作成」をクリックします。
![スクリーンショット 2023-01-21 15.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/e5f7977d-777f-896a-bf38-cde24031a19c.png)

チャンネルの設定を開きます。
![スクリーンショット 2023-01-21 15.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/18541fb8-5e69-f9a9-f8cb-a75362a621d3.png)

チャンネル基本設定 → あなたのユーザID より、ユーザIDを取得します。（どこかにメモしておきましょう。）

Messaging API設定 → QRコード　を読み込み、LINEbotを友達登録します。

Messaging API設定 → チャネルアクセストークン　より、チャネルアクセストークンを取得します。
表示されていない場合は、「発行」をクリックします。

以上でLINE側の設定は完了です。



### Googleドライブで必要なファイルを作成
![スクリーンショット 2023-01-18 23.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/6b74d7a7-e246-cc67-3887-d27f7c89473d.png)
Googleドライブ内のお好きなフォルダで2つのファイルを作ります。
1. Googleスプレッドシート (新規 → Googleスプレッドシート)
1. Google Apps Script (新規 → その他 → GoogleAppsScript)

どちらも好きなタイトルで構いません。
![スクリーンショット 2023-01-18 23.37.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/fbf71846-baa2-c5f0-dd26-0953096a25b2.png)

スプレッドシートを開き、「シート1」のA1セルに半角で「0」と入力しておきます。
![スクリーンショット 2023-01-21 15.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115841/166e0722-a863-450e-ea25-4eaf98727e43.png)

以上で環境構築は完了です。
次回はいよいよ、機能を実装していきます！