約9分で読めます

【GAS】暗号資産の記録を「台帳1枚」に作り直した。確定申告の計算書まで自動生成


目次
  1. はじめに
  2. 抱えていた課題
  3. 作った仕組みの概要
  4. 1. 入力場所を「取引台帳」1枚に統合する
  5. 2. 取引所別、通貨別に保有量が分かる
  6. 3. エアドロなど実績が見える
  7. 4. 雑所得のアドバイスも確認できる
  8. 仕組みの詳細
  9. 1. 1イベント = 1行。スワップは「2レッグ方式」で表す
  10. 2. 移動平均法の計算エンジンをGASで実装する
  11. 3. 「移動・ブリッジ」は課税イベントにしない
  12. 4. 円換算レートを自動で埋める
  13. 5. 確定申告の計算書をPythonで生成する
  14. 帳簿とブロックチェーンを突き合わせる
  15. 得られたメリット
  16. 記録が1回で済むようになった
  17. 申告作業がスクリプト1回になった
  18. 税負担0円の着地点を逆算して賢く節税できるようになった
  19. 使ったサービス・ツール
  20. まとめ

はじめに

暗号資産を触っていて一番つらいのは、値動きではなく記録です。取引所で買って、DEXでスワップして、ブリッジで別チェーンに移して、エアドロップやステーキング報酬が勝手に増えていく。1年経つと、自分が何をいくらで持っているのか誰にも分からなくなります。

そして年が明けると確定申告がやってきます。この記録を作り直しました。設計の原則はひとつだけ、「トランザクションを1回だけ記録し、残りは全部自動生成する」です。

抱えていた課題

これまではGoogleスプレッドシートを複数枚使って手で管理していたのですが、次のような問題を抱えていました。

  • 三重に転記していた: 「取引シート」、「暗号資産台帳シート」、「プロジェクト管理シート」を使って、それぞれに同じ取引を書いていました。
  • 損益を手計算していた: 保有総数・費用累計・売却益といった列を、電卓と関数で自分で埋めていました。当然ミスします。
  • 記帳漏れが起きる: エアドロやステーキング報酬は「気づいたら増えている」ので、記録そのものを忘れます。
  • 申告のたびに一から集計していた: 国税庁の様式に転記する作業が毎年発生していました。

作った仕組みの概要

Googleスプレッドシート + Google Apps Script(GAS)で、完全無料の記録システムを作りました。入力する場所を1か所に絞り、そこから他のシートを全部生成させています。

1. 入力場所を「取引台帳」1枚に統合する

人間が触るシートは取引台帳だけです。残高一覧・資産別台帳・年間損益・種別ごとのビュー・プロジェクト集計は、すべてGASが台帳から自動生成します。生成されたシートは手で編集しません。

これだけで、三重転記が消えました。転記を挟まないので、シート間で数字が食い違うということ自体が起きなくなります。

2. 取引所別、通貨別に保有量が分かる

暗号資産を複数触っていると、「今どこに何の通貨がいくらあるのか」が把握できなくなります。

このシステムでは、台帳データを元に**「場所別(取引所・ウォレット・プロトコル)」と「通貨別」の保有残高をワンクリックで切り替えて一覧表示**できます。各資産の保有数量だけでなく、リアルタイムの時価や取得原価までひと目で確認できるため、「あのウォレットにいくら残っていたっけ?」と探す手間がゼロになりました。

3. エアドロなど実績が見える

ステーキング報酬やエアドロップ、トレード、BCG(ブロックチェーンゲーム)など、種別ごとの獲得実績が自動で集計されます。

件数と差引損益(円換算額 − 必要経費)がクリアに見えるため、「どの取り組みでどれだけ稼げたのか」「どれがマイナスだったのか」の費用対効果が瞬時に判断できます。明細はスプレッドシートの「実績サマリー」シートにリアルタイムで反映されます。

4. 雑所得のアドバイスも確認できる

暗号資産の損益管理で頭を悩ませるのが、**「雑所得の損失は翌年に繰り越せず、年をまたぐと切り捨てになる」**という税務ルールです。

そこで、今年ここまでの実現損益と保有銘柄の含み損益(現在レート概算)から、「税負担を0円にする着地点」を逆算してアドバイスしてくれる機能を付けました。税率区分が上がる手前までの利益確定余地や、意味のある損失確定(損出し)の枠を自動計算してくれます。

仕組みの詳細

ここからは、スワップの記帳ルールや損益計算ロジック、確定申告用Excel生成など、自動化を支える具体的な仕組みを解説します。

1. 1イベント = 1行。スワップは「2レッグ方式」で表す

台帳は1行が1つの出来事です。ただし暗号資産のスワップは「Aが出ていってBが入ってくる」という2方向の動きなので、1行の中に出通貨・出数量入通貨・入数量の両方を持たせています。

  • 購入 … 出=JPY、入=買った通貨
  • 売却 … 出=売った通貨、入=JPY
  • スワップ … 出=手放した通貨、入=受け取った通貨
  • 報酬 … 出は空欄、入=もらった通貨

この形にしておくと、あとの計算がすべて「出た側・入った側」の処理に統一できます。

2. 移動平均法の計算エンジンをGASで実装する

日本の暗号資産の損益計算は、原則として移動平均法(届出をすれば総平均法)で行います。この計算をGASに実装しました。

台帳を日付順に走査しながら、資産ごとに「保有数」と「費用累計」を更新していきます。通貨が出ていくたびに次の式で損益を出します。

  • 売却益 = 譲渡価額 − 平均単価 × 数量

これまで手計算していた列が、まるごと自動になりました。

3. 「移動・ブリッジ」は課税イベントにしない

