【GAS不要/ステップ形式で解説】計算ミスと集計作業をなくすGoogleスプレッドシート小口現金管理システムの作り方

Googleスプレッドシート

「小口現金の残高が合わない」
「手作業での管理に手間がかかる」
「月次の集計作業が大変」
といった悩みは、小口現金管理でよく発生します。

この記事では、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は⌘)を押しながら複数選択し、メニューの 表示形式 > 数字 > 通貨(端数切り捨て) を設定します。
  • 塗りつぶしの設定:
    1. メニューの 表示形式 > 条件付き書式 をクリックします。
    2. 「範囲に適用」に B6:Z8 と入力します。
    3. 「書式ルール」で「空白ではない」を選択し、塗りつぶしの色をグレーに設定して「完了」します。
    4. 「+ 条件を追加」をクリックし、「範囲に適用」に 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: 取引が見つからない場合に表示する期首残高セルです。