[LINE BOT]GASで家計簿BOT作ってみた

アドカレ

この記事はアイスタイル Advent Calender 2020の21日目です。

はじめまして、ブランドオフィシャル開発部に所属している新卒一年目のshirakihです。
普段は、「Brand Official」 というサービスに携わっており、主に保守・運用を行っています。

はじめに

 さて、今回初めてのアドカレということで、せっかくなので何か作ろうと思い、自分でも簡単に使えるGASを使って家計簿BOTを作成してみました。

なぜ、家計簿BOTにしたかというと、欲しいものがあるのにお金がないということに最近気づいたからです。笑
家計簿をつけてないということもありますが、毎週、遊びに行ったり、飲みに行ったりしてないのに何にお金使っているかがわからないんですよね…

ということで、この機会に何にお金を使っているのかを可視化できる「支出君」というLINE BOTを作成してみました。簡単なやってみた系の内容になるので、気軽に楽しみながらご覧頂けたらと思います!

目次

  1. 機能
  2. 環境
  3. 作ってみた
  4. 結果
  5. 最後に
  6. 参考資料

1.機能

機能は、下記の3つでシンプルな実装にしました。

  1. 朝、昼、晩にpush通知
    ただ単に入力して記録するだけの機能だと、めんどくさがりな私は100%続けられないので、
    「支出君」には、push通知機能を付けました。
    朝昼晩の3回にした理由としては、一日でよくお金を使うタイミングは、ある程度決まっているからです。
    出社していれば、朝コーヒーを自販機で買う、ランチに行く、夜ご飯は外食といった流れが多く、
    お金を使うタイミングで声をかけてもらうことで家計簿に入力しやすい状態を作り出せるのではと思います。

  2. カテゴリに分けて記録
    カテゴリが多いほうが、詳細な内訳がわかると思いますが、
    とりあえず大雑把にお金の流れをつかみたかったので、一番無駄にお金を使っていそうな「食費」と「日用品」の2つにしました。

  3. サマリの通知
    一日の終わりに通知をしてくれる機能です。

2.環境

今回は、情報が豊富にあり、サーバーレスで作成可能な「LINE+Google Apps Script(GAS)+Googleスプレッドシート」で実現することにしました。
サーバを立てる必要もないですし、webhookをつなぐだけで通信ができるのでとても楽に開発ができたと思います。

3.作ってみた

大きく分けて以下の3つです。
1. LINEdevelopersに登録し、botを作成
2. Googleスプレッドシートの作成
3. GASでコーディング

1. LINE Developersに登録しbotを作成

まず、LINEのbotなので、LINE developersで必要な登録と設定を済ませます。
他の方がわかりやすく書いて下さっている記事がたくさんあるので詳細は、割愛します。
こちらのChannelを作成するまでを参考にさせていただきました。

2. Googleスプレッドシートの作成

次にGoogeスプレッドシートを新規で作成し、下記のようにシートを作成します。
カテゴリごとのシートとサマリのシートを作成します。

3. GASでコーディング

いよいよ、コーディングです。
シートの作成ができたら、ツールからスクリプトエディタを選択します。

下記のようにGASが開くので、エディタにbotの内容を記述していきます。

今回のコード(長くなるので一部抜粋)

var ACCESS_TOKEN = 'LINEのアクセストークン';
var ID = 'スプレッドシートのID';
var URL = 'https://api.line.me/v2/bot/message/reply'; // 応答メッセージ用のAPI URL

/**
 * doPost
 * ユーザーがLINEにメッセージ送信した時の処理
 **/

