はじめに
「スプシで家計簿を管理しているが、毎回スプシに入力するのが面倒くさい!
LINEから入力できるようにならないか?」
と知人から依頼を受けたのでLINEボットを作りました
この記事では、LINEとGoogle Apps Script(GAS)を使って、簡単に支出記録ができる家計簿ボットを作る方法を紹介します。
この家計簿ボットでできること
- LINEで金額(例:300)を送信すると、日付と金額がスプレッドシートに記録される
- 記録されたデータから、当月平均支出額と支出予測額が返信される
データはGoogleスプレッドシートに蓄積されるので、後から自由にグラフ化・分析も可能です
使用した技術
- Google Apps Script(GAS):サーバーレスでLINEのWebhookを処理
- LINE Messaging API:ユーザーのメッセージを取得し、返信する
- Google スプレッドシート:支出データを保存するデータベースとして使用
全体の仕組み
- ユーザーがLINEで「金額」を送信
- GASがそのメッセージを受け取る(Webhook)
- スプレッドシートに日時と金額を記録
- 同時に、当月の平均支出と支出予測を計算
- 結果をLINEに自動返信
STEP 1:LINEボットの準備
LINEボットの作成
LINE Official Account ManagerからLINE公式アカウントを作成します。
公式ページに詳しい手順が説明されています。
Messaging APIの有効化
GASでメッセージの送受信を行うため、Messaging APIを有効化します。
こちらも公式ページに詳しい手順が説明されています。
応答設定
応答設定から「Webhook」を有効化、「応答メッセージ」を無効化します。
チャンネルアクセストークンの発行
LINE Developersコンソールから、Messaging API設定を選択します。
ページ下部でチャンネルアクセストークンを発行できます。このチャンネルアクセストークンをメモしておきます。
STEP 2:スプレッドシートの準備
新規スプレッドシートを作成し、「ログ」という名前でシートを作成します。
A列にtimestamp、B列にmonth、C列にpriceを記載します。
STEP 3:GASのコード実装
Scriptの作成
Apps Scriptを選択し、GASエディタで以下のスクリプトを作成します。
const sheet = SpreadsheetApp.openById('スプシIDを入力する').getSheetByName('ログ');
function doPost(e) {
const json = JSON.parse(e.postData.contents);
const userMessage = json.events[0].message.text;
const replyToken = json.events[0].replyToken;
// 数字でなければ返信して終了
if (isNaN(userMessage)) {
replyToUser(replyToken, "数字を送ってください🙇♂️");
return;
}
const timestamp = new Date();
const month = Utilities.formatDate(timestamp, 'Asia/Tokyo', 'yyyy-MM');
const year = timestamp.getFullYear() - 2000; // 2025 → 25年
const monthLabel = `${year}年${timestamp.getMonth() + 1}月`;
// データの記録
sheet.appendRow([timestamp, month, Number(userMessage)]);
// 今月の平均支出額を算出、支出合計の予測
const result = predictThisMonthExpense();
replyToUser(replyToken, `¥${userMessage}を記録しました📒\n\n${monthLabel}の平均支出: ¥${result.averagePerDay}\n${monthLabel}の支出予測: ¥${result.predictedTotal}`);
}
// 返信する
function replyToUser(replyToken, message) {
const url = 'https://api.line.me/v2/bot/message/reply';
const accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); // LINEのチャネルアクセストークン
const headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + accessToken
};
const postData = {
replyToken: replyToken,
messages: [
{
type: 'text',
text: message
}
]
};
const options = {
'method': 'post',
'headers': headers,
'payload': JSON.stringify(postData)
};
UrlFetchApp.fetch(url, options);
}
// 今月の平均支出額を算出し、支出合計を予測する
function predictThisMonthExpense() {
const data = sheet.getDataRange().getValues();
const now = new Date();
const currentMonth = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy-MM'); // 今月のyyyy-MM
const currentDay = now.getDate(); // 今日の日付
// ログシートから今月の支出を抽出
const rowsThisMonth = data.slice(1).filter(row => {
const rowMonth = Utilities.formatDate(new Date(row[0]), 'Asia/Tokyo', 'yyyy-MM');
return rowMonth === currentMonth;
});
const total = rowsThisMonth.reduce((sum, row) => sum + Number(row[2]), 0); // 今月の支出合計
const daysInMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate(); // 今月の日数
// 平均支出 × 今月の日数 で予想を出す
const averagePerDay = Math.round(total / currentDay) || 0; // 平均支出額
const predictedTotal = Math.round(averagePerDay * daysInMonth); // 予測支出額
return {
averagePerDay: averagePerDay,
predictedTotal: predictedTotal
};
}
スクリプト プロパティの設定
GASの設定からスクリプト プロパティを作成し、
プロパティにLINE_TOKEN
、値にSTEP1で発行したチャンネルアクセストークンを入力し、保存します
デプロイ
「デプロイ」>「新しいデプロイ」を選択します。
「ウェブアプリ」を選択します。
アクセスできるユーザー「全員」を選択し、「デプロイ」をクリックします。
表示されたウェブアプリのURLをコピーします。
Webhook URLの設定
LINE Official Account ManagerのMessaging API設定画面から、ウェブアプリのURLを入力して保存します。
まとめ
以上の手順でLINEボットは完成です!
下記のようにやり取りできます。
誤って記録してしまった場合はマイナスの値を送信することで、打ち消せます。
また、数字以外が送られてきた場合は、エラーメッセージが表示されます。