「小口現金の残高が合わない」
「手作業での管理に手間がかかる」
「月次の集計作業が大変」
といった悩みは、小口現金管理でよく発生します。
この記事では、Googleスプレッドシートの標準関数のみを使い、これらの作業を効率的に自動化する「小口現金管理システム」の構築方法を解説します。
プログラミング(GAS)を一切使わずに構築できますので、この記事の手順に沿って進めることで、どなたでもこの仕組みを理解し、業務に合わせて調整できるようになります。
はじめに:システムの基本設計
システム構築を始める前に、使用時のミスを減らし、分かりやすいシートにするための「3つの基本ルール」を決めます。
基本ルールの設定
- 入力セルと数式セルを分ける
手で直接入力するセルと、数式によって自動で計算されるセルを明確に区別します。これにより、誤って数式を消してしまうといった事故を防ぎます。 - 数式セルは色付けする
ルール1を徹底するため、数式が入っているセル(または、数式によって自動で値が入力されるセル範囲)はグレーで塗りつぶします。これにより「この色のセルは編集しない」ということが視覚的に分かります。 - 表示形式を統一する
日付は「yyyy/mm/dd」形式、金額は「通貨(端数切り捨て)」形式に統一します。これにより、シート全体の見た目が整い、入力ミスも減らせます。
ステップ1:土台を作る【設定シート】
まず、システムの基準となるマスターデータを準備します。

1.1. シートの作成と設定
1. シートを作成
Googleスプレッドシートを新規作成し、ファイル名を「小口現金管理シート」とし、シート名を「設定」に変更します。
2. 勘定科目リストを作成
A1セルに「勘定科目」と見出しを入力します。
A2セル以下に、「交通費」「消耗品費」「会議費」「雑費」など、ご自身の業務で使う勘定科目をすべてリストアップしてください。
💡ポイント: このシートをマスターデータとすることで、後の入力作業で表記ゆれが発生するのを防ぎ、正確な集計が可能になります。
ステップ2:お金の動きを記録する【入出金明細シート】
次に、すべての取引を記録する、システムの中心となる「入出金明細シート」を作成します。

2.1. シートの準備とレイアウト
1. シートを作成
新しいシートを追加し、名前を「入出金明細」に変更します。
2. 見出しを作成
1行目に、以下の8つの見出しをA列からH列にかけて入力します。
| A1セル | B1セル | C1セル | D1セル | E1セル | F1セル | G1セル | H1セル |
|---|---|---|---|---|---|---|---|
| 日付 | 相手先 | 摘要 | 勘定科目 | 入金額 | 出金額 | 残高 | 備考 |
3. 見出し行を固定する
データを下に入力していくと見出しが見えなくなるため、1行目の見出しが常に表示されるように固定します。
メニューの 「表示 > 固定 > 1行」 をクリックします。
2.2. 書式と色の設定
日付列の書式設定
A列全体を選択し、メニューの 「表示形式 > 数字 > 日付 (yyyy/mm/dd)」 をクリックします。
金額列の書式設定
E列、F列、G列をまとめて選択し、メニューの 「表示形式 > 数字 > 通貨(端数切り捨て) 」をクリックします。
数式列の色設定
G列(残高)は数式で全自動計算されるため、誤って編集しないように列全体をグレーで塗りつぶしておきましょう。
2.3. 残高の完全自動計算
1. 期首残高を入力
計算の起点となる期首残高の情報を、2行目に入力します。
- A2セル: 管理を開始する日付(例: 2025/5/1)を入力します。
- G2セル: その時点の残高(例: 50000)を入力します。
- H2セル: 「期首残高」などのメモを入力します。
計算式を入力
G3セルに、以下の数式をコピー&ペーストしてください。
=MAP(A3:A, LAMBDA(date, IF(date="",, G$2 + SUMIFS(E$3:E, A$3:A, "<="&date) - SUMIFS(F$3:F, A$3:A, "<="&date))))
💡この数式の目的: この数式は、各行の日付を見て、その日までの入出金をすべて再計算し、正しい残高を表示します。MAP関数とSUMIFS関数を組み合わせることで、日付が順番通りに入力されていなくても、常に正確な残高が維持されるという、非常に堅牢な仕組みを実現しています。
2.4. 勘定科目をプルダウンで入力

