売上データ分析とスプレッドシート連携
朝、クライアントの売上データを月別に集計してほしいという依頼が来た。DBを叩いて数字を出し、スプレッドシートに流し込む -- そこまでなら1時間で終わるはずだった。ところが単価で割った個数が割り切れないデータが混じっていて、そこから原因調査、データ修正、訂正仕訳の作成、スプレッドシートへの再書き込みと、一日かけて何度もデータを行き来することになった。
DB照会と月別集計
特定商品の売上データをDBから引き出し、月別に集計した。対象期間の売上レコードを抽出し、月ごとの合計金額と取引件数を出す。
クエリ自体は単純だが、集計結果を眺めていて違和感に気づいた。売上金額を商品単価で割って個数を逆算したとき、割り切れない行がいくつかある。小数点以下が出るのは、元データのどこかがおかしい。
端数発生の原因調査
個数が整数にならないデータを1行ずつ追いかけた。原因は複数パターンあった。
- 単価変更後のデータに旧単価が残っている行
- 複数商品の合算が1行にまとめられている行
- 値引き・割引が売上金額から直接差し引かれている行
元帳と突き合わせて、どの行が正しくてどの行を修正すべきかを切り分けた。修正対象のデータを洗い出し、正しい金額・個数に書き換えた。
訂正仕訳の作成
データ修正に伴い、会計上の訂正仕訳が必要になった。特定商品の売上を未払金に振り替える訂正仕訳を作成した。
仕訳のパターンは次の通り。
| 借方 | 貸方 | 内容 |
|---|---|---|
| 売上高 | 未払金 | 過大計上分の取消 |
| 未収入金 | 売上高 | 正しい金額での再計上 |
訂正仕訳は「元の仕訳を打ち消す逆仕訳 + 正しい仕訳」のペアで作る。片方だけだと残高が合わなくなる。この原則を守りながら、対象行ごとに仕訳データを組み立てた。
Google Spreadsheetへの書き込み
作成した訂正仕訳データをGoogle Spreadsheetに書き込んだ。gog CLIを使ってコマンドラインからシートを操作した。
# セル範囲を指定してデータを書き込む
gog sheet write --spreadsheet-id "..." --range "Sheet1!A2:F10" --values "..."
gog CLIはGoogle Workspace APIのラッパーで、スプレッドシートの読み書きをターミナルから実行できる。GUIでセルをポチポチ入力するよりも、データが構造化されている場合はCLI経由の方が速い。
ただし、書き込んだ後にスプレッドシートを開いて目視確認するステップは省略できない。セル範囲のズレや数値フォーマットの違いで、意図しない場所にデータが入ることがある。
商品有高帳シートへの入力
訂正仕訳とは別に、商品有高帳のシートにも日付・金額・個数を入力した。商品有高帳は在庫の受払記録で、売上データの修正と連動して更新が必要になる。
入力項目は日付、受入金額、払出金額、数量。DB側で修正したデータをそのままシートに転記した。
会計ソフトインポート用シートへの仕訳書き込み
会計ソフトへのインポート用に、別シートへ仕訳データを書き込んだ。未収入金と売上の仕訳を、会計ソフトが受け付けるフォーマットに揃えて出力した。
ここで不整合が見つかった。商品有高帳の数量と仕訳の金額が合わない行がある。原因を追うと、端数処理の修正を商品有高帳側に反映し忘れていた。修正してgog CLIで再書き込み。
この「書き込む→確認→不整合発見→修正→再書き込み」のサイクルを3回ほど繰り返した。1回で通らないのは、複数のシートに同じデータの別表現が散らばっているからだ。商品有高帳は数量ベース、仕訳は金額ベース、インポート用シートは会計ソフトのフォーマット -- 同じ取引が3つの形で存在していて、どれか1つを直すと他の2つも追従させなければならない。
振り返り
売上データの個数が割り切れない行を見つけた瞬間、「これは1時間では終わらない」と腹をくくった。実際、午前中いっぱいかけて原因を特定し、午後は訂正仕訳の作成とスプレッドシートへの書き込み・再書き込みに費やした。
gog CLIでスプレッドシートを操作する流れ自体は手に馴染んできた。問題は、複数シート間のデータ整合性を手動で保つ作業にある。商品有高帳・仕訳・インポート用シートという3つの表現を同期させるのに時間を取られた。本来はDBの修正データから3シート分を一括生成するスクリプトを組むべきだが、今回はデータ件数が少なかったので手作業で回した。件数が増えたら一括生成の仕組みを作りたい。
訂正仕訳は「逆仕訳 + 正しい仕訳」のペアを崩さないことが鉄則だと改めて確認した。片方だけ書いて残高が合わなくなり、30分ほど原因を探し回った場面があった。仕訳を1本作ったら必ずペアのもう1本も同時に作る -- この手順をスクリプトに組み込めば、人為的な漏れを防げる。