[{"data":1,"prerenderedAt":216},["ShallowReactive",2],{"content-/accounting-ledger-extension-phase23":3,"all-pages-for-dir":195,"related-/accounting-ledger-extension-phase23":196,"og-image-/accounting-ledger-extension-phase23":215},{"id":4,"title":5,"body":6,"category":174,"concepts":175,"description":176,"extension":177,"meta":178,"navigation":179,"ogImage":175,"path":180,"project_name":181,"published":182,"publishedAt":183,"seo":184,"source":185,"stem":186,"tags":187,"todo":175,"unpublished":182,"updatedAt":175,"__hash__":194},"pages/2026-09/2026-09-05/accounting-ledger-extension-phase23.md","クラウド会計の帳簿を点検するChrome拡張を自作し、総勘定元帳まで広げた",{"type":7,"value":8,"toc":162},"minimark",[9,13,16,20,23,31,34,37,40,44,47,50,53,56,59,75,78,81,84,87,90,93,96,103,106,109,113,116,119,122,125,128,132,135,138,141,144,147,150,153,156,159],[10,11,12],"p",{},"会計ソフトAの推移表（月次）を開くと、列見出しが2段に見えた。同じ月が上下に重なって並んでいて、どちらが本物の行なのか分からない。自分でも触ってみたが、うまく直せなかった。",[10,14,15],{},"この画面には前から自作の拡張を1本かぶせている。だから自分の拡張が原因だろうとは思った。ただ、会計ソフト側の画面更新で崩れた線もある。どちらか決めないまま消しにかかると、直したつもりで別のものを壊す。",[17,18,19],"h2",{"id":19},"見出しが2段になっていた理由",[10,21,22],{},"調べさせたら、犯人は自分の拡張だった。",[10,24,25,26,30],{},"表をコピーする機能のために、見出し用のテーブルの ",[27,28,29],"code",{},"thead"," を本体のテーブルへ複製していた。複製した行はコピーのときにしか要らないのに、画面にも残り続ける。だから同じ月が2段に見えていた。複製をやめさせ、コピーを押した瞬間だけ2枚の行を結合する形に変えさせた。",[10,32,33],{},"同じ拡張には、他にも直すところがあった。コピーのボタンは会計ソフトA標準のボタンと見た目が違って浮いていたので、標準に揃えたうえで「補助科目をすべて開く」の行の右端へ寄せた。右クリックメニューからコピーを実行すると初期化処理が走り直し、ボタンが二重に挿入されていた。動いていないループも1つ残っていた。",[10,35,36],{},"崩れは推移表だけではなかった。ホーム画面ではメニューの枠が増えていく。URLが変わるたびに枠を作り直す作りなのに、前の枠を消していないからだ。仕訳帳では枠が2つ重なって、100pxの空白ができていた。表示するリンクが1つもないページでは、空の枠だけが入って余白を作っていた。どちらもその場で直させた。",[10,38,39],{},"自分で入れたものが自分の画面を汚していた。ただ、この手の崩れは放っておくと、会計ソフトAはそういう表示なのだとこちらが慣れてしまう。",[17,41,43],{"id":42},"他社の拡張を読んで仕様だけ写す","他社の拡張を読んで、仕様だけ写す",[10,45,46],{},"会計ソフトB向けに、帳簿を点検する拡張が公開されている。マイナスの残高や科目の変動を色で教えてくれるやつだ。これを会計ソフトA側に取り込めないかと聞いてみた。",[10,48,49],{},"ローカルに落として読ませたら、JavaScriptが7,346行あった。中身を見て面白かったのは、判定を担う部分が画面の構造に一切依存していなかったことだ。数値の配列を渡すと指摘が返る、それだけの関数の集まりになっている。だとすれば、会計ソフトAの表を読んで数値の配列にする部分さえ書けば、機能の大半は移せる。",[10,51,52],{},"ただしライセンス表記がない。第三者の著作物なので、コードは1行も流用しない。何を、どの閾値で、どう指摘するか。その仕様だけを写して自作する、という線を引いた。閾値や科目名の並びは会計の一般知識なので、同じ値を使ってかまわない。",[17,54,55],{"id":55},"決めることは4つあった",[10,57,58],{},"移植計画を書かせたら、判断が要る点が4つ出てきた。決裁フォームで一度に答えた。",[60,61,62,66,69,72],"ul",{},[63,64,65],"li",{},"置き場所：既存の拡張に足すか、独立した拡張にするか。独立させた",[63,67,68],{},"Phase 1の範囲：推移表だけにするか、試算表まで含めるか。推移表（月次）だけにした",[63,70,71],{},"判定の作り：中央値と中央絶対偏差で外れ値を見るか、前月比の単純な割合で済ませるか。前者にして、感度を3段階にした",[63,73,74],{},"「確認済み」メモの保存先：ブラウザ内か、スプレッドシートか。ブラウザ内にした",[10,76,77],{},"計画書はCodexに3回レビューさせた。1回目は「確認済みのキーに科目、年月、金額、集計条件を含めて、どういうときに失効するかを定義せよ」。2回目は「比較元の月の仕訳を直しても指摘の根拠は変わるのだから、系列そのもののハッシュもキーに入れよ」。3回目で承認が出た。",[10,79,80],{},"一度見たセルに「確認済み」の印を付けたら、あとで数字が動いたときには印が外れてほしい。その「動いた」の定義を先に決めておけ、という指摘だった。言われるまで、印は押すことだけ考えていた。",[17,82,83],{"id":83},"推移表から総勘定元帳まで",[10,85,86],{},"セッションを切って実装に入った。コミット前にクイズを出す学習ゲートは、このリポジトリでは全部スキップでいいと決めた。",[10,88,89],{},"Phase 1は推移表（月次）を読む。拾うのは、マイナスの金額、新しく発生した科目、前は動いていたのに計上のなくなった科目、貸借対照表の増減パターンの崩れ、地代家賃のブレ、損益の大きな変動、役員報酬の定期同額、役員賞与だ。締め途中の当月と、まだ来ていない月は見ない。指摘はセルの色とツールチップで出させ、右下のパネルに一覧を並べて前後へ飛べるようにした。",[10,91,92],{},"途中で「前年と比べて異常値を出すやつ、あれはPhase 2でしたっけ」と聞いた。前期比較がそれだった。",[10,94,95],{},"Phase 2は残高試算表と前期比較に広げた。期末残高と前期残高のマイナス、諸口に残っている残高、債権や債務の科目で補助科目の付いていない残高を指摘させる。前期比較では、増減額の列に前期との差分を出させた。率20%と額50万円の両方を見て、どちらもポップアップから変えられる。ただし当期の途中で開くとほとんどの科目が「減少」で鳴るので、年次の締めで使う前提にした。",[10,97,98,99,102],{},"Phase 3は総勘定元帳と補助元帳。ここは画面がReactで、クラス名にハッシュが付く。DOMを読む作りにすると次の更新で壊れる。だから行の中身は ",[27,100,101],{},"GET /api/v1/ledger_entries"," から取らせ、DOMは色を付けるためだけに使わせた。拾うのは消費税区分の取り違え（費用に課税売上、収益に課税仕入、区分が「不明」）と旧税率、それに消耗品費10万円以上と修繕費20万円以上だ。検索やページ送りで画面が描き直されるので、MutationObserverで追従させている。",[10,104,105],{},"少額特例の判定は見送った。1万円未満かどうかは取引全体の税込額で決まるのに、元帳の1行からはそれを確定できない。",[10,107,108],{},"テストはPhase 3の時点で100件が緑になり、その日の最後は106件になった。コードはテスト込みで3,700行ほどだ。",[17,110,112],{"id":111},"_10万円では何も鳴らなかった","10万円では、何も鳴らなかった",[10,114,115],{},"移植元は「10万円未満の変動は無視する」を既定にしていた。同じ値のまま手元の個人事業者の推移表に当てたら、損益計算書側の指摘が1件も出なかった。規模が違う。既定を1万円に下げ、ポップアップから変えられるようにした。",[10,117,118],{},"月の見分け方も、実物に当ててから書き直した。見出しの文字列は「4月」としか書いていないので、それが何年の4月かは決まらない。セルに埋まっている元帳へのリンクには期間のパラメータが入っているから、そちらを月のキーにした。決算整理の列はフラグで判別でき、合計列はパラメータ自体が無い。",[10,120,121],{},"ツールチップが出ないので調べさせたら、セルから上へマウスのイベントが伝わっていなかった。捕捉の段階で拾う形に変えて解決した。",[10,123,124],{},"右下のパネルは、画面の右下にすでに別のボタンが居座っていたので、その上へ逃がした。それでも幅が340pxあるので、推移表の右端の列には重なる。ヘッダーをクリックすれば畳める。",[10,126,127],{},"紙の上で決めた閾値は、実物に当てるとだいたい動く。",[17,129,131],{"id":130},"フォルダーを選ぶところだけ人の手が要る","フォルダーを選ぶところだけ、人の手が要る",[10,133,134],{},"拡張を書き換えても、ブラウザに読み込み直さないと画面には出ない。「この読み込み、あなたができるはずなのでやってくださいね」と言ってみた。",[10,136,137],{},"言った直後に自分で気づいた。新規の読み込みは「パッケージ化されていない拡張機能を読み込む」からフォルダーを選ぶ操作で、選択ダイアログはOSのものだ。ブラウザの中は触れても、そこには手が届かない。どのフォルダーを指せばいいかだけ出してもらって、自分でクリックした。一度入れてしまえば、以後のリロードは拡張の管理画面のボタンなので任せられる。",[10,139,140],{},"どこまで任せられるかは、こういうときにはっきりする。",[17,142,143],{"id":143},"課税方式を上に出す",[10,145,146],{},"最後に、その事業者が原則課税か簡易課税か、税抜経理か税込経理か、青色か白色かを画面の上に出させた。帳簿を見ながら毎回どこかへ確かめに行っていた情報だ。上に出ているだけで、指摘の読み方が変わる。免税事業者なら、消費税区分の判定そのものを止める。",[10,148,149],{},"簡易課税のときに設定APIがどんな値を返すかは、手元に事業者がいないので実測できていない。値が想定と違ったら事業者の設定ページを読みに行く作りにしてある。",[17,151,152],{"id":152},"残したもの",[10,154,155],{},"進捗のドキュメントを1本書かせて、明日のタスクに積んだ。「拡張のどの機能が会計ソフトAのどの表示に効いているか」をスクリーンショット付きの対応表にする作業で、今日は3枚だけ撮った。科目名、金額、ツールチップの本文にぼかしを当ててから撮っている。リポジトリは非公開でも、実データはそのまま置かない。",[10,157,158],{},"未検証も残っている。簡易課税の事業者で表示が正しく出るか。確認済みメモが失効する4つのケース（実機で試すには仕訳を直さないといけない）。総勘定元帳の指摘は、手元の帳簿では1件も出なかったので、判定を差し替えた表示テストでしか色を見ていない。",[10,160,161],{},"鳴らないことが、帳簿が正しいからなのか、こちらが拾えていないからなのか。それが分かるのは実運用に載せてからだ。",{"title":163,"searchDepth":164,"depth":164,"links":165},"",2,[166,167,168,169,170,171,172,173],{"id":19,"depth":164,"text":19},{"id":42,"depth":164,"text":43},{"id":55,"depth":164,"text":55},{"id":83,"depth":164,"text":83},{"id":111,"depth":164,"text":112},{"id":130,"depth":164,"text":131},{"id":143,"depth":164,"text":143},{"id":152,"depth":164,"text":152},"dev",null,"会計ソフトAの推移表で列見出しが2段に崩れたのを直すところから始まり、他社の帳簿点検拡張を解析して移植計画を立て、前期比較と総勘定元帳の判定まで実装した1日の記録。拡張の読み込みだけは自分の手が要った。","md",{},true,"/accounting-ledger-extension-phase23","misc-dev",false,"2026-09-05T00:00:00.000Z",{"title":5,"description":176},"make-diary","2026-09/2026-09-05/accounting-ledger-extension-phase23",[188,189,190,191,192,193],"Chrome拡張","クラウド会計","帳簿チェック","消費税区分","異常値検知","開発日記","y-m6IwshX53VaI-jkV8rjQ-EyDM9e7r1vrKwx40ZNwQ",[],[197,201,204,208,212],{"title":198,"path":199,"publishedAt":200},"AIレビューのモデル指定が既定値に戻る問題を、手順書に書いて止めた","/codex-review-model-pinning","2026-09-07T00:00:00.000Z",{"title":202,"path":203,"publishedAt":183},"2026年9月5日の開発日記 - ひと月遅れで届く開示を追う仕組みと、記事1本ごとに走っていた10万字の連鎖","/2026-09-05-diary",{"title":205,"path":206,"publishedAt":207},"Android実機の画面をPCに映して通信を覗こうとして詰まった記録","/android-mirroring-and-traffic-inspection","2026-09-04T00:00:00.000Z",{"title":209,"path":210,"publishedAt":211},"2026年9月3日の開発日記 - 止まったセッションを二度拾い直した日","/2026-09-03-diary","2026-09-03T00:00:00.000Z",{"title":213,"path":214,"publishedAt":211},"自作 Chrome 拡張の使い勝手を詰める：未入力件数のバッジと、動画の保存先が違っていた話","/chrome-extension-ux-and-download-path","https://log.eurekapu.com/og/blog/accounting-ledger-extension-phase23.png?v=2026-09-05T00%3A00%3A00.000Z&title=%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E4%BC%9A%E8%A8%88%E3%81%AE%E5%B8%B3%E7%B0%BF%E3%82%92%E7%82%B9%E6%A4%9C%E3%81%99%E3%82%8BChrome%E6%8B%A1%E5%BC%B5%E3%82%92%E8%87%AA%E4%BD%9C%E3%81%97%E3%80%81%E7%B7%8F%E5%8B%98%E5%AE%9A%E5%85%83%E5%B8%B3%E3%81%BE%E3%81%A7%E5%BA%83%E3%81%92%E3%81%9F&author=Kei%20Komatsu&sig=e52414f1316eb4c4",1788821552347]