LINEとGASで作る超簡単家計簿アプリ|メッセージ送信だけで支出管理

やってみた

はじめに

 毎日の支出管理、どのように行っていますか?専用アプリや紙の家計簿、Excelなど様々な方法がありますが、実は普段使っているLINEとGoogleスプレッドシートを連携させるだけで、メッセージを送信するだけの超簡単な家計簿システムが作れるのをご存知でしょうか。

 本記事では、Google Apps Script(GAS)とLINE Messaging APIを活用して、スマホから手軽に記録・管理できる家計簿アプリの作り方を、プログラミング初心者の方にも分かりやすくステップバイステップで解説します。

このアプリでできること

  • LINEメッセージで支出を記録:「記録 食費 1000」と送るだけ
  • スプレッドシートに自動記録:日付、品目、金額が自動で保存
  • 簡単なコマンドで支出確認:「確認」と送ると合計表示
  • データ分析が可能:スプレッドシートに蓄積されたデータで後から分析

必要な準備

必要なアカウント

  1. Google(Gmail)アカウント
  2. LINEアカウント
  3. パソコン(推奨。スマホでも可能ですが操作性を考慮)

必要な知識

  • 基本的なプログラミングの理解(必須ではありませんが、あると便利)
  • スプレッドシートの基本操作

全体の仕組み

このアプリケーションの動作フローを理解しましょう:

  1. ユーザー操作:LINEでメッセージを送信(例:「記録 食費 1000」)
  2. API連携:LINE APIがメッセージをGASプログラムに送信(Webhook)
  3. データ処理:GASプログラムがメッセージを解析し、スプレッドシートに記録
  4. 返信処理:レスポンスを作成してLINEに返信(例:「食費を1000円で記録しました」)
  5. 確認機能:「確認」と送ると、スプレッドシートから集計した情報を返信

STEP 1: スプレッドシートの準備

まずは家計簿データを管理するスプレッドシートを準備します。

スプレッドシート作成手順

  1. Googleドライブにアクセス
  2. 新規スプレッドシートを作成
  3. ファイル名を「支出管理スプレッドシート」に変更
  4. 以下の2つのシートを準備

支出表(1枚目のシート)

年月日種別金額

小計(2枚目のシート)

種別合計金額

STEP 2: LINE開発者アカウントの設定

LINE APIを使用するための設定を行います。

LINE Developersアカウント作成

  1. LINE Developersにアクセス
  2. LINEアカウントでログイン
  3. 初回の場合は開発者登録(開発者名とメールアドレスを入力)

LINE公式アカウントの作成

  1. LINE Developersコンソールから「LINE公式アカウントを作成する」をクリック
  2. 必要事項を入力して登録完了
  3. LINE Official Account Managerに移動し、同意事項に同意

Messaging API設定

  1. LINE Official Account Managerの設定から「Messaging API」を選択
  2. 「Messaging APIを利用する」をクリック
  3. プロバイダー名を設定(例:「マイ家計簿アプリ」)
  4. 利用規約に同意し、チャネルを作成

STEP 3: GASスクリプトの作成

スプレッドシートとLINE APIを連携させるGASスクリプトを作成します。

スクリプト作成手順

  1. スプレッドシートを開き、「拡張機能」→「Apps Script」を選択
  2. プロジェクト名を「household_account_system」に変更
  3. 以下のコードを入力
javascript//********************************
// 基本設定情報
//********************************
var ACCESS_TOKEN = '';//Messaging APIチャネル・チャネルアクセストークンで発行したトークンを設定
var URL = 'https://api.line.me/v2/bot/message/reply'; // 応答メッセージ用のAPI URL
var ID = '';//スプレッドシートIDを設定 https://docs.google.com/spreadsheets/d/<スプレッドシートID>/edit
var SHEET_NAME_1 = '支出表'
var SHEET_NAME_2 = '小計'
var sh1 = SpreadsheetApp.openById(ID).getSheetByName(SHEET_NAME_1);
var sh2 = SpreadsheetApp.openById(ID).getSheetByName(SHEET_NAME_2);
var last_row_sh1 = sh1.getLastRow();
var last_row_sh2 = sh2.getLastRow();

//********************************
// メイン処理(スプレッドシート読み書き&POST送信処理)
//********************************
function doPost(e) {
  //JSONをパースする
  var json = JSON.parse(e.postData.contents);
  
  //返信するためのトークン取得
  var reply_token = json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }
  
  //送られたLINEメッセージを取得
  var user_message = json.events[0].message.text;
  var message_parameter = user_message.split(/\r\n|\n/);
  var post_message = "";
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年MM月dd日');
  
  if (message_parameter[0].match(/^記録\n*/)) {
    post_message = writeSheet(message_parameter, date);
  } else if (message_parameter[0].match(/^確認\n*/)) {
    post_message = outputSheet(message_parameter, date);
  } else {
    post_message = '「記録」\n品目\n値段\nまたは、「確認」で入力してください';
  }
  
  UrlFetchApp.fetch(URL, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': [{
        'type': 'text',
        'text': post_message,
      }],
    })
  });
  
  return ContentService.createTextOutput(JSON.stringify({
    'content': 'post ok'
  })).setMimeType(ContentService.MimeType.JSON);
}