1. データの入力規則を設定する
メニューの 「データ > データの入力規則 」をクリックします。
2. 入力規則ルールを追加
右側に表示されたサイドバーで「+ ルールを追加」をクリックします。
3. ルールを設定する
- 範囲に適用: 「D3:D 」と入力します。
- 条件: 「プルダウン(範囲内)」を選択します。
- 範囲: テキストボックスに 「=’設定’!$A$2:$A 」と入力します。
4. ルールを適用する
「詳細オプション」をクリックし、「データが無効な場合」は「入力を拒否」を選択して「完了」します。
2.5. 期首残高行の保護
2行目は期首残高を管理する特別な行です。日付と金額、備考以外は入力できないように保護します。

1. セルを色付けする
B2セルからF2セルまでを選択し、ツールバーの「塗りつぶし」アイコンからグレーを選択して塗りつぶします。
2. 保護するセル範囲を選択
(セルが選択された状態で)メニューの 「データ > データの入力規則 」をクリックします。
3. 入力規則ルールを追加
右側に表示されたサイドバーで「+ ルールを追加」をクリックします。
4. カスタム数式を設定
「条件」のプルダウンメニューから「カスタム数式」を選択し、テキストボックスに以下の数式を入力します。
=FALSE
5. ルールを適用
「詳細設定」を開き、「データが無効な場合」は「入力を拒否」が選択されていることを確認し、「完了」をクリックします。
2.6. 運用上のポイント:日付で並べ替える(※必要になったら)
このシートの残高計算は、日付が順番通りでなくても正しく行われます。
しかし、後から帳簿を見返す際には、日付順に並んでいた方が分かりやすいです。
月に一度など、定期的に並べ替えを行うことをお勧めします。
1. 並べ替える範囲を選択する
A3セルから、データが入力されている一番右下のセル(H列の最終行)までをすべて選択します。
見出し(1行目)と期首残高(2行目)は含めないように注意してください。
2. 並べ替え機能を開く
メニューの 「データ > 範囲を並べ替え > 範囲の詳細な並べ替えオプション 」をクリックします。
3. 並べ替えを実行する
「データにヘッダー行が含まれている」のチェックを外し、「並べ替えの条件」を「列 A」、昇順を選択し、「並べ替え」ボタンをクリックします。
ステップ3:現金を数える【金種表シート】
次に、日々の締め作業である「現金実査」を記録し、帳簿とのズレを確認できるシートを作成します。
3.1. シートの準備とレイアウト
1. シートを作成
新しいシートを追加し、名前を「金種表」に変更します。
2. 見出しを作成
1行目に、以下の見出しをA列からM列にかけて入力します。
| A1 セル | B1 セル | C1 セル | D1 セル | E1 セル | F1 セル | G1 セル | H1 セル | I1 セル | J1 セル | K1 セル | L1 セル | M1 セル |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 日付 | 1万円 | 5千円 | 千円 | 500円 | 100円 | 50円 | 10円 | 5円 | 1円 | 現金有高 | 帳簿残高 | 過不足 |
3. 見出し行を固定する
メニューの 表示 > 固定 > 1行 をクリックします。
3.2. 書式と色の設定
日付列の書式設定
A列全体を選択し、メニューの 表示形式 > 数字 > 日付 (yyyy/mm/dd) をクリックします。
金額列の書式設定
K列、L列、M列をまとめて選択し、メニューの 表示形式 > 数字 > 通貨(端数切り捨て) をクリックします。
数式列の色設定
K列、L列、M列はすべて数式で自動計算させるため、3つの列全体をグレーで塗りつぶしておきましょう。
3.3. 自動計算の設定
1. K2セル(現金有高)の数式
=ARRAYFORMULA(IF(A2:A<>"", MMULT(IF(ISNUMBER(B2:J), B2:J, 0), {10000;5000;1000;500;100;50;10;5;1}), ""))
2. L2セル(帳簿残高)の数式
=MAP(A2:A, LAMBDA(date, IF(date="",, XLOOKUP(date, '入出金明細'!A2:A, '入出金明細'!G2:G, "", -1, -1))))
3. M2セル(過不足)の数式
=ARRAYFORMULA(IF(LEN(A2:A), K2:K-L2:L, ""))
ステップ4:月次レポートを自動生成【ダッシュボード】
最後に、入力したデータを自動で集計し、月次レポートとして表示する「ダッシュボード」シートを作成します。

