返済予定表のモジュール化と会計ソフト仕訳生成パイプライン
日本政策金融公庫の融資返済データを手入力する作業を消すために、丸一日かけてGoogle Sheets上に返済予定表テンプレートを組み上げ、そこから会計ソフトの仕訳データを自動生成するパイプラインをつないだ。
既存スプレッドシートの構造分析
まず手元にあった返済予定表スプレッドシートを gws CLI で読み取り、列構造を把握した。元金均等返済で、月次の元金・利息・残高が72行並んでいる。この構造をそのまま再現するのではなく、入力変数を分離してテンプレート化する方針を決めた。
TPL_返済予定表シートの構築
batchUpdateで「!」問題を回避
gws CLIでシートにデータを書き込む際、シート名に「TPL_返済予定表」のような日本語名を使うと、! 区切りのA1記法でパースエラーが出る。updateCells + sheetId 指定の batchUpdate に切り替えたら、シート名を経由せずにセルを特定できるようになり、問題が消えた。
入力変数の設計
シート上部に青文字で入力変数を配置した。
- 融資実行日、融資金額、年利率、返済回数、初回返済日
- 口座名(普通預金の補助科目)--- 後から追加した変数
これらを変えるだけで72行の月次データが再計算される構造にした。
日割り利息計算 --- 365日固定割りへの修正
最初は「月利 = 年利 / 12」で組んでいた。しかし日本の融資実務では利息を日割りで計算するのが標準だ。計算式を以下に修正した。
利息 = 前月残高 × 年利率 × 経過日数 / 365
経過日数は前回返済日から今回返済日までの実日数を DAYS 関数で取得する。365日固定割りなので閏年でも分母は変わらない。この修正で、手元の公庫返済予定表と1円単位で一致するようになった。
最終回の端数処理
元金均等返済で「融資金額 / 返済回数」が割り切れない場合、毎月の元金に1円未満の端数が出る。積み残した端数を最終回で一括返済する処理を入れた。具体的には、最終回の元金を「残高全額」に切り替える IF 式を組んでいる。
合計行を上部に移動
当初は合計行をシート最下部に置いていたが、返済期間が変わるたびに合計行の位置がずれる。合計行を入力変数の直下(データ行の上)に移動した。SUMIFS で返済回数以内の行だけ集計するので、72行の枠が余っても合計値は正しく出る。
会計ソフト仕訳生成パイプライン
アーキテクチャ: gws → Python → gws
返済予定表のデータを読み取り、会計ソフトのインポート形式に変換して、別シートに書き戻す。この一連の流れを repayment_to_mf_journal.sh というシェルスクリプトにまとめた。
gws sheets get (返済予定表読み取り)
↓ JSON
Python変換スクリプト (仕訳データ生成)
↓ JSON
gws sheets batchUpdate (仕訳シート書き込み)
subprocess経由のgws認証問題
最初はPythonスクリプト内から subprocess.run(["gws", "sheets", "get", ...]) でデータを取得しようとした。ところがPythonの子プロセスからgwsを呼ぶと認証トークンの受け渡しがうまくいかず、401 Unauthorized が返ってくる。
gws単体で実行すれば認証は通る。原因を追いかける時間が惜しかったので、方針を変えた。
ファイルベースI/Fに切り替え:
- シェルスクリプトで
gws sheets get→ JSONファイルに保存 - Pythonスクリプトはファイルから読み取り → 変換結果をJSONファイルに出力
- シェルスクリプトで出力JSONを
gws sheets batchUpdateに渡す
プロセス間のデータ受け渡しをファイルに落としたことで、認証の問題が構造的に消えた。副産物として、中間ファイルが残るので、変換のどの段階でデータが壊れたか cat 一発で切り分けられるようになった。
bashクォーティングとの格闘
シェルスクリプト内でJSONを組み立てる箇所で、シングルクォートとダブルクォートの入れ子が壊れる場面が何度かあった。特に jq に渡す式の中で変数展開する箇所が厄介で、ヒアドキュメントに逃がすことで解決した。
口座名の入力変数追加
仕訳の借方・貸方に「普通預金(○○銀行)」のような補助科目名が必要になる。返済予定表シートの入力変数に口座名フィールドを追加し、Python変換スクリプトがこの値を仕訳データに埋め込むようにした。融資先が複数ある場合でも、口座名を切り替えるだけで対応できる。
cf-lifecycle-journalスキルの作成
ここまでの手順を cf-lifecycle-journal というClaude Codeスキルとしてドキュメント化した。次回以降、新しい融資の返済予定表を追加するときにスキルを呼び出せば、テンプレートのコピーから仕訳生成まで一気に走る。
Google Docsにも同内容を保存し、Google Tasksに明日の作業として登録した。
振り返り
一日の作業で手を動かした時間の半分以上は、gws認証問題とbashクォーティングの試行錯誤に消えた。技術的に難しかったわけではない。「子プロセスから認証が通らない」という事実に気づくまでに時間がかかり、気づいた後はファイルI/Fに切り替えて10分で動いた。
日割り利息の修正も、公庫の返済予定表と突き合わせて初めて1円のずれに気づいた。「月利 = 年利 / 12」は概算としては正しいが、実務の計算とは合わない。融資実務の利息計算は日割りが基本、という知識が手を動かして初めて身体に入った。
明日のTo Do
- 年次推移表から5年分のCF精算表を一括生成する
- 営業CFの調整項目について、書籍からの補足情報を追加する