[{"data":1,"prerenderedAt":301},["ShallowReactive",2],{"content-/mf-journal-api-and-ledger-account-feature":3,"all-pages-for-dir":299,"og-image-/mf-journal-api-and-ledger-account-feature":300},{"id":4,"title":5,"body":6,"category":278,"description":279,"extension":280,"meta":281,"navigation":282,"ogImage":283,"path":284,"project_name":285,"published":286,"publishedAt":287,"seo":288,"stem":289,"tags":290,"todo":297,"unpublished":286,"updatedAt":283,"__hash__":298},"pages/2026-03/2026-03-30/mf-journal-api-and-ledger-account-feature.md","会計ソフト仕訳APIフルサイクルテストと勘定科目エクスポート/インポート機能の実装",{"type":7,"value":8,"toc":252},"minimark",[9,14,18,21,26,31,34,42,46,49,53,56,59,61,65,72,75,78,80,83,89,93,96,106,109,112,115,117,121,125,136,139,166,169,176,179,182,193,195,198,205,224,227,229,232,235,237,240,243,246],[10,11,13],"h1",{"id":12},"会計ソフト仕訳apiフルサイクルテストと勘定科目エクスポートインポート機能","会計ソフト仕訳APIフルサイクルテストと勘定科目エクスポート/インポート機能",[15,16,17],"p",{},"仕訳登録APIでAmazonビジネス明細45件を一括登録し、削除→対象外解除→未入力復帰までのライフサイクルを通した。更新APIと複合仕訳の作成方法も解明。後半では、Chrome拡張に勘定科目のエクスポート/インポート機能を載せて全381テストを通した。",[19,20],"hr",{},[22,23,25],"h2",{"id":24},"仕訳登録apijournalizeのフルサイクルテスト","仕訳登録API（journalize）のフルサイクルテスト",[27,28,30],"h3",{"id":29},"登録-post-journalizing_suggestions","登録: POST journalizing_suggestions",[15,32,33],{},"明細データから仕訳を起こすAPIエンドポイント。DevToolsでUIの「登録」ボタンが叩いているリクエストをキャプチャして形式を特定した。",[15,35,36,37,41],{},"Amazonビジネス明細45件を200ms間隔で連続POST。レート制限に引っかからず全件成功した。bulk_register系のAPIも探したが見つからず、1件ずつ ",[38,39,40],"code",{},"journalizing_suggestions"," を叩く方式に落ち着いた。",[27,43,45],{"id":44},"削除-delete-journal_entryjournalsid","削除: DELETE journal_entry/journals/{id}",[15,47,48],{},"登録した仕訳を削除すると、元の明細が「仕訳済み」から「対象外」ステータスに変わる。「未入力」には戻らない。",[27,50,52],{"id":51},"対象外解除-post-ignore_cancel","対象外解除: POST ignore_cancel",[15,54,55],{},"「対象外」ステータスの明細を「未入力」に戻すAPI。削除→ignore_cancelの2ステップで、明細を登録前の状態に完全復帰できることを確認した。",[15,57,58],{},"これで登録→削除→対象外解除→未入力復帰のフルサイクルが回る。一括登録のテストを何度でもやり直せる状態になった。",[19,60],{},[22,62,64],{"id":63},"仕訳更新apipatch-update_newの発見","仕訳更新API（PATCH update_new）の発見",[15,66,67,68,71],{},"登録APIは見つかったが、更新APIはドキュメントに載っていなかった。UIから勘定科目を変更する操作をDevToolsで追いかけて、PATCH ",[38,69,70],{},"update_new"," エンドポイントを捕捉した。",[27,73,74],{"id":74},"単一仕訳の更新テスト",[15,76,77],{},"借方を「仮払金」→「消耗品費」に変更するリクエストを再現。PATCHのボディにはbranches配列（借方・貸方の行）を含め、変更対象の行だけでなく全行を送る必要がある。一部の行だけ送ると残りが消えるので注意。",[19,79],{},[22,81,82],{"id":82},"複合仕訳の作成",[15,84,85,86,88],{},"PATCH ",[38,87,70],{}," のbranches配列を2行以上にすると、複合仕訳になる。",[27,90,92],{"id":91},"テストケース-仮払金の消込","テストケース: 仮払金の消込",[15,94,95],{},"仮払金で一旦計上した経費を、消耗品費に振り替える複合仕訳を作成した。",[97,98,99,103],"ul",{},[100,101,102],"li",{},"借方: 消耗品費",[100,104,105],{},"貸方: 仮払金 / AmazonBusiness",[15,107,108],{},"branches配列に借方行と貸方行を並べてPATCHすると、複合仕訳として登録される。",[27,110,111],{"id":111},"バランスルール",[15,113,114],{},"貸方を1行目に合計額として集約した形式でもAPIは受け入れた。つまり借方を複数行に分けて貸方を1行にまとめる、またはその逆も可能。バリデーションは借方合計 = 貸方合計のみで、行数の制約はなかった。",[19,116],{},[22,118,120],{"id":119},"chrome拡張-勘定科目エクスポートインポート機能","Chrome拡張: 勘定科目エクスポート/インポート機能",[27,122,124],{"id":123},"api調査","API調査",[15,126,127,128,131,132,135],{},"DevToolsで管理画面のCSVエクスポート/インポート操作を追跡し、",[38,129,130],{},"GET /items_csv"," と ",[38,133,134],{},"POST /items_csv"," の2つのエンドポイントを特定した。GETでCSVダウンロード、POSTでCSVアップロード。",[27,137,138],{"id":138},"実装した4ファイル",[97,140,141,148,154,160],{},[100,142,143,147],{},[144,145,146],"strong",{},"bridge.js"," — バックグラウンドスクリプトとcontent script間のメッセージ中継",[100,149,150,153],{},[144,151,152],{},"export.js"," — CSVダウンロード処理",[100,155,156,159],{},[144,157,158],{},"import.js"," — CSVアップロード処理",[100,161,162,165],{},[144,163,164],{},"content.js"," — UIへのボタン追加とイベントハンドリング",[27,167,168],{"id":168},"diff正規化の対処",[15,170,171,172,175],{},"エクスポートしたCSVをGoogle Sheetsで開いて再保存すると、空フィールドの表現が変わる。会計ソフトのCSVは ",[38,173,174],{},"\"\""," (ダブルクォート2つ)、Google Sheetsは空文字。そのままdiffを取ると全行が差分になる。",[15,177,178],{},"trim + 空文字正規化を挟むことで、実質的な変更がない行を差分から除外した。",[27,180,181],{"id":181},"補助科目の削除",[15,183,184,185,188,189,192],{},"勘定科目のインポートでは追加・更新はCSV経由で対応できるが、削除はCSVではできない。DevToolsで補助科目の削除操作を追跡して ",[38,186,187],{},"DELETE /sub_items/{id}"," を見つけた。IDは ",[38,190,191],{},"sub_item-{数値ID}"," 形式。",[19,194],{},[22,196,197],{"id":197},"共通コンポーネント化",[15,199,200,201,204],{},"事業者設定タブと勘定科目タブで、エクスポート/インポートのUIが重複していた。HTML生成ロジックを ",[38,202,203],{},"renderEntityExportImportList"," 関数に統合した。",[97,206,207,214],{},[100,208,209,210,213],{},"2カラムグリッドレイアウト（",[38,211,212],{},"grid-template-columns: repeat(2, 1fr)","）",[100,215,216,217,220,221,213],{},"ステータス表示をタイトル行の右端に配置（",[38,218,219],{},"flex"," + ",[38,222,223],{},"margin-left: auto",[15,225,226],{},"タブごとにエンティティ定義の配列を渡すだけでUIが生成される形になった。",[19,228],{},[22,230,231],{"id":231},"テスト結果",[15,233,234],{},"全381テスト合格。勘定科目エクスポート/インポートのテストを追加しても既存テストは壊れなかった。純粋関数にロジックを閉じ込めてあるので、API呼び出し部分をモックするだけでテストが書ける。",[19,236],{},[22,238,239],{"id":239},"振り返り",[15,241,242],{},"仕訳APIの調査は、公式ドキュメントに載っていないエンドポイントをDevToolsで一つずつ追いかける作業だった。bulk_registerを探して見つからず、journalizeの1件ずつ方式に切り替えたとき、45件を200ms間隔で流してレート制限に引っかからなかったのは助かった。",[15,244,245],{},"複合仕訳のbranches配列を組み立てるとき、最初は借方・貸方の行数制約があると思い込んでいた。実際にバランスさえ合えばAPIは受け入れるとわかり、振替仕訳のパターンが一気に広がった。",[15,247,248,249,251],{},"勘定科目のエクスポート/インポートは、diff正規化で半日持っていかれた。",[38,250,174],{}," と空文字の差異に気づくまで「なぜ全行が差分になるのか」とログを睨み続けた。原因がわかった瞬間、trim一行で解決したのが拍子抜けだった。",{"title":253,"searchDepth":254,"depth":254,"links":255},"",2,[256,262,265,269,275,276,277],{"id":24,"depth":254,"text":25,"children":257},[258,260,261],{"id":29,"depth":259,"text":30},3,{"id":44,"depth":259,"text":45},{"id":51,"depth":259,"text":52},{"id":63,"depth":254,"text":64,"children":263},[264],{"id":74,"depth":259,"text":74},{"id":82,"depth":254,"text":82,"children":266},[267,268],{"id":91,"depth":259,"text":92},{"id":111,"depth":259,"text":111},{"id":119,"depth":254,"text":120,"children":270},[271,272,273,274],{"id":123,"depth":259,"text":124},{"id":138,"depth":259,"text":138},{"id":168,"depth":259,"text":168},{"id":181,"depth":259,"text":181},{"id":197,"depth":254,"text":197},{"id":231,"depth":254,"text":231},{"id":239,"depth":254,"text":239},"dev","仕訳登録APIのフルサイクル（登録→削除→対象外解除→未入力復帰）を検証し、更新API・複合仕訳の作成方法を解明。Chrome拡張に勘定科目エクスポート/インポート機能を追加した記録","md",{},true,null,"/mf-journal-api-and-ledger-account-feature","tax-assistant",false,"2026-03-30T00:00:00.000Z",{"title":5,"description":279},"2026-03/2026-03-30/mf-journal-api-and-ledger-account-feature",[291,292,293,294,295,296],"クラウド会計","Chrome拡張機能","REST API","仕訳","勘定科目","会計","memo","1IzJQWGMiZyf348sEvo-GwGH-PAsUVk86JwaB-4IWjs",[],"https://log.eurekapu.com/og/blog/mf-journal-api-and-ledger-account-feature.png?v=2026-03-30T00%3A00%3A00.000Z&title=%E4%BC%9A%E8%A8%88%E3%82%BD%E3%83%95%E3%83%88%E4%BB%95%E8%A8%B3API%E3%83%95%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E5%8B%98%E5%AE%9A%E7%A7%91%E7%9B%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%2F%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E5%AE%9F%E8%A3%85&author=Kei%20Komatsu&sig=e0ed7a99bae6a8ab",1782528822306]