0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASで教材費メモを月別・カテゴリ別に集計する最小コード

0
Posted at

教材費や部活会計のメモは、あとから「月ごと」「カテゴリごと」に見返したくなります。
でも、毎回フィルタや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を使った校務の小さな自動化例を、章ごとに独立したレシピとして扱っています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?