ここが実装していて一番悩んだところです。ウォレット間の移動やブリッジは、自分の資産が自分の別の場所に移るだけなので損益は発生しません。しかしクロスチェーンスワップのように「移動しながら通貨も変わる」ケースがあるため、移動とスワップを別フォーマットにすると破綻します。

そこで、移動もブリッジも種別は「スワップ」で記録し、判定でこう分けました。

  • 出通貨 ≠ 入通貨 … 通常のスワップ。出た側の譲渡損益を認識する
  • 出通貨 = 入通貨 … 移動・同一通貨ブリッジ。損益は発生させない。ただし数量が目減りした分(ブリッジ手数料)だけを0円譲渡として損失に計上する

4. 円換算レートを自動で埋める

損益計算には円換算額が要りますが、取引のたびに当時のレートを調べるのは現実的ではありません。CoinGeckoの無料APIを使い、円換算額が空欄の行だけをGASが埋めるようにしました。過去日付の行には、その日の終値を取りに行きます。

  • ティッカーとCoinGecko IDの対応は「通貨マスター」シートで管理
  • APIに存在しないマイナー通貨は、ウォレットに表示されている円価値をそのまま手入力
  • 手入力の値が最優先。GASは空欄しか触りません

入力自体はスマホから行えるように、GASのWebアプリで入力画面も作りました。URLをホーム画面に追加すればアプリのように起動でき、「レート取得」ボタンで現在の円換算額がその場で入ります。

5. 確定申告の計算書をPythonで生成する

国税庁が配布している「暗号資産の計算書(移動平均法用)」のExcel様式に、台帳から直接書き込むスクリプトをPythonで書きました。計算ロジックはGAS側とまったく同じものを移植しています。

やっていることは単純で、スプレッドシートをxlsxでダウンロードして、スクリプトを1回叩くだけです。

  • 1通貨 = 1シート。その年に動きがあった通貨だけを出力
  • 記入欄は様式どおり28行なので、超える通貨は「次葉」に自動分割USD USD(2) USD(3) …)
  • 「所得金額の計算」は最終葉にだけ記入する

実行すると、556イベント / 156通貨 / 165シート、といった規模で一気に生成されます。

帳簿とブロックチェーンを突き合わせる

記帳漏れを二度と起こさないために、台帳の残高と実際のウォレットの残高を突き合わせる機能も足しました。

  • EVM系はEtherscan API V2、Solanaは公式RPC(Heliusがあればそちらを優先)から残高と送金履歴を取得
  • 台帳の場所別残高と突き合わせ、円換算で1,000円以上ずれている行を赤く表示
  • ウォレット間の移動は、チェーンの送金履歴から自動で記帳する

作りながら分かったのは、外部APIは想像以上に不安定だということです。「BSCが読めなかった」のと「取引が0件だった」のは全然違う意味なのに、素直に実装すると同じ結果になってしまいます。ここを区別する、エクスプローラが落ちていたら別のAPIに切り替える、といった地味な対策がかなりの割合を占めました。

得られたメリット

記録が1回で済むようになった

入力するのは取引台帳の1行だけ。残高も、損益も、プロジェクト別の集計も、全部そこから生成されます。スマホから数タップで記録できるので、「あとでまとめて書く」がなくなり、日々の負担が圧倒的に軽くなりました。

申告作業がスクリプト1回になった

これまで毎年膨大な時間を取られていた集計と手作業の転記が、xlsxをダウンロードしてコマンドを1回叩くだけで完結するようになりました。何十枚もの計算書が一瞬で組み上がり、申告時期の憂鬱から完全に解放されました。

税負担0円の着地点を逆算して賢く節税できるようになった

暗号資産の赤字は翌年に繰り越せないため、年内に有効活用しなければまるまる切り捨てられてしまいます。

このアドバイス機能のおかげで、たとえば「現在41万円の赤字が出ているから、含み益があるこの銘柄をあと41万円分利確すれば、税金0円のまま利益を手元に残せる」といった判断が瞬時にできるようになりました。年末に慌てて電卓を叩くことなく、税金を合法的に最小化する戦略的な利確・損出しができるようになったのは大きな収穫です。

使ったサービス・ツール

作るより先に「何を使うか」を決めるのが実は一番時間がかかりました。使ってみて分かったことも含めて残しておきます。

サービス/ツール役割使ってみての学び
Google スプレッドシート台帳と自動生成シートの置き場無料。スマホでもPCでも同じものが開ける。関数を書かない前提にすると壊れにくい
Google Apps Script (GAS)計算エンジン、スマホ入力画面Webアプリとして公開できるのでサーバーが要らない。実行時間の上限があるので重い処理は分割が必要
CoinGecko API(無料枠)円換算レートの自動取得過去日付の終値も取れる。ただしマイナー通貨は載っていないので手入力との併用が前提
Etherscan API V2EVM系チェーンの残高・送金履歴chainid を変えるだけで複数チェーンを1本のAPIで扱える。V1から乗り換える価値あり
HeliusSolanaの高速RPC公式RPCより多くの件数をまとめて取れる。無い場合は公式RPCにフォールバックする作りにした
Python + openpyxl国税庁様式のxlsx生成既存テンプレートの書式や結合セルを壊さずに値だけ書き込める。様式が変わってもテンプレ差し替えで済む

まとめ

「1回だけ記録して、残りは全部自動生成する」という設計は、暗号資産のように取引が多岐にわたり複雑な領域ほど効果を発揮します。

入力の手間を最小限に抑えつつ、計算や申告書作成をスクリプトに任せることで、二重転記のミスや確定申告のストレスをゼロにすることができました。スプレッドシートとGAS、Pythonを組み合わせれば、高価な専用サービスを使わなくても自分に最適化した仕組みが作れるので、同じ悩みをお持ちの方はぜひ試してみてください。