教材費や部活会計のメモは、あとから「月ごと」「カテゴリごと」に見返したくなります。
でも、毎回フィルタやSUM関数を組み直すのは地味に面倒です。
そこで、記録シートから月別・カテゴリ別の集計表を作る最小GASにします。
元にした章メモには、次の素材があります。
gas-expense-tracker(updateMonthlyReport/updateYearlySummary=記録シートを月別×カテゴリ別集計・CATEGORIES書換で部活/教材費に流用)
この記事では、その考え方を記事単体で使えるように、Googleスプレッドシート1冊で動かす形に絞ります。AI APIは使わず、スプレッドシート内の記録をGASで集計します。
シート構成
スプレッドシートに、次の2枚を用意します。
記録月別集計
記録 シートは、1行目を見出しにして、A列からD列までを次の形にします。
| 日付 | カテゴリ | 内容 | 金額 |
|---|---|---|---|
| 2026/9/1 | 教材 | 実験用消耗品 | 1200 |
| 2026/9/3 | 部活 | 備品 | 2500 |
カテゴリ名は、自分の運用に合わせて増減して構いません。この記事のコードでは 教材、部活、印刷、その他 を例にします。
コード
未検証: この作業環境ではGoogle Apps Scriptとして実行していません。構文と処理の流れが追いやすい最小例として掲載します。
const CATEGORIES = ['教材', '部活', '印刷', 'その他'];
function updateMonthlyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const source = ss.getSheetByName('記録');
const report = ss.getSheetByName('月別集計') || ss.insertSheet('月別集計');
const values = source.getDataRange().getValues();
const rows = values.slice(1).filter(row => row[0] && row[1] && row[3] !== '');
const totals = {};
rows.forEach(row => {
const date = new Date(row[0]);
const category = String(row[1]).trim();
const amount = Number(row[3]);
if (Number.isNaN(date.getTime()) || Number.isNaN(amount)) {
return;
}
const month = Utilities.formatDate(
date,
Session.getScriptTimeZone(),
'yyyy-MM'
);
if (!totals[month]) {
totals[month] = {};
CATEGORIES.forEach(name => totals[month][name] = 0);
}
const safeCategory = CATEGORIES.includes(category) ? category : 'その他';
totals[month][safeCategory] += amount;
});
const header = ['月', ...CATEGORIES, '合計'];
const output = [header];
Object.keys(totals).sort().forEach(month => {
const categoryTotals = CATEGORIES.map(name => totals[month][name]);
const monthTotal = categoryTotals.reduce((sum, value) => sum + value, 0);
output.push([month, ...categoryTotals, monthTotal]);
});
report.clearContents();
report.getRange(1, 1, output.length, output[0].length).setValues(output);
report.autoResizeColumns(1, output[0].length);
}
このコードでしていることは、次の4つです。
-
記録シートの2行目以降を読む - 日付から
yyyy-MMの月キーを作る - カテゴリごとに金額を足す
-
月別集計シートへ表として書き戻す
送信処理や外部API呼び出しは入れていません。扱うデータが会計メモなので、まずはスプレッドシート内で閉じる形にしておくと、共有範囲や権限を確認しやすくなります。
ハマりどころ1: 日付が文字列だと月がずれることがある
GASでは、スプレッドシートの日付セルが Date として読める場合と、文字列に近い形で読める場合があります。
上のコードでは new Date(row[0]) で受けていますが、入力形式がばらばらだと期待通りに変換できないことがあります。まずは 記録 シートのA列を日付形式にそろえ、手入力でも 2026/9/1 のように表記を統一しておくと扱いやすくなります。
月の表示は Utilities.formatDate() で yyyy-MM にしています。タイムゾーンは Session.getScriptTimeZone() を使って、スクリプト側の設定に合わせています。
ハマりどころ2: カテゴリの表記ゆれで集計が割れる
教材 と 教材費、部活 と 部活動 のように表記が分かれると、同じ意味でも別カテゴリとして扱われます。
この記事のコードでは、CATEGORIES にないカテゴリを その他 に寄せています。厳密に管理したい場合は、入力規則でカテゴリを選択式にしておく方が安定します。
たとえば 記録 シートのB列にデータの入力規則を設定し、教材,部活,印刷,その他 から選ぶ形にしておくと、表記ゆれを減らせます。
ハマりどころ3: 会計メモは「集計」より「元データ」の方が大事
集計表はあとから作り直せますが、元の 記録 シートが曖昧だと、合計の意味も曖昧になります。
最低限、次の列は分けておくと見返しやすくなります。
- 日付
- カテゴリ
- 内容
- 金額
必要なら、支払者、領収書の有無、備考などを追加します。ただし、個人情報や財務情報を含むシートは共有範囲に注意が必要です。GASで便利にする前に、誰が見られるスプレッドシートなのかを確認しておく方が安全です。
まとめ
教材費や部活会計のような小さな記録は、最初から大きな会計システムに寄せなくても、スプレッドシートとGASだけで月別・カテゴリ別の見通しを作れます。
ポイントは、元データを1行1件で残し、カテゴリ名をそろえ、集計表はGASで作り直せるようにすることです。
AIを使わない処理でも、校務の中では十分役に立つ場面があります。まずは送信や公開を含まない、読み取りと集計だけの小さな自動化から始めると、運用に乗せやすくなります。
既刊の紹介
この記事は、既刊『現役理科教員のGAS校務自動化レシピ』の章素材をもとに、記事単体で読めるように再構成したものです。書籍では、Google Apps Scriptを使った校務の小さな自動化例を、章ごとに独立したレシピとして扱っています。