株主資本等変動計算書が手入力なのはなぜか、そしてChrome拡張で自動化する
ヘッダーに「仕訳帳」を足すだけのはずだった
自作の Chrome 拡張で、クラウド会計(会計ソフトA)の全ページのヘッダーに明細一覧と月次推移表の2つのボタンを出している。 普段使うのはこの2つだけだと判断して、他の導線は9月8日に全部やめたばかりだった。
その判断が少し外れていた。 仕訳帳へ直行したい場面が思ったよりずっと多い。
やることは1つ足すだけだ。
MF_home画面/content.js の NAV_BUTTONS に1行足す。
URL の cti を引き継ぎ、仕訳帳を開いているときは他と同じく押せない表示にする。
ここまでは Claude Code に書かせて、すぐ終わった。
終わらなかったのは、そのあとだった。
拡張をリロードしても、ボタンが増えない
拡張をリロードして、開いていたタブを再読み込みした。 ボタンは2つのままだった。
manifest の version を上げてからリロードした。変わらない。
拡張を無効にして、有効に戻した。変わらない。
dev-reload の合図(mfc:reload-extension)を送った。何も起きない。
新しいタブで同じページを開いたら、3つ目のボタンがあっさり出た。
content script はレンダラープロセス単位で生きていて、リロード前から開いていたタブには古いスクリプトが残り続ける。 version を変えても、無効にして戻しても、そのタブの中身は入れ替わらない。 リロード前から開いていたタブは拡張のコンテキストを失っているので、こちらが合図を送っても何も起きない。
近いことは CLAUDE.md に1行あった。 拡張を無効にしても開いているタブの content script は止まらない、という9月10日のメモだ。 ただしそれは「無効にしたのに重い」を切り分けたときの文脈で書いてあって、リロードしても表示が変わらない話とはつながっていなかった。 今回の形で書き足してもらってから、学習ゲートはスキップしてコミットした。
なぜ株主資本等変動計算書は手入力なのか
10時半すぎ、年次推移表のページを開いていた。
このページは年度が列に並んでいる。 貸借対照表と損益計算書はこの並びで出せるとして、株主資本等変動計算書も作れないだろうか。 配当を入れてあるので、純資産が何によって増えて、何によって減ったのかを年ごとに並べて見たかった。
決算書のほうに株主資本等変動計算書がある。 そちらの API を持ってくればいい。 そう思って画面を開いた。
変動事由の欄が、全部手入力だった。
期首と期末と当期純利益は入っている。 配当も、利益準備金の積立ても、自分で打ち込む欄になっている。
なぜ自動で作っていないのか、としばらく考えた。 他社のクラウド会計も同じだと分かって、ようやく腑に落ちた。
仕訳には「これは配当だ」と書いてある欄がない。 残っているのは、どの科目からどの科目へいくら動いたか、だけだ。 事由を補助科目で持っている事業者もいれば、持っていない事業者もいる。 どちらでも動くソフトを作るなら、事由の欄を空けて人に聞くのがいちばん確実になる。
逆に言えば、仕訳の形さえ決まっていれば、事由は機械で決められる。 そこを確かめたくなって、コードベースと仕訳の持ち方を調べてもらい、計画書を書かせた。
事由を決める規則と、その穴
計画の中心は、事由が「純資産科目 × 相手科目」の組で決まるという見立てだった。
繰越利益剰余金が減って未払配当金が増えれば、剰余金の配当。 繰越利益剰余金が減って利益準備金が増えれば、利益準備金の積立て。 この対応を型の表として持ち、仕訳を照らす。
期首と期末は貸借対照表から取れる。 事由が全部ついたなら、差し引きの残りはゼロになるはずだ。
Codex レビューを2回通した。
1回目で2点返ってきた。
1つめ。純資産どうしを先に相殺する規則を置くと、自己株式の処分差損(借方が預金とその他の資本剰余金、貸方が自己株式)が、消却と処分に分かれて誤分類される。 2つめ。タグは仕訳1本に1つしか付かないので、1本の中に2つの事由がある仕訳では配分を指定できない。 タグを型より優先させると、積立てまで配当に飲み込まれる。
そして、どちらも残差では検出できない。 誤分類しても金額の合計は合うので、残差はゼロのままになる。
この2点目が効いた。 残差ゼロを正しさの証明のように扱っていたが、残差が検出するのは漏れだけで、取り違えは検出しない。
規則を「行を対にして消す」から「仕訳全体の形を型の表に照らし、一致がちょうど1つのときだけ確定する」に改めさせた。 一致が0個でも2個以上でも、推定はせず「事由未確定」に残す。 処分差損の反例をテストに足して、2回目で承認になった。
判断が要る4点
残った判断は4つあった。 計画書 HTML に3択ボタンを埋め込んで、決裁フォームを立ててもらった。
- 表示の形:推移形式だけにする(行が科目と事由、列が年度)
- 型で決まらない事由の明示:仕訳のタグ
SS:事由名で示す。1本の仕訳は1事由に限る - 決算書への書き戻し:当期だけ、ボタンと差分確認つきで書き戻す
- 過年度の仕訳の取り方:消込の年度キャッシュを流用し、取得ボタンで年度を切り替える
4件とも推奨案をそのまま選んだ。 自由記述は1件も書かなかった。 各項目に、選ぶと何がどう変わるかが書いてあったので、迷う余地がなかった。
「明日やる」と決めた直後に撤回した
ここで切り上げることにした。 キリのいいところで終わりにして、翌日の Google タスクに登録してもらった。 翌朝6時から始めるつもりだった。
登録が終わった直後に、気が変わった。
計画書は書けている。 決裁も済んでいる。 明日の朝の自分が、今と同じ解像度でこれを読み直せるとは思えなかった。
セッション切り替えのプロンプトだけ出してもらって、そのまま実装に入った。 Google タスクへの登録のほうは、もう済んでしまっていた。
当期の仕訳から事由を確定させる
Phase 0 では仕訳を読まない。 期首と期末の差額だけで組む。
貸借対照表の純資産の行から期首と期末と当期純利益を拾って、表の枠だけ作る。
ここで引っかかったのが、繰越利益剰余金と「(うち当期純利益)」の2行だった。
他の科目には data-encrypted-id が振られているのに、この2行には id もリンクも無い。
ラベルの文字列で拾うしかなく、会計ソフト側が文言を変えれば読めなくなる。
読めなかった年度は表ごと「読めません」と出し、黙ってゼロにはしない方針にした。
Phase 1 で当期の仕訳を読む。
ledger_entries から純資産に触れる仕訳番号を拾い、journals?numbers= でその仕訳だけを取る。
実機で確かめた。 検証用の2026年度に、配当と積立てが1本にまとまった仕訳(No.392)がある。 これが「剰余金の配当 −632,000」と「利益準備金の積立て ±63,200」に分かれ、残差がゼロになった。
机上の指摘として受け取った「1本に2事由」が、手元のデータにそのまま入っていた。
過年度と、決算書への書き戻し
過年度の仕訳は、年度を切り替えないと読めない。
消込の機能が年度ごとの仕訳をキャッシュしているので、そこに sourceType と tagNames を足して流用した。
取得ボタンを押すと、年度を切り替え、保存し、元の年度に戻す。
2021年から2025年まで取ってみた。 事由未確定として残ったのは、2022年の −29,091 だけだった。 繰越の漏れだ。
最後に、決算書への書き戻しをやらせた。
手で打ち込むのではなく、拡張から送っている。
/ss_datas の表を読んで、当期の確定した事由を「新規」「上書き」「同じ」に分けて見せる。
行の無い事由は POST /ss_items で作り、値は各セルのフォームと同じ POST /ss_datas(既存は PUT)で1件ずつ送る。
送る前と後で current_term を見て、年度が変わっていたら止める。
上書きはチェックを入れないと送れないようにした。
検証用の2026年度で3件を書き戻したら、決算書に出ていた「金額が不一致」の表示が消えた。
決算のたびに手で打ち込んでいた欄が、仕訳から埋まった。
今日わかったこと
- 合計が合うことを正しさの根拠にしていた。残差ゼロが拾うのは漏れだけで、取り違えはすり抜ける
- 「自動で作れない」の正体は、たいてい「そのデータに書いていない」だった。株主資本等変動計算書の事由は、仕訳のどこにも書かれていない
- 拡張のリロードで表示が変わらないときは、まず新しいタブで開いて切り分ける。version を上げても無効化しても、開きっぱなしのタブには効かない
- 計画が固まった直後は、寝かせるより着手したほうが早い。明日の自分は、今日の自分ほど文脈を持っていない