← ブログ一覧に戻る
プロジェクト紹介

Google Apps Script × LINE APIで家計簿ボットを作った話

#Google Apps Script#LINE API#Bot#家計簿#GAS

はじめに

家計簿アプリは世の中にたくさんありますが、「結局続かない」という人は少なくありません。アプリを開く、カテゴリを選ぶ、金額を入力する——このステップが面倒で、記録が途絶えてしまうのです。

そこで、普段使っているLINEにメッセージを送るだけで支出を記録できる家計簿ボットを開発しました。Google Apps Script(GAS)とLINE Messaging APIを組み合わせた、無料で運用できる構成です。

お客様からいただいた課題

課題1:家計簿アプリが続かない

専用の家計簿アプリを何度か試したものの、毎回アプリを開いて入力する手間がハードルとなり、長続きしませんでした。

課題2:レシートの管理が面倒

レシートを貯めておいてまとめて入力しようとすると、溜まったレシートの山を見るだけでやる気がなくなる。その場で記録できる仕組みが必要でした。

課題3:月の支出を把握したい

細かい分析まではいらないが、月にいくら使っているかを把握し、使いすぎを防ぎたいというニーズがありました。

なぜ LINE × GAS なのか

LINEを選んだ理由

  • すでに毎日使っている:新しいアプリをインストールする必要がない
  • 入力が手軽:テキストメッセージを送るだけ
  • 通知が届く:月のまとめなどをプッシュ通知で送れる

Google Apps Scriptを選んだ理由

観点GASのメリット
コスト完全無料で利用可能
ホスティングGoogleのインフラ上で動作。サーバー管理不要
スプレッドシート連携Googleスプレッドシートに直接書き込める
デプロイWebアプリとして簡単にデプロイ可能
トリガー時間ベースのトリガーで定期処理を実行可能

サーバーを用意する必要がなく、ランニングコストゼロで運用できるのが大きな利点です。

解決策:LINE家計簿ボットの開発

システム構成

ユーザー(LINE)
    ↓ メッセージ送信
LINE Messaging API
    ↓ Webhook
Google Apps Script(Webアプリ)
    ↓ データ書き込み
Google スプレッドシート(DB)

使い方

ユーザーはLINEで以下のようにメッセージを送るだけです:

ランチ 850
コンビニ 320
電車 480

「品目 金額」のシンプルなフォーマットで、すぐに記録できます。

実装のポイント

1. Webhookの受信処理

LINE Messaging APIからのWebhookをGASで受信し、メッセージを解析する処理です。

function doPost(e) {
  var event = JSON.parse(e.postData.contents).events[0];
  var replyToken = event.replyToken;
  var userMessage = event.message.text;

  // メッセージを解析
  var result = parseMessage(userMessage);

  if (result.success) {
    // スプレッドシートに記録
    recordExpense(result.item, result.amount);
    replyMessage(replyToken,
      "✅ 記録しました\n" + result.item + ": ¥" + result.amount);
  } else {
    replyMessage(replyToken, result.errorMessage);
  }
}

2. メッセージの解析

ユーザーが送った自然なメッセージを解析し、品目と金額を抽出します。

function parseMessage(message) {
  // 「品目 金額」形式を解析
  var parts = message.trim().split(/\s+/);

  if (parts.length >= 2) {
    var item = parts[0];
    var amount = parseInt(parts[parts.length - 1]);

    if (!isNaN(amount) && amount > 0) {
      return { success: true, item: item, amount: amount };
    }
  }

  // 特殊コマンドの処理
  if (message === "今月" || message === "集計") {
    return { success: false, isCommand: true, command: "summary" };
  }

  return {
    success: false,
    errorMessage: "「品目 金額」の形式で送ってください\n例: ランチ 850"
  };
}

3. スプレッドシートへの記録

データはGoogleスプレッドシートに蓄積されます。日付・品目・金額を1行ずつ記録するシンプルな構造です。

function recordExpense(item, amount) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName("支出記録");
  var now = new Date();

  sheet.appendRow([
    Utilities.formatDate(now, "Asia/Tokyo", "yyyy/MM/dd"),
    Utilities.formatDate(now, "Asia/Tokyo", "HH:mm"),
    item,
    amount
  ]);
}

4. 月次集計の自動通知

月末に自動で集計結果をLINEに通知する機能を実装しました。GASの時間ベーストリガーを使って、月に1回自動実行されます。

function monthlySummary() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName("支出記録");
  var data = sheet.getDataRange().getValues();

  var now = new Date();
  var thisMonth = now.getMonth();
  var thisYear = now.getFullYear();

  var total = 0;
  var categoryTotals = {};

  data.forEach(function(row) {
    var date = new Date(row[0]);
    if (date.getMonth() === thisMonth &&
        date.getFullYear() === thisYear) {
      var item = row[2];
      var amount = row[3];
      total += amount;
      categoryTotals[item] = (categoryTotals[item] || 0) + amount;
    }
  });

  // 集計メッセージを作成して送信
  var message = "📊 今月の支出まとめ\n"
    + "合計: ¥" + total.toLocaleString() + "\n\n";

  // カテゴリ別の内訳を追加
  Object.keys(categoryTotals)
    .sort(function(a, b) {
      return categoryTotals[b] - categoryTotals[a];
    })
    .forEach(function(key) {
      message += key + ": ¥"
        + categoryTotals[key].toLocaleString() + "\n";
    });

  pushMessage(message);
}

対応コマンド

メッセージ動作
ランチ 850支出を記録
今月今月の支出合計を表示
集計カテゴリ別の集計を表示
ヘルプ使い方を表示

改善結果

1. 記録の継続率が向上

LINEでメッセージを送るだけという手軽さにより、家計簿の記録が習慣化しました。専用アプリを開く手間がないため、「買い物した直後にLINEで記録」という行動パターンが定着しています。

2. リアルタイムな支出把握

「今月」とメッセージを送るだけで、今月の支出合計をすぐに確認できます。月末まで待たずに支出状況を把握できるため、使いすぎの防止に効果を発揮しています。

3. ランニングコストゼロ

Google Apps Script + Googleスプレッドシートの構成により、サーバー費用がかかりません。LINE Messaging APIも無料プランの範囲で十分に運用できています。

GAS × LINE Bot開発のコツ

デプロイ時は「新しいデプロイ」を選ぶ

GASのコードを更新した際、「デプロイを管理」から既存のデプロイを更新するのではなく、「新しいデプロイ」を作成し、WebhookのURLを更新する必要がある場合があります。

doPost関数のデバッグ

Webhookで呼ばれる doPost 関数は、GASのエディタから直接実行できません。デバッグ時は Logger.log でログを残し、GASの実行ログで確認するのが基本です。

スプレッドシートの行数制限に注意

Googleスプレッドシートは最大1,000万セルの制限があります。長期運用する場合は、年度ごとにシートを分けるなどの対策を検討しましょう。

まとめ

「家計簿が続かない」という課題を、LINEという日常的なツールを活用することで解決しました。

改善前:

  • 専用アプリの入力が面倒で続かない
  • レシートが溜まるだけ
  • 月の支出が把握できない

改善後:

  • LINEでメッセージを送るだけで記録完了
  • その場で即座に記録する習慣が定着
  • いつでも支出状況を確認可能

「ユーザーが既に使っているツールに寄り添う」という設計思想が、継続率の向上に直結したプロジェクトでした。技術的に高度なことをしなくても、ユーザー体験を最適化することで大きな価値を生み出せる好例だと考えています。


関連リンク: