LINE→Google spread sheetの連携をしてみた
私事ですが、少し前に結婚して以降、新たに夫婦用の口座を作って家計のやりくりをするようにしています。
当初は家計が”見える化”できることに新鮮味もあったことから、めんどくさいと思いつつも昔ながらの紙の家計簿を作っていたのですが、慣れてくるとこの新鮮味もなくなり、ただただめんどくさいだけの作業に、、、
以降、このめんどくささから解放されるべく、Money Forwardを使うようにしました。が、残高・資産管理の観点からはまだよかったものの、クレジットカードの使用履歴の連携に結構なタイムラグがあることから、損益項目の把握が適時・適切にできず、結局Money Forwardを確認したタイミングでいくら使っていくら予算が残っているのかよく分からないと感じていました。
そこで、「夫婦共通で使い慣れているツールをベースに、電子的な家計簿を作りたい!」という考えのもと、「そういえばLINEってBOTが作れるんだったっけ?」と思い付いたのをきっかけに、今回のタイトルのことに取り組むことにしました。
最終成果物は、次の動画のとおりです。
「品目:費目:金額」という風に、コロンで区切ってLINE BOTに投下すると、予め定めたGoogle spread sheetに日付情報とともに入力した情報が登録されます。
Google spread sheetにためておけば、後続での集計・分析が楽になりますので、とにかくここに放り投げる、という感じです。
なお、これを書くにあたっては以下の記事を参考にさせていただきました。上記のスクリプトについては以下の本文に記載しておりますが、LINE APIの設定についてはこちらの記事以上のことは特にしておりませんので、気になる方は必要に応じてご参照ください。
※上記の記事を参考にしながら、私の方で工夫したところは脚注に記載しております。
<今回書いたコード>
// LINE developersのメッセージ送受信設定に記載のアクセストークン
const ACCESS_TOKEN = 'LINE APIで発行したアクセストークンをコピー';
function doPost(e) {
// WebHookで受信した応答用Token
var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
// ユーザーのメッセージを取得…①
var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
var userMessage_item = userMessage.split(":")[0];
var userMessage_category = userMessage.split(":")[1];
var userMessage_value = userMessage.split(":")[2];
// 応答メッセージ用のAPI URL
var url = 'https://api.line.me/v2/bot/message/reply';
//応答メッセージ
var resMessage;
//入力チェック結果
var chFlg = 0;
//記録先シート
const ss = SpreadsheetApp.getActiveSpreadsheet();
const wSheet = ss.getSheetByName('転記先のGoogle spread sheetのシート名を記載');
//最新行を取得
const lastRow = wSheet.getLastRow();
var nRow= lastRow+1;
//本日日付を取得…②
var date = new Date();
var today = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd, HH:mm');
var thisMonth = 0;
if (date.getDate() > 24){
thisMonth = date.getMonth() + 2;
}else{
thisMonth = date.getMonth() + 1;
}
//入力チェック…③
if(userMessage.match((/:/g)||[]).length==2){
chFlg = 1;
}else{
resMessage = "(例)「ネットスーパー:食費:1000」のような形式で入力してください。";
}
//入力チェックOKの場合、スプレッドシートへ内容を記録
if(chFlg != 0){
//記録
wSheet.getRange(nRow, 1).setValue(today);
wSheet.getRange(nRow, 2).setValue(date.getFullYear()+"/"+thisMonth);
wSheet.getRange(nRow, 3).setValue(userMessage_item);
wSheet.getRange(nRow, 4).setValue(userMessage_category);
wSheet.getRange(nRow, 5).setValue(userMessage_value);
//応答メッセージをセット
resMessage = "記録しました!";
}
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': resMessage,
//'text': userMessage,
}],
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
(脚注)
①:入力したメッセージを、「品目・費目・金額」で分割できるように、「:」をキーにして、取得したメッセージを3項目のリストに分けています。
.splitによって、リスト形式のデータになるので、[0], [1], [2]で要素を指定しています。
②‐1:入力日時が24時間表記になるようにフォーマットを変更しました。
yyyy/MM/dd, hh:mmだと、1から12の範囲でしか時間が表記されませんが、yyyy/MM/dd, HH:mmとすることで、24時間表記になります。
②‐2:家計簿の開始日が毎月25日なので、N-1月25日~N月24日をN月度の家計簿として集計できるようにしています。
③:ここは大層なことは全然できていないのですが、コロンが2つ入っていないデータでは、スプレッドシートへの反映時に列がずれることになり、のちの修正がめんどくさいので、とりあえずコロンが2つ入っていない入力結果をはじくように設定しています。
(補足)
Google spread sheetを夫婦間で共有の状態にしておいて、Google spread sheetに直接入力するという形でも、ある意味で今回の目的は達成可能だったかと思いますが、
1.買い物するときにいつでも手に持っているスマホですぐに入力することを想定していたこと
2.スマホのGoogle spread sheetのアプリは操作性がよくない(と感じている)こと
から、なるべく操作しやすいインターフェースを選択したという背景があります。
P.S.
今回作ったものは、もしかしたら既に立派なアプリがリリースされていたかもしれませんが、あまりスマホ内のアプリを増やしたくなかったのと、シンプルに何か作りものをしたかったので、アプリを探し回ることはせずコードを書くことを選択しました。