4.1. シートの準備とコントロールセルの設定
1. シートを作成
新しいシートを追加し、名前を「ダッシュボード」に変更します。
2. コントロールセルを設定
- A1セルに「集計年月」と見出しを入力します。
- B1セルに、レポートを見たい月の1日の日付(例: 2025/5/1)を入力します。
- B1セルをより使いやすく、間違いが起きないように以下の2つの設定を適用します。
- 表示形式の変更: B1セルを選択し、メニューの 表示形式 > 数字 > カスタム数値形式 で yyyy”年”m”月” と入力します。
- 入力規則の設定: B1セルを選択し、メニューの データ > データの入力規則 を開きます。「ルールを追加」をクリックし、以下の設定を行ってください。
- 条件: 「カスタム数式」を選択します。
- 数式: 「=DAY(B1)=1」 と入力します。
- 詳細オプション: クリックして開き、選択したセルのヘルプテキストを表示にチェックを付け、ヘルプテキストに「集計したい月の1日を「2025/7/1」のように入力してください」と設定します。
- データが無効の場合: 「入力を拒否」を選択します。
4.2. 「月次サマリー」セクションの作成
1. 見出しを入力
| A3セル | A4セル | B3セル | C3セル | D3セル | E3セル |
|---|---|---|---|---|---|
| 月次サマリー | 合計 | 前月繰越 | 当月入金額 | 当月出金額 | 翌月繰越 |
2. 書式と色を設定
B4セルからE4セルを選択し、グレーで塗りつぶし、続けてメニューの 表示形式 > 数字 > 通貨(端数切り捨て) をクリックして書式も設定します。
3. B4セル (前月繰越)
- =XLOOKUP(EOMONTH(B1, -1), ‘入出金明細’!A2:A, ‘入出金明細’!G2:G, ‘入出金明細’!G2, -1, -1)
4. C4セル (当月入金額)
=SUMIFS('入出金明細'!E3:E, '入出金明細'!A3:A, ">="&B1, '入出金明細'!A3:A, "<="&EOMONTH(B1, 0))
5. D4セル (当月出金額)
=SUMIFS('入出金明細'!F3:F, '入出金明細'!A3:A, ">="&B1, '入出金明細'!A3:A, "<="&EOMONTH(B1, 0))
6. E4セル (翌月繰越)
=B4+C4-D4
4.3. 「勘定科目別」「相手先別」セクションの作成
1. 見出しを入力
| A6セル | A7セル | A8セル | A10セル | A11セル | A12セル |
|---|---|---|---|---|---|
| 勘定科目別 | 入金合計 | 出金合計 | 相手先別 | 入金合計 | 出金合計 |
2. 動的な書式設定(条件付き書式)
- 通貨形式の設定: 行番号「7」「8」「11」「12」をCtrlキー(Macは⌘)を押しながら複数選択し、メニューの 表示形式 > 数字 > 通貨(端数切り捨て) を設定します。
- 塗りつぶしの設定:
- メニューの 表示形式 > 条件付き書式 をクリックします。
- 「範囲に適用」に B6:Z8 と入力します。
- 「書式ルール」で「空白ではない」を選択し、塗りつぶしの色をグレーに設定して「完了」します。
- 「+ 条件を追加」をクリックし、「範囲に適用」に B10:Z12 と入力し、同様に「空白ではない」ルールでグレーに塗りつぶし、「完了」します。
3. B6セル (勘定科目リスト)
=IFERROR(TRANSPOSE(UNIQUE(FILTER('入出金明細'!D3:D, '入出金明細'!A3:A>=B1, '入出金明細'!A3:A<=EOMONTH(B1, 0)))))
4. B7セル (勘定科目別 入金合計)
=MAP(B6:Z6, LAMBDA(category, IF(category="",, SUMIFS('入出金明細'!E3:E, '入出金明細'!D3:D, category, '入出金明細'!A3:A, ">="&B1, '入出金明細'!A3:A, "<="&EOMONTH($B$1, 0)))))
5. B8セル (勘定科目別 出金合計)
=MAP(B6:Z6, LAMBDA(category, IF(category="",, SUMIFS('入出金明細'!F3:F, '入出金明細'!D3:D, category, '入出金明細'!A3:A, ">="&$B$1, '入出金明細'!A3:A, "<="&EOMONTH($B$1, 0)))))
6. B10セル (相手先リスト)
=IFERROR(TRANSPOSE(UNIQUE(FILTER('入出金明細'!B3:B, '入出金明細'!A3:A>=B1, '入出金明細'!A3:A<=EOMONTH(B1, 0)))))
7. B11セル (相手先別 入金合計)
=MAP(B10:Z10, LAMBDA(partner, IF(partner="",, SUMIFS('入出金明細'!E3:E, '入出金明細'!B3:B, partner, '入出金明細'!A3:A, ">="&$B$1, '入出金明細'!A3:A, "<="&EOMONTH($B$1, 0)))))
8. B12セル (相手先別 出金合計)
=MAP(B10:Z10, LAMBDA(partner, IF(partner="",, SUMIFS('入出金明細'!F3:F, '入出金明細'!B3:B, partner, '入出金明細'!A3:A, ">="&$B$1, '入出金明細'!A3:A, "<="&EOMONTH($B$1, 0)))))
ステップ5:シートを保護して完成度を高める
最後に、誤操作を防ぐために「保護機能」を設定します。入力が必要なセル以外をすべてロックします。
5.1. 保護の設定方法
1. 保護パネルを開く
メニューの データ > シートと範囲を保護 をクリックします。
2. シートを保護する
「+ シート / 範囲を追加」をクリックし、「シート」タブを選択します。
3. 例外セルを設定する
保護したいシート(例: 入出金明細)を選び、「特定のセルを除く」にチェックを入れます。入力欄に、そのシートで手入力が必要な範囲(次の「5.2」で説明)を指定します。
4. 権限を設定する
「権限を設定」をクリックし、保護範囲を編集できるユーザーを「自分のみ」に設定して「完了」します。

