本記事では、Google Apps Script(GAS)とLINEを駆使して、簡単かつ効果的な家計簿システムを作成する方法をご紹介します。
Googleスプレッドシートで何かアプリを作ってみたい方や、LINE APIを活用して支出の管理アプリを手作りしてみたい方々にとって、参考になる情報をまとめています。
初心者でもわかりやすいように、画像付きでステップバイステップに構築手順をまとめ、サンプル用の完成版プログラムもご用意しています。
ぜひ、最後まで読んでいただきLINEでお手軽管理できる家計簿システムを作ってみてください。
GASとは
Google Apps Script(GAS)は、Googleによって開発されたスクリプト言語。
JavaScriptをベースとして開発されておりインターネット上で開発環境が整っているので開発の手間がかかりません。
GASを利用すると様々な業務の自動化やアプリ開発を簡単に行うことが可能。
GASの特徴
GASを利用するメリット、特徴は、以下になります。
Googleサービスとの連携が容易
「GASは、Googleによって開発されているため他のGoogleサービス(スプレッドシートやGmail、Googleカレンダーなど)との連携が簡単に行えます。
Googleサービスの機能拡張を図りたい方やGoogleサービスを連携したい方にはおすすめの言語です。
コンパイル不要なため即座に変更が反映される
GASは、スクリプト言語と呼ばれるコンパイルをせずに即時実行、展開ができる言語です。
JAVA言語などのコンパイル言語では、コンパイルと呼ばれるソースコードをアプリに変換する処理が必要ですがGASでは不要。
気軽に処理をカスタマイズして反映することができます。
定期実行やセキュリティ設定が簡単
GASは、トリガーと呼ばれるスケジュール実行機能を提供しています。
画面上で簡単な設定を行うだけで設定が可能。
また、セキュリティは、権限設定が細かく設けられており指定したユーザーや処理だけ許可するなどの設定が簡単に行えます。
GASとLINEで家計簿システムを作ってみよう
今回は、GASを利用してLINEで家計簿システムを作っていきます。
実装するシステムの機能は、以下。
機能一覧
- LINEメッセージにて出費の登録特定のキーワードが含まれるメッセージを送ることでスプレッドシートに支出の品目と金額を登録をします。
- LINEメッセージにて支出小計の表示「確認」と送信すると今まで登録した支出の品目ごとの小計金額が送信されます。
シンプルなシステムですがこのシステムでLINEにメッセージを送信するだけで支出管理が可能になります。
それでは作っていきましょう!
事前準備:支出管理用スプレッドシート作成
まずは、事前準備をいくつかしていきましょう。
最初に行うのは、支出管理用のスプレッドシートの作成です。
Googleドライブにアクセス。
ウェブブラウザからGoogleドライブ(https://www.google.com/intl/ja_jp/drive/)にアクセス。
「ドライブを開く」を押します。
ログインしていない方は、先にGoogleアカウントでログインしておきましょう。
ドライブを開くと画像のような画面になります。
スプレッドシート新規作成
新規ボタンをクリックしてスプレッドシートをクリックします。
スプレッドシートの始め方の詳しくはこちら。
ファイル名を設定
ファイル名は、「支出管理スプレッドシート」としておきましょう。
シート名は、「支出表」と「小計」としてそれぞれの表に画像のように列名を記入してます。
支出表
項目
年月日 | 種別 | 金額 |
小計
集計内訳
「拡張機能」-「Apps Script」をクリックします。
Apps Script画面に切り替わります。
この画面の詳細については、後ほどご説明します。
ひとまず画面右上の「デプロイ」ボタンから「新しいデプロイ」をクリックしてください。
「⚙」(歯車アイコン)-「ウェブアプリ」の順にクリックします。
アクセスできるユーザーを「全員」に設定しデプロイをクリックします。
完了画面に表示されるウェブアプリURLをコピーしておきましょう。
後ほど利用します。
これでスプレッドシートの作成は完了です。
事前準備:LINE APIの取得
LINEをシステムから操作するためには、LINE APIを使用します。
LINE APIを利用できるようになるには以下の操作を実施してください。
LINE Developersにアクセスし「コンソール」をクリックします。
LINE Developersとは何ができる?登録方法から活用法までを解説
アクセス時にLINEのアカウント認証を求められたりワンタイムパスワード入力などがありますので画面の指示に従ってログインしてください。
なおメールアドレスで登録も可能ですが、今回はLINEアカウントで登録します。
初回はLINE Developersコンソールにの登録が必要です。
開発者名、メールアドレスを入力し、「アカウント作成」ボタンをおします。
「新規プロバイダー作成」をクリックします。
プロパイダー名を入力し作成をクリックします。
今回は「ITツールの匠」と設定しましょう。
MessagingAPIをクリックします。
Messaging APIチャネルを作るためにLINE公式アカウントを作成する
2024年9月4日をもってLINE DevelopersコンソールからMessaging APIチャネルを直接作成することはできなくなりました。
そのためLINE公式アカウントを作成する必要があります。
LINE公式アカウントとは?個人利用や作成方法、料金プランまで徹底解説
すでにLINE公式アカウントを登録している方は先に進みましょう。
「LINE公式アカウントを作成する」を押します。
ログインしたらSMS認証を行います。
電話番号を入力し「SNSを送信」。
届いた認証番号を入力して「確認する」を押す。
「サービスに戻る」を押し元の画面に戻ります。
必要項目を入力して確認。
業種は個人で大丈夫です。
確認画面で問題がなければ完了ボタンを押して登録します。
完了を押したらLINE公式アカウントが作成されます。
「LINE Official Account Managerへ」を押しLINE Official Account Managerへ。
情報利用に関する同意についてを読んで「同意」を押します。
LINEヤフーグループへの情報提供に関する個別規約への同意についてを読み「同意」。
はじめに以下のような画面がでるので✗ボタンを押して閉じましょう。
Messaging APIを利用を有効にし、チャネルを作成しよう
LINE公式アカウントが開設されたら次はMessaging APIを有効にしましょう。
Messaging APIを有効にするとチャネルが作成されます。
Messaging APIはホーム画面右上→「設定」を選択。
「Messaging API」を押します。
「Messaging APIを利用する」を押す。
チャネル名設定画面で必要事項を入力します。
今回は、以下のように設定します。
プロバイダーを作成で「ITツールの匠」と入力し「同意」。
プロバイダーとは、ユーザーの個人情報を取得する開発者個人、企業、または団体等のこと。
わかりやすい名前を設定しましょう。
注意点は以下。
プロバイダー選択時の注意
一度、LINE公式アカウントを管理するプロバイダーを選択すると、後から別のプロバイダーに変更したり、Messaging APIとの連携を解除したりすることはできません。引用元:LINE公式アカウント
プライバシーポリシーと利用規約は未入力で「OK」を押す。
確認をし「OK」を押す。
設定後は、画面下部の合意にチェックを入れて「作成」をクリックします。
WebhookURLの設定
Messaging API画面のWebhookURLに先程GoogleAppsScript画面にてデプロイした際に入手したURLを入力して更新をクリックします。
Webhookの利用が有効になっていない場合は、「応答設定」ー「Webhook」をオンにしましょう。
Messaging APIチャネル・チャネルアクセストークンの発行
LINEデベロッパー(https://developers.line.biz/ja/)のコンソールへ。
作成したMessaging APIチャネルを開き、「Messaging API設定」タブを押す。
下の方にあるチャネルアクセストークンの「発行」ボタンを押してチャネルアクセストークン(長期)を発行してください。
以上で事前準備は、完了です。
GASにて家計簿システム開発
ここからは、GASを利用してプログラムを作成していきます。
先程作成したGoogleスプレッドシートにて「拡張機能」-「Apps Script」をクリックします。
GoogleAppsScript画面に切り替わります。
まずは、簡単にAppsScript画面についてご説明します。
1.プロジェクト名
クリックすると変更できます。
2.スクリプトファイル
プロジェクトに配置されているスクリプトファイルを確認できます。
各項目横の+ボタンを押すことでファイルを新規で作成できます。
3.ツールバー
スクリプト作成時に必要な操作ボタンがまとめられています。
保存やデバッグ、実行ログ表示、操作を1つ戻るなど
4.サイドバー
GASの設定や統計情報などを確認する画面に切り替えるためのボタンがまとめられています。
5.エディターエリア
スクリプトファイルの編集を行うエリア。
こちらにプログラムを記述していきます。
手始めにプロジェクト名を変更してみましょう。
今回は、家計簿スクリプトなので「household_account_system」に変更しましょう。
今回作成するプログラムの完成形は以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
//******************************** // 基本設定情報 //******************************** 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日'); // post_message = writeSheet(message_parameter, date); 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; } |
仕組みはどうでもいいのですぐに動かしたいという方はこちらをコピー&ペーストして動作確認の項に進んでいただければOKです。
内容も理解したいという方のためにスクリプト作成の手順を説明していきます。
設定情報記載
最初に今回の処理で利用する設定値をまとめて記載します。
以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//******************************** // 基本設定情報 //******************************** var ACCESS_TOKEN = '';//LINE APIトークン var URL = 'https://api.line.me/v2/bot/message/reply'; // 応答メッセージ用のAPI URL var ID = ''; //スプレッドシートID var SHEET_NAME_1 = '支出表' var SHEET_NAME_2 = '小計' var sh1 = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_1); var sh2 = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_2); var last_row_sh1 = sh1.getLastRow(); var last_row_sh2 = sh2.getLastRow(); |
ACCESS_TOKENには、事前準備にてLINE DevelopersにてコピーしたAPIトークンキーを記述します。
URLは「https://api.line.me/v2/bot/message/reply」を設定します。
このURLは、LINEの公式ドキュメントで提供されている応答メッセージ送信用のエンドポイントです。
このエンドポイントにメッセージを送信すると、LINE側にメッセージが返され、ユーザーに応答メッセージが表示されます。
SHEET_IDには、スプレッドシートのIDを記入します。
メイン処理(スプレッドシート情報読み書き&LINEメッセージ送信処理)
続いて今回のメインとなる関数を作成します。
以下の内容を設定値箇所の後ろに記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//******************************** // メイン処理(スプレッドシート読み書き&POST送信処理) //******************************** function doPost(e) { //受けっとLINEメッセージを加工 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日'); // post_message = writeSheet(message_parameter, date); 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); } |
メイン処理では、LINEからのメッセージを取得しメッセージ内容をもとにスプレッドシートへの読み書き用関数を呼び出し、LINE APIを利用してメッセージを送信するという流れになります。
※doPost関数を設定するときは、「Webアプリとしてデプロイ」を選択し、アクセス権を「全員」に設定する必要があります。
function doPost(e)と入力するとLINE上で送信されたメッセージなどの情報は、括弧内に記載されているeに格納されます。
LINEから送られてくる情報には、多くの情報が含まれているのでメッセージの確認と返信に必要な送信されたメッセージと返信時に利用する返信トークンを取得します。
このスクリプトでは、メッセージは、postmessage変数に格納しトークンは、token変数に格納します。
格納した情報は、次項で作成しる返信用関数であるReplyMessageをメッセージとトークンを設定して呼び出します。
スプレッドシート書き込み処理
メイン処理で呼び出すスプレッドシートへの書き込み処理を作成します。
以下の内容を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//******************************** // シート書き込み処理 //******************************** 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; } |
書き込み処理ではメイン処理で受け取ったLINEメッセージ情報(message_parameter)と日付情報(date)から必要な情報をスプレッドシートに書き込みしてきます。
まずは、支出表への書き込み処理。
以下のようにgetRangeにて設定先のセルを指定。setValueにて括弧の中の変数に格納されている値をセルに表示します。
1 2 |
sh1.getRange('A' + (last_row_sh1 + 1)).setValue(date); |
つづいて小計表への書き込み。
小計表への書き込みは、追加された出費の品目がすでに登録されていたらその品目の小計金額に加算。
新しい品目なら最終行に追加します。
小計の処理が完了したらLINEにて返答するようのメッセージを作成します。
登録した出費品目と金額を組み合わせてメッセージを作成します。
スプレッドシート読み込み処理
小計シートから品目と金額を取得する処理を記述します。
以下の内容を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//******************************** // シート読み込み処理 //******************************** 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; } |
小計シートの読み込みでは、forループを利用して小計シートの2行目から最終行まで繰り返し処理として品目と金額を”:”を区切り文字としてメッセージを作成します。
これでプログラム作成は、完了です。
スクリプトのデプロイ
スクリプトが完成したらLINEボットに適用させるためにデプロイが必要です。
GoogleAppsScript画面の「デプロイ」から「デプロイを管理」をクリックしてください。
編集ボタン(鉛筆アイコン)をクリックし、新バージョンを設定して「デプロイ」をクリックします。
これで設定完了です。
アクセスを承認とでたら承認作業をしましょう。
やり方はこちらをご覧ください。
動作確認
スクリプトが完成したので実際に動かして見ましょう。
まずは、LINEにボットを友だち追加します。
LINE Developers にアクセス、コンソール画面へ。
プロバイダーの「ITツールの匠」をクリックします。
「Messaging API設定」→ボットのベーシックIDでLINEの友だち追加。
友だち登録ができます
LINEの友だち追加で確認した友達IDで追加。
出費登録と小計確認を行ってみましょう。
スプレッドシートにも問題なく記述されています。
これで動作確認完了です!
もしエラーが発生した場合、以下を確認してください。
- 「Webアプリとしてデプロイ」時にアクセス権を「全員」に設定しているか
- スプレッドシートIDが正しいか
- LINE APIのトークンが正しく設定されているか
また、スクリプトを修正した場合再度デプロイをしましょう。
まとめ
今回は、LINEを使った家計簿アプリの作成方法をご紹介しました。
本記事の内容をまとめると以下。
GASは、今回ご紹介したように、言語がわかりやすく、開発環境の構築が不要なツールです。
作成した家計簿アプリをさらに改良していき自分の生活やお金の管理方法に合わせた最適な家計簿アプリを作ってみてください。