PR

取引先の登録番号を貼るだけで検算する道具を作った(0と9の取り違えだけは、どうやっても見つけられない)

登録番号を貼るだけで検算する|AI部長マン アフィリエイトサイト制作

結論:ブラウザで開いて、Excelから貼るだけ

置き場所はここ。

インボイス番号チェッカー

やることは2つ。

  1. ページを開く
  2. 取引先の一覧をExcelからコピーして、枠に貼る

貼った時点で判定が出ます。ボタンを押す必要すらありません。列の順番も、見出しの有無も、こちらで判断します。設定する場所は1つもありません。

出てくるのは、行ごとの判定と、その根拠と、直し方。CSVでも保存できます。インストールも会員登録もなし。ファイルはどこにも送りません。取引先の一覧はそれ自体が営業秘密なので、送っていないことの確かめ方は後半に書いた。

そして先に、この道具にできないことを1つ書いておく。0と9を打ち間違えた番号は、この検査を通り抜ける。 見つけられないのではなく、算式の作りからして原理的に無理です。理由は後半に書きます。

なぜ作ったのか:13桁は、目で検算できない

うちの副業でも、サーバー代とドメイン代の請求書がPDFで届く。前回、そのファイル名を自動で付ける道具を作った(電帳法リネーマー)。

その流れで気づいたのが、請求書に載っている登録番号のほうだ。T のあとに数字が13桁並んでいる。取引先の一覧にこれを書き写すとき、人はどこかで間違える。13桁を目で追って照合する作業は、たぶん3社目で集中力が切れる。

正直に書くと、うちの取引先は数社しかない。目で見れば足りる。だからこの道具が本当に効くのは、取引先が何十社・何百社とあるところで、そこは自分では試せていません。作ったのは「自分が困ったから」というより、「13桁を目で検算するのは無理だと分かったから」だ。

で、調べていて手が止まった。この13桁、でたらめな番号ではないらしい。

国税庁が、検算のしかたを公表している

法人番号は13桁だが、意味のある12桁(基礎番号)と、その前に付いた1桁の「検査用数字」でできている。この1桁は、残りの12桁から計算で出せる。

計算のしかたは国税庁が公表しています(チェックデジットの計算、2026年8月26日に確認)。

検査用数字 = 9 −((最下位から偶数桁の和 × 2 + 最下位から奇数桁の和) ÷ 9 の余り)

公表されている計算例をそのまま書くと、こうなる。

手順計算
基礎番号700110005901
最下位から偶数桁の和13 → 2倍して 26
最下位から奇数桁の和11
足す26 + 11 = 37
9で割った余り(商は無視)37 ÷ 9 → 余り 1
9から引く9 − 1 = 8
できあがる法人番号8700110005901

つまり、番号の先頭1桁は残り12桁から決まる。打ち間違えると、この関係が崩れる。 崩れたことは機械なら一瞬で分かる。これが道具の中身のすべてです。

検索結果の断片で組んだら、検算が合わなかった

ここで1つ、自分の失敗を書いておきます。

最初、算式を検索で調べた。検索結果に計算例の断片が出ていたので、それを読んで実装した。動かしてみたら、答えが合わない。正解は8のはずなのに、1が出る。

原因は算式ではなく、断片から拾った基礎番号のほうを読み違えていたことだった。検索結果のテキストは表組みの順番が崩れていて、数字の並びが元とは違っていた。それに気づかず「算式が違うのかもしれない」と疑っていた。

結局、国税庁のPDFを開くまで解決しなかった。ところがそのPDFが、テキストとしてそのままでは読めない。仕方がないので、前回作ったリネーマーに入れたPDF読み取りの部品を使って、座標つきで中身を取り出した。そうしたら計算例が図ごと出てきて、すぐ片がついた。

道具が次の道具を作るのに効いた、というのが今回いちばん面白かったところだ。そして教訓のほうは地味で、一次情報は原典を開くまで信じない、これに尽きる。合っているつもりのまま実装が進んでいた時間が、いちばん危ない。

この検査で分かること、分からないこと

作ったあと、どのくらいの誤りを捕まえられるのかを全数で調べた。正しい番号を大量に作って、1桁ずつ壊して、何件見つかるかを数える方法だ。

