← ケース一覧 AI SHOWCASE
単価 単価 単価 単価 単価 単価 単価
スプシ スプシ スプシ スプシ スプシ
うごいた うごいた
CASE 03 / 塾(まなびのさき)

生徒130名超の請求を、スプシの数式と手作業でPDF化していた

月謝作成アプリ
月謝計算生徒130名超2026年7月 公開
01 こまりごと

単価をひとつ直すと、過去の請求まで動きかねなかった

塾生130名超の月謝は、コマ数一覧のスプレッドシートに単価を数式で埋め込んで自動計算していました。 毎月、そこから「月謝のお知らせ」を生徒ごとに手作業でPDFにしていました。

もとの流れ

  1. コマ数一覧のシートに、生徒ごとの科目・週コマ数を入力する
  2. 単価のセルを数式で参照して、月謝を自動計算する
  3. 毎月、生徒ごとに「月謝のお知らせ」を手作業でPDF化する
  4. 単価改定・兄弟割引・特訓費用などは、そのつどセルを直接触って調整する
3番と4番がしんどいところです。単価のセルを直接書き換える作りだと、 値上げ・値下げのたびに確定した過去の月まで同じ数式で拾い直してしまうおそれがあります。 すでに配った請求書の金額が、後から動いてしまっては困ります。
02 どう解いたか

単価は「参照する場所」ではなく「そのとき写し取るもの」にした

単価表そのものを毎回見に行かせるのをやめました。明細の行を作る、その瞬間だけ単価をコピーして、 その行に実体として持たせています。あとから単価表を直しても、すでにある行はもう動きません。

BEFORE / 単価を直接参照している
単価表 数式で参照 生徒ごとの明細 確定した過去の月もふくめて全部 単価を1つ直すと、確定した過去の月まで一緒に動く
単価表 数式で参照し続ける 生徒ごとの明細 確定した過去の月もふくめて全部 単価を1つ直すと、 確定した過去の月まで一緒に動く

単価のセルを直接書き換える作りだと、過去と未来を分ける境目がどこにもない。

AFTER / 作った瞬間に実体コピー
単価表 正しい単価はここだけ 行をつくる瞬間だけコピー 生徒の明細行 その時の単価を 実体として持つ 作成中の月 新しい単価で計算 確定済みの月 当時の単価のまま 単価表を直しても、影響は次に作る行だけ 確定済みの月は、開いても変わらない
単価表 正しい単価はここだけ 行をつくる瞬間だけコピー 生徒の明細行 その時の単価を実体として持つ 作成中の月 新しい単価 確定済みの月 当時のまま 単価表を直しても、影響は次に作る行だけ 確定済みの月を開いても、金額は変わらない

単価表を直したときに矢印が伸びるのは「作成中の月」だけ。確定済みの月は、もうつながっていない。

03 なかみ

金額を変えたいときの入口は、2つしかない

「もっと簡単に直したい」は分かりますが、入口を増やすほどどこで金額が決まったか分からなくなります。 だから、あえて2つに絞りました。

金額を変える、たった2つの方法
1 単価表を直す 次に作る行・次の月にだけ効く 2 金額を直接、上書きする その1行だけ、理由ごと固定される 3 「戻す」を押す また単価表の計算に戻る 確定済みの月は、 そもそもこの3つが押せない

教材の単価改定では、599品目のうち実際に金額が動いたのは37件だけ。残りの562件と、すでにある発注・請求は1円も動いていない。

「壊れていない」と「動いていない」はちがう

仕組みを決めても、それだけでは終わりません。実際に踏んだのは、 エラーは出ないのに、数字だけ静かにズレるタイプの事故でした。

TROUBLE 01

確定した月を開いただけで、いまの生徒が紛れ込んだ

過去の4月分(すでに配り終えた月)を見に行ったら、生徒が121名から137名に増えていました。 新しく入った生徒は、4月にはまだ在籍していません。

原因は、月の画面を開くたびに「今の在籍者ぶんのレコードが揃っているか」を毎回チェックして、 足りなければ足すという作りにしていたこと。過去の月にも、いまの在籍者を基準に空の明細 (通常コマ1行+管理費)が足されていました。
ここから決めたルール

・配り終えた月には「確定済み」の印を付け、生徒を後から足さない

・確定済みの月は、いまの在籍状況ではなく「当時、実際に請求があった生徒」だけを表示する

TROUBLE 02

取り込んだあとで、スプレッドシートの方が動いていた

ある月を突き合わせたら、40名・合計¥144,448ぶんズレていました。 アプリが壊れたのかと思って調べましたが、原因はそこではありませんでした。

取り込んだのはある日時点のスプレッドシート。その後もスプレッドシート側では、 入塾・退塾・追加コマの記録が普通に続いていました。取り込んだ後に増えた分が、 アプリ側に反映されていなかっただけでした。
ここから決めたルール

・取り込みは「その日時点の紙面」と1件ずつ突き合わせてから確定する

・小計・消費税・合計を計算し直して元の数字と一致するか自己検証し、合わなければ取り込みを止める

TROUBLE 03

年月を手で打っている途中に、空の月ができた

年月の欄を手で打っていたら、まだ入力の途中の文字(例えば5桁の数字)でも、 その時点で新しい月が1つ作られていました。135名ぶんの空の明細つきで。

「文字が入力された」ことと「正しい年月が決まった」ことを、同じタイミングとして扱っていました。 1文字打つたびに月を作る側が動いていたので、途中の状態でも月が生成されてしまいました。
ここから決めたルール

・年月は「6桁の数字・01〜12月」という形を通ったときだけ月を作る

・そもそも年月を手打ちさせず、データがある月のボタンから選ぶ形に変えた

05 いま

過去の請求書は、もう動かない

130名超
生徒の数
599品目
教材マスターの品目
37
単価が変わった品目(他は不変)
6か月
過去の実績を確定・保護
06 つかっているもの

ぜんぶ、要望を伝えて作ってもらった

ReactTypeScriptVite Firebase(暗号化して複数端末で同期)Claude Code
僕はコードを1行も書きません。「ここをこうしたい」「これだと現場で困る」を伝えて、AIに作ってもらっています。

便利な機能を提案されて、断ったことがあります。「それを入れると、過去の請求書の金額が後から変わる可能性がある」 と言われたからです。

値上げは待ってくれても、もう配った請求書は待ってくれません。