function doPost(e) {
    //JSONをパースする
    var json = JSON.parse(e.postData.contents);

    //返信するためのトークン取得
    var reply_token = json.events[0].replyToken;
    if (typeof reply_token === 'undefined') {
        return;
    }

    //送られたLINEメッセージを取得
    var user_message = json.events[0].message.text;
    var message_parameter = user_message.split(/\r\n|\n/);
    var post_message = "";
    var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年MM月dd日');

    if (message_parameter[0].match(/^食費\n*/)) {
        post_message = costFood(message_parameter, date);
    }
    else if (message_parameter[0].match(/^日用品\n*/)) {
        post_message = costDairyNecessities(message_parameter, date);
    }
    else if (message_parameter[0].match(/^いくら?$|今いくら?$/)) {
        post_message = confirmRecord(date);
    }
    else if (message_parameter[0].match(/^何も\n*/)) {
        post_message = '何も買わなかったんだね、えらい!!';
    }
    else {
        post_message = '食費・日用品\n値段\nで入力してください';
    }

    UrlFetchApp.fetch(URL, {
        'headers': {
            'Content-Type': 'application/json; charset=UTF-8',
            'Authorization': 'Bearer ' + ACCESS_TOKEN,
        },
        'method': 'post',
        'payload': JSON.stringify({
            'replyToken': reply_token,
            'messages': [{
                'type': 'text',
                'text': post_message,
            }],
        }),
    });
    return ContentService.createTextOutput(JSON.stringify({ 'content': 'post ok' })).setMimeType(ContentService.MimeType.JSON);
}

こんな感じで書けば、入力したことに対して処理をしてくれます。
これだけで、返ってくるのすごい!

function costFood(message_parameter, date) {
    // 食費シートにメッセージを書き込む
    //最終行取得
    var last_row = food_sheet.getLastRow();

    food_sheet.getRange('A' + (last_row + 1)).setValue(date);
    food_sheet.getRange('B' + (last_row + 1)).setValue(message_parameter[1]);
    var message = "食費を" + message_parameter[1] + "で記録しました";

    return message;
}

ここでは、LINEbotから送られてきたメッセージを対象のシートに書き込んでいます。
今回の場合はfoodシートの最終行に日付と購入金額を入力しています。

最後に、push通知の設定です。
GASでは、トリガーの時間を指定することで、特定の時間に関数を実行することができます。
実際に作成したトリガーのコードを見てみましょう。

//トリガーをセットする
function setTrigger() {
    const time = new Date();
    time.setHours(10);
    time.setMinutes(00);
    ScriptApp.newTrigger('morningSpending').timeBased().at(time).create();
}

function morningSpending() {
    var message = 'おはよう!\n'
    message += '今朝は何か買ったかな?';
    .
    .
    .
}

setTriggerでは、10:00にmorningSpendingという関数を実行するトリガーを設定しています。
このコードでは、関数にトリガーを定義しただけなので、この後トリガーを登録しないといけません。

上記画像のようにsetTriggerを毎日0~1時の間に実行されるようにトリガーを登録します。
それにより、0~1時の間にmorningSpendingという関数が登録され、朝10:00にmorningSpendingが実行されます。
つまり、朝10時になったら「おはよう!今朝は何か買ったかな?」とpush通知が来るようになります。

4.結果

簡素なbotですが機能としては自分の思い描いていたことが実装できたと思います!
リマインド機能、カテゴリごとに記録、サマリも表示させることができました!

5.最後に

今回、初めてのLINEbot作成でしたが、とても楽しく実装できました。
自分の身近な生活の悩みをこういったBOTで解決できたので、
応用すれば何かの業務を改善することも可能じゃないかなと思いました。
機会があれば業務改善やってみたいですね!

また、今回の「支出君」のアップデートもしていきたいです!
-家計簿を漏れなく付けられる機能
-無駄遣いをやめようとおもえる機能
-GASではなく、Lambda+Amazon API Gatewayで実装
(今回これでやってみようとしたのですが、うまくいかなかったのでリベンジしたいです)

まずは、せっかく作ったので1か月間使ってみて、また感想を書きたいと思います!

~ 告知 ~
アイスタイルでは、新卒が運営しているSNSがあります!
新卒の視点で情報を発信しているので気になる方はぜひご覧ください。
気に入った投稿があれば、いいねとフォローもして下さいね~!

新卒ツイッター
新卒インスタグラム

そして、ぜひアイスタイルで一緒に働きましょう!(採用ページはこちら)

19新卒の方々が昨年行った社内勉強会の記事もLINEbotについてなので、
興味がある方は是非こちらもお読み下さい!!

最後までお読みいただきありがとうございました!

6.参考資料

http://yoshikii.com/entry/linebot-expense/
https://qiita.com/13sayu/items/a38e412af59d6cadee0c
https://qiita.com/chihiro/items/d23692c308c89e1b1ee2

アイスタイル20新卒のshirakihです。