誤りの型試した数見つけた割合取りこぼす条件
1桁の打ち間違い117,000件約98%0と9の取り違えだけ
隣どうしの入れ替え(1234→1243)約21,600件約98%2つの数の差が9のときだけ

取りこぼす条件がきれいに揃っている。理由は算式にある。この計算は9で割った余りしか見ていないので、誤りによる変化がちょうど9の倍数になると、余りが変わらない。1桁なら 0と9 の取り違え、隣の入れ替えなら差が9の組み合わせが、それに当たる。

だから冒頭に書いたとおり、0と9の取り違えは見つけられない。これは実装の出来の問題ではなく、算式の性質です。検算を通ったから正しい番号、とは言えない。

ついでに、算式から言い切れることが1つある。9から0〜8のどれかを引くので、検査用数字は必ず1から9のどれかになる。0にはならない。つまり先頭が0で始まる13桁は、法人番号としてはありえない。ランダムな番号を20万件作って計算させても、0は1件も出なかった。

検算が合わなくても「誤りです」とは書かない

ここが、この道具でいちばん考えたところです。

登録番号の構成は、国税庁の登録番号とはにこう書いてあります(2026年8月26日に確認)。

事業者登録番号
法人「T」+ 法人番号(数字13桁)
個人事業者、人格のない社団等「T」+ 数字13桁

そして個人事業者などの13桁については「マイナンバー(個人番号)は用いず、法人番号とも重複しない事業者ごとの番号になります」と書かれている。

つまり、法人番号とは別に採番された番号です。そして同じページに、検査用数字についての記載はありません。

ということは、個人事業者の登録番号が上の算式に従う保証は、公表されている情報からは得られない。 従っている可能性はありますが、こちらでそれを確かめる手段がありません。

なので、検算が合わなかったときに「この番号は誤りです」と表示するのはやめた。正しい番号を「誤り」と表示されたら、その取引先に確認の連絡をすることになる。相手の手間を取らせたうえで、こちらが間違っている。見逃すより害が大きい。

道具が出すのは「合わなかった」という事実と、その意味の限界だけにした。画面にもこう書いてある。

検査用数字が合わないことは「誤り」の証明になりません。個人事業者・人格のない社団等の登録番号は法人番号とは別に付番される番号で、国税庁はこの算式が当てはまるとは公表していません。

確認は国税庁の公表サイトでしてください、というところまでが道具の仕事だと考えています。

なお、番号が空欄の行についても「番号なし」としか出さない。免税事業者かどうかの判断はしない。そこは税務の判断で、こちらが立ち入る話ではありません。

Excelが桁を落としているのを見つける

もう1つ、実務で効きそうなものを入れました。

13桁の数字をExcelのセルに入れると、書式によっては数値として扱われて 8.70011E+12 のような表示に変わる。このとき、下の桁は本当に失われている。 見た目が変わっただけではなく、データとして消えている。あとから元の13桁を復元する方法はありません。

これを「形式エラー」とまとめてしまうと、原因にたどり着けない。なので専用の判定を用意して、名指しで出すようにしました。直し方も「元データ側で列の書式を文字列にしてから貼り直してください」と書いてある。

判定は5種類ある。

判定意味断定できるか
適合形式も検査用数字も通った実在は確認していない
要確認形式は正しいが、検査用数字が合わない誤りとは断定しない
形式エラー桁数や文字の種類が定義に反する断定できる
桁落ちExcelが数値に変えて桁が失われている断定できる(復元は不可)
番号なし番号らしい値が見つからない何も断定しない

全角で書かれた番号、ハイフン区切り、先頭のTの抜け、小文字のt、余分な空白は、こちらで直してから判定する。直した内容は必ず画面に出す。黙って直すと、元データが直ったと勘違いされるので。

同じ番号が複数の行にあるときも知らせる。取引先マスタの二重登録は、探そうと思わないと見つからない類のものです。

ファイルを送っていないことの確かめ方

取引先の一覧は、社名が並んでいるだけで営業秘密になる。どこかに送られていないかを疑うのは当然だと思う。確かめ方は3つあります。

1つ目。ネットを切ってから使ってみてください。 ページを開いたあとにWi-Fiを切っても、判定もCSVの書き出しも同じように動く。送っているなら動きません。