5.2. 各シートの保護範囲
以下の設定を4つのシートすべてで行ってください。
- 「入出金明細」シート: A2, G2:H2, A3:F, H3:H
- 「金種表」シート: A2:J
- 「ダッシュボード」シート: B1
- 「設定」シート: A2:A
まとめ:数式だけで作る、業務効率化の第一歩
お疲れ様でした!
これで、単なる表計算ソフトの利用から一歩進んだ、数式だけで動く高機能な「小口現金管理システム」が完成しました。
このシートが持つ機能をおさらいしてみましょう。
- 計算の自動化: 残高や合計はすべて自動計算され、手入力による計算ミスは起こりません。
- 現金実査の効率化: 手元の現金を数えて入力するだけで、帳簿残高との差額が自動で表示されます。
- レポートの自動化: 見たい年月を入力するだけで、月次のレポートが自動で作成されます。
- 堅牢性の確保: シート保護機能により、数式やレイアウトが誤って変更されるのを防ぎます。
重要なのは、これらすべてがプログラミングを一切使わず、標準の関数を組み合わせるだけで実現できたという点です。
このような考え方は、小口現金管理だけでなく、売上管理や勤怠管理など、様々な業務に応用することができます。
ぜひ、このシートをあなたの業務改善の第一歩としてご活用ください。
【おまけ】数式カスタマイズガイド
この記事で紹介した数式を、ご自身の業務に合わせて改造したい方向けに、主要な数式の意味とカスタマイズのポイントを解説します。
1. 「入出金明細」シート G3セル (残高の自動計算)
目的
日々の取引ごとの残高を、列全体で自動計算する。
数式
=MAP(A3:A, LAMBDA(date, IF(date="",, G$2 + SUMIFS(E$3:E, A$3:A, "<="&date) - SUMIFS(F$3:F, A$3:A, "<="&date))))
分解解説
- MAPとLAMBDA: A3以降の各行に対して、中の処理を繰り返します。
- SUMIFS: 各行のdate(日付)を基準に、「その日までの」入金額と出金額の合計をそれぞれ計算します。
- G$2 + …: 期首残高を起点に、その日までの入出金を差し引きして、その時点での正しい残高を算出します。
カスタマイズのポイント
- A3:A: 計算のトリガーとなる日付列です。
- G$2: 期首残高が入力されているセルです。$で固定しているのがポイントです。
- E$3:E: 入金額が記録されている列です。
- F$3:F: 出金額が記録されている列です。
2. 「金種表」シート K2セル (現金有高の自動計算)
目的
入力された金種の枚数から、合計金額を自動計算する。
数式
=ARRAYFORMULA(IF(A2:A<>"", MMULT(IF(ISNUMBER(B2:J), B2:J, 0), {10000;5000;1000;500;100;50;10;5;1}), ""))
分解解説
- MMULT: 「枚数」と「金額」の表を掛け合わせて、合計を一気に計算します。
カスタマイズのポイント
- B2:J: 金種の枚数を入力する範囲です。列の構成が変わる場合はここを修正してください。
- {10000;…;1}: 各金種の金額です。B2:Jの列の並び順と、この{}内の金額の並び順を必ず一致させてください。
3. 「金種表」シート L2セル (帳簿残高の自動取得)
目的
「入出金明細」シートから、指定日の最終残高を検索する。
数式
=MAP(A2:A, LAMBDA(date, IF(date="",, XLOOKUP(date, '入出金明細'!A2:A, '入出金明細'!G2:G, "", -1, -1))))
分解解説
- MAPとLAMBDA: A列の日付を一つずつ取り出し、XLOOKUP処理を繰り返します。
- XLOOKUP(…, -1, -1): -1で「下から検索」を指定し、その日の最後の取引残高を取得します。
カスタマイズのポイント
- A2:A: 検索キーとなる**日付列(金種表シート内)**です。
- ‘入出金明細’!A2:A: 検索対象となる日付列(入出金明細シート内)です。
- ‘入出金明細’!G2:G: 検索して取り出したい残高列(入出金明細シート内)です。
4. 「ダッシュボード」シート B4セル (前月繰越)
目的
指定した月の前月末時点の残高を正しく表示する。
数式
=XLOOKUP(EOMONTH(B1, -1), '入出金明細'!A2:A, '入出金明細'!G2:G, '入出金明細'!G2, -1, -1)
分解解説
- EOMONTH(B1, -1): B1セル(集計年月)の前月末日を計算します。
- XLOOKUP(…): その前月末日以前の最後の残高を探しに行きます。
- …, ‘入出金明細’!G2, …: もし前月に取引が一件もなかった場合は、期首残高(G2セル)を表示します。
カスタマイズのポイント
- B1: 集計年月が入力されているコントロールセルです。
- ‘入出金明細’!A2:A: 検索対象となる日付列です。
- ‘入出金明細’!G2:G: 検索して取り出したい残高列です。
- ‘入出金明細’!G2: 取引が見つからない場合に表示する期首残高セルです。


