こんにちは、GASおじです。中小企業の経営者さんやフリーランスの皆さん、毎月の予算管理で頭を悩ませていませんか?SaaSの予算管理ツールは便利だけど、月額料金が積み重なると結構なコストに…。そこで、Google Apps Script(以下GAS)を使って、Googleスプレッドシート上でシンプルかつ安全に予算管理ができる仕組みを作る方法をおじさん流に解説します。
今回のポイントは、
・既存データを直接上書きしない(安全第一!)
・入力データの検証をしっかり行う
・バッチ処理で効率よく書き込む
・バックアップとロールバック機能を備える
・追加のSaaS料金は発生せず、Googleアカウントの利用枠内で運用可能
というところ。では早速いきましょう。
■ 予算管理スプレッドシートの構成イメージ
おじさんが考える予算管理シートは以下のような構成です。
・予算入力シート:経費項目ごとに予算額を入力。ここは経営者や担当者が直接編集。
・支出記録シート:実際に発生した支出を日付・項目・金額で記録。
・集計シート(自動生成):最新のデータを元に月次で予算対実績を集計。こちらはスクリプトで新規作成・更新。
この中で、支出記録は日々追加されるため、既存データを壊さずに新しいシート(日時付き)へ集計結果を保存していく形が安全です。そうすれば万が一トラブルがあっても過去データはそのまま残るし、復元も容易です。
■ 初期設定と必要権限
このスクリプトを動かすには、以下の点を確認してください。
・Googleスプレッドシートの編集権限が必要です。
・スクリプトエディタでGoogle Apps Scriptのプロジェクトを作成。
・スクリプト実行時にスプレッドシートの閲覧・編集権限の許可を求められます。
・installable trigger(時間主導型トリガー)を設定すると、定期的なバックアップや集計を自動化可能です。
・個人情報を扱う場合は、スプレッドシートの共有範囲や保存先に十分注意してください。
■ 入力検証とバッチ書き込みのポイント
予算や支出を記録する際、数字以外が混じると集計が狂います。そこで以下のようにGASで入力検証を行い、問題なければまとめて書き込む例を紹介します。
function appendValidatedExpenses() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const inputSheet = ss.getSheetByName('支出記録シート');
const lastRow = inputSheet.getLastRow();
if (lastRow < 2) {
Logger.log('追加データなし');
return;
}
// 入力範囲(例:2行目以降のA:C列:日付、項目、金額)
const inputRange = inputSheet.getRange(2, 1, lastRow - 1, 3);
const inputValues = inputRange.getValues();
// 入力検証
const validatedData = [];
for (let i = 0; i < inputValues.length; i++) {
const [date, item, amount] = inputValues[i];
if (!(date instanceof Date)) {
Logger.log(`行${i+2}: 日付が不正です。スキップ`);
continue;
}
if (typeof item !== 'string' || item.trim() === '') {
Logger.log(`行${i+2}: 項目名が空です。スキップ`);
continue;
}
if (typeof amount !== 'number' || amount < 0) {
Logger.log(`行${i+2}: 金額が不正です。スキップ`);
continue;
}
validatedData.push([date, item.trim(), amount]);
}
if (validatedData.length === 0) {
Logger.log('有効なデータがありません');
return;
}
// 新規シート名に日時を付ける(例:集計_20260826_1530)
const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
const newSheetName = '集計_' + timestamp;
const newSheet = ss.insertSheet(newSheetName);
// 見出し行
newSheet.appendRow(['日付', '項目', '金額']);
// バッチ書き込み
newSheet.getRange(2, 1, validatedData.length, 3).setValues(validatedData);
Logger.log(`新しい集計シート「${newSheetName}」を作成しました。`);
}
このコードは、
・支出記録シートの2行目以降のデータを取得
・日付、項目、金額の検証を行い、不正な行はスキップ
・問題なければ新規シート(日時付き)を作成し一括書き込み
という流れです。既存シートのデータを消したり削除APIを使ったりしないので安全です。
■ バックアップとロールバックの考え方
スプレッドシートは気づかぬうちに誤操作でデータが壊れることもあります。だからこそ、
・集計は毎回「新しいシート」に作成する
・定期的にスプレッドシート全体のコピーをGoogleドライブ内に保存する(バックアップ)
この2段構えがオススメです。バックアップは以下のようにDriveAppを使って可能です。
function backupSpreadsheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const file = DriveApp.getFileById(ss.getId());
const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
const backupName = ss.getName() + '_backup_' + timestamp;
file.makeCopy(backupName);
Logger.log('バックアップファイルを作成しました: ' + backupName);
}
このバックアップ機能をinstallable triggerで例えば毎日深夜に動かす設定をすれば、万が一の復元も比較的簡単にできます。
■ コスト削減の仮定例
おじさんが想定するコスト削減効果はあくまでも仮定ですが、
・市販の予算管理SaaSを1社あたり月額3,000円利用していると仮定
・1年間で3,000円×12ヶ月=36,000円のSaaS費用が不要に(ただしスクリプトの実行上限やGoogleの利用枠はある)
これがすべての中小企業・フリーランスに当てはまるわけではありませんが、GASを使いこなせば運用コストの見直しに大きく寄与します。
□ 復元手順
もし誤って集計シートや支出シートを壊してしまった場合、
・直近のバックアップコピーをGoogleドライブから探す
・バックアップファイルを開いて復元したいデータを確認
・必要に応じて該当シートをコピーしてメインのスプレッドシートに戻す
この流れで復元できます。Googleスプレッドシートは自動保存・履歴機能もありますが、GASおじは「外部バックアップ」を必ずおすすめしています。
予算管理の自動化は最初はちょっと手間かもしれませんが、慣れれば運用が楽になるだけでなく、不正防止や透明性アップにもつながります。GASで自分だけのツールを作る楽しさもぜひ味わってください。
なお、このGASスクリプトはGoogleアカウントの利用枠内で動作し、追加の専用SaaS料金は発生しません。ただしApps Scriptのquota・実行時間制限はありますのでご注意ください。
■ GASの相談や導入サポートを見たい方へ
この記事と近い作業をGoogleシートやGASで整えたい方は、Gasおじのココナラ出品一覧もご覧ください。
■ 関連サービス
GASおじのココナラ出品一覧
日々の記録、確認、通知、投稿準備などを、GoogleスプレッドシートとGASで無理なく自動化する相談ができます。