新年早々、自分の行動をLINEでスプレッドシートに記録できるようにした

## はじめに
2023年がスタートしました！今年は、自分のスキルアップや健康管理のための行動を積極的にやっていこうと思っています。それをやっていくにあたり、振り返りをしたり、記録を継続していくためのモチベーションを維持するため、自分の行動を記録に残しておこうと思いました。

記録を残す媒体は、後々集計や管理が楽になると思ったのでGoogleのスプレッドシートを採用しました。また記録する方法は、だんだん面倒くさくなっていくことを考慮して、LINEを使って行うようにしました。今回は、この一連の方法を記事に残したいと思います。

## 新年早々、自分の行動をLINEでスプレッドシートに記録できるようにした
### 完成したもの
今回行ったことは、Messaging APIとGASを使って、LINEに送られたテキストをスプレッドシートに記録するという簡単なものです。

LINEでメッセージを送ると、登録が完了したとメッセージが返ってきます。
![LINE_capture_694337383.229189.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/d9f4c790-463a-85d7-839b-16cce34dc729.jpeg)

送られたメッセージは、以下のようにスプレッドシートに記録されます。
![スクリーンショット 2023-01-02 16.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/08756730-c9fd-3cac-05f3-4573d3860aa3.png)

### 手順
#### LINE関連の準備
まずは、[LINE Developers](https://developers.line.biz/ja/)のコンソールにログインして、記録用のチャネルを作成します。プロバイダを作成していない方はプロバイダを作成し、プロバイダからチャネルを作成します。作成する際に、Messaging APIを選択します。選択した後に、チャネル名などの入力が求められるので入力をします。

![スクリーンショット 2023-01-02 16.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/8f39bdb2-b31f-46a8-723e-b1da2b5d73ea.png)

![スクリーンショット 2023-01-02 16.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/8ba19d1d-0152-471e-3d5c-95c1b48cf4b2.png)

チャネルの作成が完了した後に、Messaging APIの設定をしていきます。作成したチャネルから、Messaging API設定をクリックします。ここでは、QRコードやWebhook URLの設定、アクセストークンの取得ができます。

ここでやっておくべきことは、以下です。
- QRコードを使って友達登録をする
- Webhook URLを設定する（デプロイ後）
- LINE公式アカウント機能　> 応答メッセージを無効にする
- アクセストークンを取得する

上記ができたら、LINEで行うことは一旦完了です。

#### コードを書く
次は実際にコードを書いていきます。

まずは、LINEで送られてきたテキストをスプレッドシートに記録する関数を用意しました。今回スプレッドシートには記録する内容は、日時、行動の内容、行動の補足にしました。補足は、内容の後に改行を入れて、その後に入力されたものを補足とすることにしました。入力もマストではないことにしています。

![LINE_capture_694340407.443318.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/dffceab9-5de7-44e9-8894-2d560ed75640.jpeg)

LINEでメッセージを送信した時に返ってくるオブジェクトの中身がどういったものかは、以下のドキュメントを参考にしました。

https://developers.line.biz/ja/reference/messaging-api/#message-event

今回は、時間を記録するために`Day.js`というライブラリを使いました（正直使わなくても良いと思います）。オブジェクトにタイムスタンプがあったりしますが、そこまで厳密にやる必要もないなと思ったので、関数が実行されるタイミングの時間を記録しています。ライブラリの追加方法に関しての説明は割愛します。

```js
const recordMessage = (message) => {
    // 記録するスプレッドシートを指定する
    const sheet = SpreadsheetApp.getActiveSheet();

    // 正規表現を使って、改行があれば先頭のものを行動の内容、後のものを補足とする
    const regex = /\n/;
    const result = message.split(regex);
    const content = result[0];
    const detail = result.length == 1 ? '' : result[1];

    // 時間を指定
    const time = dayjs.dayjs().format('YYYY-MM-DD HH:mm:ss');

    // 時間や行動の内容、補足を記録するセルを指定する
    const lastRow = sheet.getLastRow() + 1;
    const timeRange = sheet.getRange(lastRow, 1);
    const contentRange = sheet.getRange(lastRow, 2);
    const detailRange = sheet.getRange(lastRow, 3);
    
    // 時間や行動の内容、補足を記録する
    timeRange.setValue(time);
    contentRange.setValue(content);
    detailRange.setValue(detail);
}
```

次に、LINEからテキストを受け取り、テキストの記録と返信を行う関数を用意していきます。返信する際には、`replyToken`やURLが必要になります。それ以外は、普通にメッセージを送信したりするのとあまり変わりません。

```js
const doPost = (e) => {
    // アクセストークンはプロパティサービスを使い呼び出す
    const accessToken = PropertiesService.getScriptProperties().getProperty('ACCESS_TOKEN');
    
    // 返信に使用するURL
    const url = 'https://api.line.me/v2/bot/message/reply';

    // 受け取ったオブジェクトから、返信するためのトークンやメッセージを変数として格納する
    const data = JSON.parse(e.postData.contents).events[0];
    const replyToken = data.replyToken;
    const sentMessage = data.message.text;

    // 返信の内容などを設定する
    const payload = {
        'replyToken': replyToken,
        'messages': [{
            'type': 'text',
            'text': '登録が完了しました！'
        }]
    };

    const options = {
        'payload' : JSON.stringify(payload),
        'myamethod'  : 'POST',
        'headers' : {"Authorization" : "Bearer " + accessToken},
        'contentType' : 'application/json'
    };

    UrlFetchApp.fetch(url, options);
    recordMessage(sentMessage);
}
```

最後にコードをデプロイし、デプロイ後のURLをWebhook URLとして設定してあげて完了です！Webhook URLの設定は、[LINE Developers](https://developers.line.biz/ja/)のMessaging API設定から行うことができます。

## さいごに
今回は、行動をLINEでスプレッドシートに記録する方法をまとめてみました。1年間の行動を振り返るのが楽しみです。