[{"data":1,"prerenderedAt":425},["ShallowReactive",2],{"content-/cfws-pipeline-expansion":3,"all-pages-for-dir":423,"og-image-/cfws-pipeline-expansion":424},{"id":4,"title":5,"body":6,"category":404,"description":405,"extension":406,"meta":407,"navigation":141,"path":408,"project_name":409,"published":410,"publishedAt":411,"seo":412,"stem":413,"tags":414,"todo":420,"updatedAt":421,"__hash__":422},"pages/2026-04/2026-04-03/cfws-pipeline-expansion.md","CF精算表パイプラインを全12論点に拡張し、Excelファースト開発体制を整えた",{"type":7,"value":8,"toc":386},"minimark",[9,14,18,22,25,28,31,34,38,41,52,63,67,78,239,242,246,256,260,263,266,276,290,294,297,300,304,307,310,313,320,327,330,333,340,344,347,370,373,376,379,382],[10,11,13],"h1",{"id":12},"cf精算表パイプラインを全12論点に拡張した","CF精算表パイプラインを全12論点に拡張した",[15,16,17],"p",{},"朝、Googleタスクを開くと前日の積み残しが4件並んでいた。1つずつ潰しながらコードを読み返すうちに、借入金だけに対応していたCF精算表生成パイプラインの狭さが目に留まった。貸付金も資本政策もまだ手作業でExcelを作っている。今日はこれを全論点に広げると決めて、キーボードに手を置いた。",[19,20,21],"h2",{"id":21},"前日の積み残しを片づける",[15,23,24],{},"Googleタスクに残っていた4件は、前日に設計だけして実装が追いつかなかった項目。朝イチで集中して片づけたことで、午前中の残り時間をパイプライン拡張に充てられた。",[19,26,27],{"id":27},"進捗マトリックスの整理",[15,29,30],{},"論点が増えると「どこまで終わったか」が頭の中だけでは追えなくなる。縦軸に全12論点（3級6つ + 2級6つ）、横軸にステップ（a: 取引モジュール / b: Excel生成 / c: スプレッドシート変換）を並べたマトリックスを作った。",[15,32,33],{},"これで「貸付金のステップbが未着手」「資本政策のステップcが確認待ち」といった状態が一目で分かるようになった。",[19,35,37],{"id":36},"excel命名規則の策定","Excel命名規則の策定",[15,39,40],{},"ファイルが増えるほど命名のブレが痛くなる。以下の形式に統一した。",[42,43,48],"pre",{"className":44,"code":46,"language":47},[45],"language-text","CF_{論点}_{ステップ番号}_{ステップ名}_{日時}.xlsx\n","text",[49,50,46],"code",{"__ignoreMap":51},"",[15,53,54,55,58,59,62],{},"ステップ番号は級ごとに帯域を分けた。3級は ",[49,56,57],{},"30x","、2級は ",[49,60,61],{},"20x","。これでファイル名をソートするだけで級もステップも区別できる。",[19,64,66],{"id":65},"貸付金のcfws生成パイプライン構築","貸付金のCFWS生成パイプライン構築",[15,68,69,70,73,74,77],{},"既存の ",[49,71,72],{},"gen_cfws_multi_year.py"," は借入金専用だった。ここに貸付金を追加するために、まず ",[49,75,76],{},"DUAL_ACCOUNTS"," を辞書形式にリファクタリングした。",[42,79,83],{"className":80,"code":81,"language":82,"meta":51,"style":51},"language-python shiki shiki-themes vitesse-light vitesse-light","# Before: リストでハードコード\nDUAL_ACCOUNTS = [\"短期借入金\", \"長期借入金\", ...]\n\n# After: 辞書で論点ごとに管理\nDUAL_ACCOUNTS = {\n    \"borrowing\": [\"短期借入金\", \"長期借入金\", ...],\n    \"lending\":   [\"短期貸付金\", \"長期貸付金\", ...],\n}\n","python",[49,84,85,94,136,143,149,159,196,233],{"__ignoreMap":51},[86,87,90],"span",{"class":88,"line":89},"line",1,[86,91,93],{"class":92},"sxvE3","# Before: リストでハードコード\n",[86,95,97,100,104,107,111,115,117,120,123,126,128,130,133],{"class":88,"line":96},2,[86,98,76],{"class":99},"snbK4",[86,101,103],{"class":102},"shFtX"," =",[86,105,106],{"class":102}," [",[86,108,110],{"class":109},"sMJiu","\"",[86,112,114],{"class":113},"sdGka","短期借入金",[86,116,110],{"class":109},[86,118,119],{"class":102},",",[86,121,122],{"class":109}," \"",[86,124,125],{"class":113},"長期借入金",[86,127,110],{"class":109},[86,129,119],{"class":102},[86,131,132],{"class":99}," ...",[86,134,135],{"class":102},"]\n",[86,137,139],{"class":88,"line":138},3,[86,140,142],{"emptyLinePlaceholder":141},true,"\n",[86,144,146],{"class":88,"line":145},4,[86,147,148],{"class":92},"# After: 辞書で論点ごとに管理\n",[86,150,152,154,156],{"class":88,"line":151},5,[86,153,76],{"class":99},[86,155,103],{"class":102},[86,157,158],{"class":102}," {\n",[86,160,162,165,168,170,173,175,177,179,181,183,185,187,189,191,193],{"class":88,"line":161},6,[86,163,164],{"class":109},"    \"",[86,166,167],{"class":113},"borrowing",[86,169,110],{"class":109},[86,171,172],{"class":102},":",[86,174,106],{"class":102},[86,176,110],{"class":109},[86,178,114],{"class":113},[86,180,110],{"class":109},[86,182,119],{"class":102},[86,184,122],{"class":109},[86,186,125],{"class":113},[86,188,110],{"class":109},[86,190,119],{"class":102},[86,192,132],{"class":99},[86,194,195],{"class":102},"],\n",[86,197,199,201,204,206,208,211,213,216,218,220,222,225,227,229,231],{"class":88,"line":198},7,[86,200,164],{"class":109},[86,202,203],{"class":113},"lending",[86,205,110],{"class":109},[86,207,172],{"class":102},[86,209,210],{"class":102},"   [",[86,212,110],{"class":109},[86,214,215],{"class":113},"短期貸付金",[86,217,110],{"class":109},[86,219,119],{"class":102},[86,221,122],{"class":109},[86,223,224],{"class":113},"長期貸付金",[86,226,110],{"class":109},[86,228,119],{"class":102},[86,230,132],{"class":99},[86,232,195],{"class":102},[86,234,236],{"class":88,"line":235},8,[86,237,238],{"class":102},"}\n",[15,240,241],{},"辞書にしたことで、新しい論点を追加するときはキーを足すだけで済む構造になった。",[19,243,245],{"id":244},"資本政策株主資本excel生成","資本政策（株主資本）Excel生成",[15,247,248,251,252,255],{},[49,249,250],{},"gen_equity_lifecycle_xlsx.py"," に ",[49,253,254],{},"--level"," 引数を追加した。3級は設立のみ（300万円）、2級は増資パターンを含む。同じスクリプトで級別のExcelを分けて生成できるようになった。",[257,258,259],"h3",{"id":259},"出資額の計算式化",[15,261,262],{},"最初は出資額300万円をハードコードしていたが、途中で「1株単価 x 発行株数 = 出資額」の計算式に書き直した。増資パターンに対応するには、株数と単価を変数にしておかないと2級側が破綻する。",[19,264,265],{"id":265},"全取引モジュールに設立出資を共通追加",[15,267,268,269,251,272,275],{},"どの論点のExcelを開いても、取引No.1には会社設立の出資仕訳（300万円）が入っている必要がある。",[49,270,271],{},"mf_journal.py",[49,273,274],{},"FOUNDING_JOURNALS"," 定数を追加し、全取引モジュールの先頭に差し込む形にした。",[15,277,278,279,282,283,285,286,289],{},"同様に、全Excel出力に ",[49,280,281],{},"TPL_資本政策"," シートを追加した。",[49,284,250],{}," の ",[49,287,288],{},"write_schedule_sheet()"," を呼び出す形で、各生成スクリプトから共通利用している。",[19,291,293],{"id":292},"金額の見直しと全excel再生成","金額の見直しと全Excel再生成",[15,295,296],{},"借入金と貸付金の金額を500万円から200万円に変更した。教材としての分かりやすさを優先した判断だが、変更の影響は全Excelに波及する。パイプラインが整備されていたおかげで、コマンド一発で再生成できた。手作業でExcelを開いて直していたら半日は潰れていたと思う。",[19,298,299],{"id":299},"試行錯誤の記録",[257,301,303],{"id":302},"sumifs数式化の断念","SUMIFS数式化の断念",[15,305,306],{},"年次推移表の各セルをSUMIFS数式で動的に計算させようとした。月次仕訳データから年度ごとに集計すれば、仕訳を追加するだけで推移表が自動更新される。",[15,308,309],{},"しかし、繰越利益剰余金の扱いで手が止まった。当期の繰越利益剰余金は「前期末残高 + 当期純利益」だが、当期純利益自体が収益・費用の差額で、さらに配当控除も絡む。SUMIFSだけでは表現しきれず、数式が膨れ上がって可読性が消えた。ハードコード版にリバートして先に進んだ。",[257,311,312],{"id":312},"スプレッドシートエクスポートの数式問題",[15,314,315,316,319],{},"Excelで組んだ数式をGoogle Sheetsにエクスポートすると、数式が値に変換されてしまう場面があった。Pythonの ",[49,317,318],{},"openpyxl"," で書いた数式がそのまま残る保証がない。",[15,321,322,323,326],{},"対応策として、スプレッドシート側には ",[49,324,325],{},"gws"," CLI経由でPythonスクリプトから直接数式を書き込む方式に切り替えた。Excelをマスターにして、スプレッドシートは確認用として後追い変換する「Excelファースト」方針が固まった瞬間だった。",[19,328,329],{"id":329},"名称統一と旧ファイル退避",[15,331,332],{},"これまで「計算モジュール」と呼んでいたものを「取引モジュール」に統一した。実態は仕訳データ（取引の記録）を生成するモジュールであり、「計算」では意味が伝わりにくかった。",[15,334,335,336,339],{},"合わせて、命名規則変更前の旧ファイルは ",[49,337,338],{},"old/"," ディレクトリに退避するルールを追加した。削除ではなく退避にしたのは、差分確認で戻りたい場面があるため。",[19,341,343],{"id":342},"excelファースト方針のまとめ","Excelファースト方針のまとめ",[15,345,346],{},"今日の作業を通じて、開発フローが明確になった。",[348,349,350,358,364],"ol",{},[351,352,353,357],"li",{},[354,355,356],"strong",{},"取引モジュール","（Python）で仕訳データを定義",[351,359,360,363],{},[354,361,362],{},"Excel生成スクリプト","（openpyxl）でマスターExcelを出力",[351,365,366,369],{},[354,367,368],{},"スプレッドシート変換","（gws CLI）で確認用シートを後追い生成",[15,371,372],{},"Excelが唯一の正（Single Source of Truth）。スプレッドシートは閲覧・共有用。この順序を守る限り、数式消失の問題は起きない。",[19,374,375],{"id":375},"振り返り",[15,377,378],{},"朝4件だった積み残しが夕方にはゼロになり、代わりに全12論点のパイプラインが立ち上がった。SUMIFS数式化を試みて挫折し、ハードコードに戻す判断を30分で下せたのは、完成を優先する感覚が身についてきた証拠だと思う。",[15,380,381],{},"明日は残りの論点でステップb（Excel生成）を埋めていく。マトリックスの空欄を1つずつ塗り潰していけば、全体の完成時期が見通せるようになる。",[383,384,385],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":51,"searchDepth":96,"depth":96,"links":387},[388,389,390,391,392,395,396,397,401,402,403],{"id":21,"depth":96,"text":21},{"id":27,"depth":96,"text":27},{"id":36,"depth":96,"text":37},{"id":65,"depth":96,"text":66},{"id":244,"depth":96,"text":245,"children":393},[394],{"id":259,"depth":138,"text":259},{"id":265,"depth":96,"text":265},{"id":292,"depth":96,"text":293},{"id":299,"depth":96,"text":299,"children":398},[399,400],{"id":302,"depth":138,"text":303},{"id":312,"depth":138,"text":312},{"id":329,"depth":96,"text":329},{"id":342,"depth":96,"text":343},{"id":375,"depth":96,"text":375},"dev","CF精算表の生成パイプラインを借入金だけでなく貸付金・資本政策など全12論点に拡張し、Excel命名規則の策定、進捗マトリックスの整理、取引モジュールの名称統一までを一日で完了した記録","md",{},"/cfws-pipeline-expansion","eurekapu-nuxt4",false,"2026-04-03T00:00:00.000Z",{"title":5,"description":405},"2026-04/2026-04-03/cfws-pipeline-expansion",[415,416,417,318,418,419],"CF精算表","Excel自動化","Python","パイプライン設計","簿記","memo",null,"flKG9qmAi2I2rpO30_3Lh_rD7V40BRwdVAkP12lpDUU",[],"https://log.eurekapu.com/favicon.svg",1775338204228]