フリーランスエンジニアの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あったらいいなとかご相談などもお待ちしております。
この記事へのコメントはありません。