//********************************
// シート書き込み処理
//********************************
function writeSheet(message_parameter, date) {
  // 支出シートに書き込む
  // 最終行取得
  sh1.getRange('A' + (last_row_sh1 + 1)).setValue(date);
  sh1.getRange('B' + (last_row_sh1 + 1)).setValue(message_parameter[1]);
  sh1.getRange('C' + (last_row_sh1 + 1)).setValue(message_parameter[2]);
  
  // 小計シートに情報を書き込む
  var sum_flag = false;
  for(let i = 0; i < last_row_sh2; i++){
    var total_type=sh2.getRange('A' + (i+1)).getValue();
    if(total_type == message_parameter[1]){
      var total_price=sh2.getRange('B' + (i+1)).getValue();
      sh2.getRange('B' + (i+1)).setValue(Number(total_price)+Number(message_parameter[2]));
      sum_flag = true;
    }
  }
  
  if(sum_flag == false){
    sh2.getRange('A' + (last_row_sh2 + 1)).setValue(message_parameter[1]);
    sh2.getRange('B' + (last_row_sh2 + 1)).setValue(message_parameter[2]);
  }
  
  // 返答メッセージ作成
  var message = message_parameter[1] + "を" + message_parameter[2] + "円で記録しました";
  return message;
}

//********************************
// シート読み込み処理
//********************************
function outputSheet(message_parameter, date){
  // 小計シートから値を入れる。
  var message = "支出状況は以下になります。\n";
  for(let i = 1; i < last_row_sh2; i++){
    var total_type=sh2.getRange('A' + (i+1)).getValue();
    var total_price=sh2.getRange('B' + (i+1)).getValue();
    message = message + total_type + ":" + total_price + "\n";
  }
  var message = message + "以上になります。";
  return message;
}

コードの詳細解説

このコードは3つの主要な部分で構成されています:

1. 基本設定情報

LINE APIのアクセストークンやスプレッドシートの情報を設定する部分です。

2. doPost関数

LINEからメッセージを受け取って処理する中心的な関数。メッセージの内容に応じて適切な処理を振り分けます。

3. writeSheet関数・outputSheet関数

スプレッドシートへの書き込みと読み取りを行う関数です。

重要な設定項目

以下の変数は必ず自分の環境に合わせて設定してください:

  • ACCESS_TOKEN: LINE DevelopersコンソールのMessaging API設定ページで取得
  • ID: スプレッドシートのID(URLの https://docs.google.com/spreadsheets/d/【ここの部分】/edit から取得)
  • SHEET_NAME_1, SHEET_NAME_2: シート名(「支出表」と「小計」)

STEP 4: GASのデプロイ設定

GASスクリプトをウェブアプリとしてデプロイし、LINEからアクセスできるようにします。

デプロイ手順

  1. スクリプトエディタで「デプロイ」ボタンをクリック
  2. 「新しいデプロイ」を選択
  3. 「⚙」(歯車アイコン)→「ウェブアプリ」を選択
  4. アクセスできるユーザーを「全員」に設定
  5. 「デプロイ」をクリック
  6. 表示されるウェブアプリのURLをコピー(後で使用)

注意点
デプロイ時に権限の許可を求められる場合があります。「許可」を選択して進めてください。これは、スクリプトがスプレッドシートやLINE APIにアクセスするために必要な権限です。

STEP 5: LINE APIとGASの連携

LINE側の設定を行い、GASスクリプトとの連携を完了させます。

連携設定手順

  1. LINE Developersコンソールにアクセス
  2. 作成したMessaging APIチャネルを選択
  3. 「Messaging API設定」タブをクリック
  4. 「Webhook URL」にSTEP 4でコピーしたウェブアプリのURLを貼り付け、「更新」
  5. 「Webhook送信」を「有効」に設定
  6. 「応答メッセージ」を「無効」に設定(GASで応答を制御するため)

STEP 6: 動作確認

設定完了後、実際にLINEで動作確認を行います。

確認手順

  1. LINE公式アカウントを友達追加(QRコードはLINE公式アカウントマネージャーで確認)
  2. 以下のようにメッセージを送信:
記録
食費
1000

「食費を1000円で記録しました」と返信があれば成功です!

また、「確認」と送信すると、現在までの支出状況が表示されます。

カスタマイズのアイデア

基本機能の実装が完了したら、以下のようなカスタマイズも可能です:

1. 月間予算の設定と残高表示

javascript// 予算を設定できる機能を追加
if (message_parameter[0].match(/^予算\n*/)) {
  var budget = Number(message_parameter[1]);
  // 予算をシートに保存するコードを追加
  post_message = "月間予算を" + budget + "円に設定しました";
}

2. カテゴリごとの分析機能

javascript// カテゴリごとの支出割合を計算して返す機能
if (message_parameter[0].match(/^分析\n*/)) {
  post_message = analyzeExpenses(); // 分析用の関数を作成
}

3. その他の拡張アイデア

  • グラフ化機能(スプレッドシートの機能を利用)
  • 複数ユーザーでの共有(LINE通知機能とGASのトリガー機能を活用)
  • AI連携による自動カテゴリ分類
  • レシート写真からの自動記録

トラブルシューティング

実装中によくあるエラーとその解決法をご紹介します:

1. LINE Botからの応答がない場合

  • Webhook URLの設定が正しいか確認
  • GASスクリプトの権限設定を確認
  • LINE側のWebhook設定が「有効」になっているか確認

2. GASのエラーログを確認する方法

スクリプトエディタの「実行」→「ログを表示」でエラーログを確認できます。

3. スプレッドシートへの書き込みエラー

  • 変数の型が正しいか確認(文字列vs数値)
  • シート名やセル範囲が正しいか確認

まとめ

本記事では、LINEとGoogle Apps Scriptを連携させた家計簿アプリの作り方を解説しました。このシステムを使えば、LINEに支出を入力するだけで自動的に記録・集計が可能になります。

プログラミングの知識がなくても、コードをコピー&ペーストすれば作成できますので、ぜひ挑戦してみてください。慣れてきたら、自分の使いやすいようにカスタマイズしていくとより便利になります。

家計管理をもっと簡単に、そして続けやすくするために、このLINE家計簿ボットを活用してください!