2つ目。このページは、外部への通信そのものをブラウザの機能で禁止している。Content-Security-Policy: connect-src 'none' という宣言をページに入れてあり、通信のしくみ(fetch・XHR・WebSocket・sendBeacon)がどれも使えない状態になっている。仮に送ろうとしてもブラウザが止めます。

3つ目。開発者ツールのネットワークを開いたまま貼ってみてください。通信は1本も増えません。

作ったあと、この「送れない」を本物のChromeで実際に試している。fetch・XHR・sendBeacon・WebSocket・画像による持ち出しの5通りを試して、全部ブロックされること、外から返事が来た通信が0本であることを確認しました。

ついでに、貼られた文字列がそのままページの一部として実行されないことも試した。取引先名の欄にタグのようなものが入っていても、文字として表示されるだけになります。

検査は全部で138項目あります。内訳は、Nodeで動かす検算そのものの検査が91項目と、本物のChromeを起動しての検査が47項目。公開したあと、ブラウザ側の検査を本番のURLに対して再実行して、46項目が通ることを確認しました(残る1項目は配信サイズの検査で、手元で配信するときにしか動かないものです)。

使い方

Excelの取引先マスタから、範囲をそのままコピーして貼るだけ。列は「取引先名」「登録番号」の順でなくてもいい。番号らしい列を自動で選びます。1行目が見出しなら、それも自動で除きます。

CSVファイルを枠に落としても読み込む。Excelが吐いたShift_JISのCSVも、文字化けを検出したら読み直すようにしてあります。

結果は、手当てが必要な行が上に来るように並ぶ。行番号は貼った表のままなので、Excelに戻って直すときに追いやすい。

「結果をCSVで保存」を押すと、判定と根拠と直し方まで入ったCSVが出る。Excelで開いても文字化けしないようにしてあります。

道具そのものは1つのHTMLファイルで、大きさは47KB。ページを保存すれば、ネットにつないでいないパソコンでも同じように動く。社内の共有フォルダに置いてもらってかまいません。

この道具でやらないこと

  • 実在の確認はしません。一度も通信しないので原理的にできません。その事業者が今も登録されているかは国税庁の公表サイトで確認してください
  • 税務の判断はしません。免税事業者かどうか、仕入税額控除がどうなるかといった話には立ち入りません。制度のあてはめは税理士か所轄の税務署へ
  • 0と9の取り違えは見つけられません。上に書いたとおり、算式の性質によるものです

要件を満たすための作業を助ける道具であって、要件を満たしていることを保証するものではありません。最終的な判断は各社でお願いします。

「うちのデータだと拾えなかった」を教えてください

いちばんありがたい報告がそれです。列の作りや番号の書き方は会社ごとに違うので、実際のデータで拾えなかったパターンが分かれば直せます。

取引先の一覧そのものを送っていただく必要はない(というより、送らないでください)。「こういう形の列だった」「こう書いてあった」だけで十分たどれる。お問い合わせから教えてください。

置いてある道具は道具箱にまとめてあります。

よくある質問

登録番号は何桁ですか

「T」を除いて13桁。法人は「T」+法人番号13桁、個人事業者や人格のない社団等は「T」+13桁の数字になる(国税庁「登録番号とは」、2026年8月26日に確認)。この道具は13桁でないものを形式エラーとして出します。

12桁しか分からないとき、13桁にできますか

12桁が法人の「会社法人等番号(基礎番号)」であれば、上の算式で先頭の1桁を計算できる。この道具も12桁が入力されたときは計算結果を候補として出します。ただしその12桁が基礎番号だという確認まではできないので、候補として出すだけにとどめている。

検査に通った番号は、本物ということですか

いいえ。この道具が見ているのは「桁の並びが算式と矛盾しないか」だけで、その番号の事業者が実在するか、今も登録されているかは分かりません。取引を始める前は国税庁の公表サイトで確認してください。

検査に通らなかった番号は、間違いということですか

いいえ。法人の番号であれば打ち間違いの可能性が高いが、個人事業者などの登録番号については、この算式が当てはまると国税庁は公表していません。誤りとは断定できません。

何行まで貼れますか

上限は設けていません。判定はすべてブラウザの中で動くので、行数が多いと端末の速さに依存します。どこまで実用的かは試していません。

料金はかかりますか

無料。会員登録も不要。事業者向けに置いているものなので、業務でそのまま使ってもらってかまいません。

コメント

タイトルとURLをコピーしました