月次推移表エクスポート実装と消費税集計エクスポート計画
年次推移表のコードにパラメータを2つ足すだけで月次推移表が動き出し、Codexレビューで2つの穴を塞ぎ、Google Sheets APIのレート制限と格闘して書式設定まで仕上げた。午後は消費税集計画面のDOMをChrome DevToolsで覗き込み、colSpan展開という次の課題を洗い出した一日の記録。
月次推移表エクスポート機能
年次推移表の設計が活きた
既存の年次推移表コードは startTransitionExport 関数に処理が集約されていた。period と year のパラメータを追加するだけで月次推移表のエクスポートが動き始めた。何百行も書き換える覚悟をしていたが、蓋を開けてみれば数十行の変更で収まった。
年次推移表と月次推移表は独立したスプレッドシートで管理する構成にした。1つのシートに混在させると、年度をまたいだ運用でシートが膨れ上がるため、最初から分けておく判断。
Codexレビューで2つの穴を塞ぐ
計画段階でCodexレビューを2回実施した。
1回目の指摘 - allYears汚染防止: 月次エクスポート実行時に allYears 配列を直接操作すると、同一セッション内で年次推移表を続けて実行したときに壊れるパターンがあった。配列のコピーを作って操作するよう修正。
2回目の指摘 - 複数年度サポート: 会計ソフトAから取得するデータが複数年度にまたがるケースを見落としていた。年度ごとにシートを分けて書き込むロジックを追加。
進捗バーの分母を修正
進捗バーの分母が「年度タスク数」になっていたが、実際のユーザー体感と合わなかった。チェックボックス単位のサブタスク数に切り替えたところ、進捗が滑らかに動くようになった。年度が3つあっても、各年度内の処理ステップごとにバーが進む。
ラベル統一 - 直感的な日本語語順へ
メニュー表記を見直した。
| Before | After |
|---|---|
| 推移表_月次 | 月次推移表 |
| 推移表_年次 | 年次推移表 |
日本語としては「月次推移表」のほうが口に出したときに自然に響く。内部変数名もこれに合わせてリネーム。
PLヘッダー行の挿入
スプレッドシートに書き出すと、BSとPLの境界がわかりにくかった。BSには「合計」列がなくPLにだけ存在するという構造の差異があり、単純に連結すると読み手が混乱する。BSとPLの間に空行を1行挟み、PLヘッダー行を挿入して視覚的に区切った。
ヘッダーに年度プレフィックスを追加
月次推移表のヘッダーを [2022-1月] の形式にした。角括弧で囲むことでGoogle Sheetsが日付として自動変換するのを防ぎ、文字列として認識させる。年度が異なるシートを並べて見比べるとき、どの年度のデータか一目でわかる。
Google Sheets APIレート制限との格闘
複数年度を連続でエクスポートすると、Google Sheets APIのレート制限に引っかかってリクエストが弾かれた。以下の対策を入れた。
- 年度間に2秒のクールダウン:
await sleep(2000)を年度切り替えごとに挿入 - リトライ強化: データ書き込みだけでなく書式設定APIにもリトライロジックを追加
- 指数バックオフ: 429エラーが返ったら待ち時間を倍々に延ばす
これでレート制限エラーが消え、5年度分の月次推移表を一括エクスポートしても途中で止まらなくなった。
書式設定の統一
カンマ区切りの数値フォーマットと列幅調整(maxWidth: 400)を月次推移表にも適用した。この書式設定は連携明細のスプレッドシートでも同じものを使っており、エクスポート先がどのシートでも見た目が揃う。
設定画面とリンクの整備
- 設定画面に月次推移表のスプレッドシートURL入力欄を追加
- 進捗テーブルの各年度行に、対応するシートへの直接リンク(GID付きURL)を埋め込んだ。エクスポート完了後、ワンクリックで該当シートに飛べる
消費税集計エクスポート計画
Chrome DevToolsでDOM構造を調査
会計ソフトAの消費税集計画面をChrome DevToolsで開き、テーブルのDOM構造を読み解いた。2つのタブで構成されている。
- 勘定科目別税区分集計表: 勘定科目ごとに税区分・税率・金額を表示
- 税区分集計表: 税区分ごとの合計金額を表示
colSpan展開という課題
DOMを覗くと、税率列がない行で colspan="3" の空セルが使われていた。単純にセルを順番に読み取ると列がズレる。スクレイピング時にcolSpanを検出して空セルを展開するロジックが必要になる。
Codexレビュー3回で計画を固める
消費税集計の計画にはCodexレビューを3回かけた。
- 1回目: colSpan問題の存在を指摘され、展開ロジックの必要性を計画に追記
- 2回目: ヘッダー行にもcolSpanがあるケースを指摘され、ヘッダー解析も対応範囲に含めた
- 3回目: 細かい修正を反映して計画を確定
実装は翌日以降に持ち越し。
Amazonビジネス重複バグの修正
症状
cleanServiceName 関数がカッコ部分を一括削除していた。「Amazonビジネス(API)」と「Amazonビジネス」が同一サービスとして扱われ、データが重複して集計されていた。
原因と修正
カッコ除去のロジックが「すべてのカッコとその中身を消す」という乱暴な実装だった。修正後は既知のノイズパターン(例: (旧), (新) など)のみを除去し、サービス名の一部であるカッコはそのまま残すように変更。
併せて、resolveServiceSpreadsheetId にサービス名のフォールバック検索を追加した。完全一致で見つからない場合に、正規化後の名前で再検索する仕組み。
振り返り
年次推移表の設計が拡張に耐える構造だったおかげで、月次推移表の実装が小さな差分で済んだ。一方で、Codexレビューを通すたびに「セッション汚染」「複数年度」「colSpan展開」と見落としが炙り出された。自分一人で計画を立てると視野の端が欠けるということを、レビュー結果が具体的に示してくれた一日だった。