LINE Bot

 

【2018年 LINE Bot 作り方】GASで支出管理Botを作ってみた


フリーランスエンジニアのyoshikiです。
 
 
最近、お金を使い過ぎてしまうことが多いので、1ヶ月の支出をざっくりと把握したいな〜と思いまして。
 
 
身近なLINEを使って、記録するためのBotを作ります!

作ったもの

作ったLINE Botアカウントは「ししゅつさん」。支出項目と金額を入力すると、Googleのスプレッドシートに記録されます。
 
 
使い方は単純で「食費 2000」と入力すると、

スプレッドシートの投稿日付(今日の日付)の箇所に、自動で入力してくれます。

 
今日の日付以外の記録をしたい場合、「日用品 1500 9/15」と入力すると、

指定した日付の箇所に入力してくれます。

 

作り方

ユーザーがメッセージ送信した際に、裏で動いているプログラムはGoogle Apps Script(GAS)を使用しています。
 
 
GASはGoogleが提供しているスクリプトで、Googleの各サービスにアクセスしたり、APIとして公開したりできます。例えば、Googleカレンダーにアクセスして、予定を確認して、空いている時間に予定を入れることができます。
 
 
このサービスはGoogleアカウントを持っているだけで無料で使うことができます。

 

1. GASでLINE Botを作るための準備

こちらの記事をご覧ください。


 

2. Messaging APIのアクセストークン発行

Messaging APIのアカウントページにあるアクセストークンの再発行を押します。発行されたトークンはコード記述時に使うのでコピーしておいてください。
 

 

3. スプレッドシート作成

Googleドライブにアクセスし、「新規」から「Googleスプレッドシート」をクリックします。

作成されたスプレッドシートに、支出項目と日付を追加します。こちらに→テンプレート用意しています。好きに入力してもらっても構いません。
 
 
 
GASでスプレッドシートを認識するために、IDをコピーしておきます。画像の青色に選択されている箇所をコード記述時に使うのでコピーしておいてください。
 

 

4. GASにコード記述

GASに以下のコードを記述します。
 
 
1行目〜3行目に事前にコピーしておいた内容を入力します。

ACCESS_TOKEN→2. Messaging APIで発行したアクセストークンを入力
id→3. スプレッドシート作成でコピーしたIDを入力
dateSheet→3. スプレッドシート作成で作成したスプレッドシートのシート名を入力

 

var global;
var ACCESS_TOKEN = '2. Messaging APIで発行したアクセストークンを入力';
var id = '3. スプレッドシート作成でコピーしたIDを入力';
var dateSheet = SpreadsheetApp.openById(id).getSheetByName('3. スプレッドシート作成で作成したスプレッドシートのシート名を入力');
var url = 'https://api.line.me/v2/bot/message/reply'; // 応答メッセージ用のAPI URL
 
/**
 * doPost
 * ユーザーがLINEにメッセージ送信した時の処理
 **/
global.doPost = function (e) {
    var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
    var messageList = userMessage.split(' ');
    var inputdate = '';
    if (messageList[2]) {
        inputdate = messageList[2];
    }
    var targetRow = getExpenseRow(dateSheet, messageList[0]);
    var targetColumn = getDateColumn(dateSheet, inputdate);
    setValue(dateSheet, targetRow, targetColumn, parseInt(messageList[1]));
 
    // メッセージ返信
    replyMessage(e);
    return ContentService.createTextOutput(JSON.stringify({ content: 'post ok' })).setMimeType(ContentService.MimeType.JSON);
};
/**
 * getExpenseRow
 * メッセージの支出項目が何行目かを返す
 **/
var getExpenseRow = function (sheet, key) {
    // 支出項目列取得
    var expenseData = dateSheet.getRange(2, 1, sheet.getLastRow()).getValues();
    expenseData.pop(); // 末尾の不要な要素削除
    
    // 入力された支出項目と一致する行数を返却
    for (var index = 0; index < expenseData.length; index++) {
        if (expenseData[index] == key) {
            return index + 2;
        }
    }
    return 0;
};
/**
 * getDateColumn
 * 支出金額を入力する日付が何列目かを返す
 **/
var getDateColumn = function (sheet, inputDay) {
    var compareDay = Utilities.formatDate(new Date(), 'JST', 'yyyy/M/d');
    
    if (inputDay != '') {
        var year = new Date().getFullYear();
        compareDay = year + "/" + inputDay;
    }
    // 日付行取得
    var dateData = sheet.getRange(1, 2, 1, sheet.getLastColumn()).getValues();
    dateData[0].pop(); // 末尾の不要な要素削除
 
    // 日付フォーマット変換
    var afterDateData = [];
    dateData[0].forEach(function (it) {
        afterDateData.push(Utilities.formatDate(it, 'JST', 'yyyy/M/d'));
    });
    
    for (var index = 0; index < afterDateData.length; index++) {
        if (afterDateData[index] == compareDay) {
            return index + 2;
        }
    }
    return 0;
};
/**
 * setValue
 * 支出金額を対象セルにセットする
 **/
var setValue = function (sheet, row, column, key) {
    var oldValue = 0;
    var newValue = 0;
    oldValue = sheet.getRange(row, column).getValue();
    newValue = key + oldValue;
    sheet.getRange(row, column).setValue(newValue);
};
/**
 * replyMessage
 * メッセージの返信
 **/
var replyMessage = function (e) {
    var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
    var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
    
    UrlFetchApp.fetch(url, {
        headers: {
            'Content-Type': 'application/json; charset=UTF-8',
            Authorization: 'Bearer ' + ACCESS_TOKEN
        },
        method: 'post',
        payload: JSON.stringify({
            replyToken: replyToken,
            messages: [
                {
                    type: 'text',
                    text: `「${userMessage}」を記録したよ!`
                }
            ]
        })
    });
};

 

5. Webアプリケーションとして公開

コード記述が終わったら、使える状態にするために公開します。GASメニューの「公開」から「ウェブアプリケーションとして導入」をクリックします。

 
次の画面で「アプリケーションにアクセスできるユーザー」を「全員(匿名ユーザーを含む)」を選択して、更新をクリックします。

この時に表示されるURLをコピーしておき、Messaging APIのWebhook URLに貼り付けます。

 

6. 完成!

これで完成です!お疲れさまです!
 
 
LINEでメッセージ送信(食費 1000など)すると、「記録したよ!」と返信があり、スプレッドシートに金額が入力されているはずです。
 
 
もしうまく動かない場合は、コメントかTwitterのDMください!必ず返信いたします。
 
 
その他こんなLINE Botあったらいいなとかご相談などもお待ちしております。

【最短!】パッケージ名の変更方法前のページ

【LINE Bot 作り方】GASでLINE Botを作るための準備次のページ

関連記事

  1. LINE Bot

    【誰でもできる!】自分用LINE BOTの作り方

    \r\n\r\nどうも、ITエンジニア yoshikiです。\r\n…

  2. LINE Bot

    【LINE Bot 作り方】GASでLINE Botを作るための準備

    LINE BUSINESS CENTER アカウントの作成2020/…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

  1. android

    ハッシュアルゴリズムとソルト
  2. LINE Bot

    【LINE Bot 作り方】GASでLINE Botを作るための準備
  3. android

    Android 公開鍵暗号方式と共通鍵暗号方式を使った暗号化・復号化
  4. android

    【最短!】パッケージ名の変更方法
  5. android

    Android SharedPreferencesの種類
PAGE TOP