Excel の WEBSERVICE 関数で法人番号付与

Excel の WEBSERVICE 関数を使って、企業・団体名に対応する法人番号を取得する方法を紹介します。

前提となる WEBSERVICE 関数については以下の拙稿をご参照ください。
- [Excel の WEBSERVICE 関数で外部データ取得](http://qiita.com/frogcat/items/eddf5f8df4bba0419336)
- [Excel の WEBSERVICE 関数でジオコーディング](http://qiita.com/frogcat/items/585c7de901c31cf30760)


# 1.法人番号 API

WEBSERVICE 関数を使う場合の制約として、特殊なヘッダや認証なしで、GET一発で XML が返ってくるような API でないといけない、というのが基本的な縛りです。

法人番号APIとしては [国税庁・法人番号公表サイト](http://www.houjin-bangou.nta.go.jp/) が目立ちますが、ここはアプリケーションIDの発行が必要なので WEBSERVICE 関数目線ではちょっと使いづらいです。

ここでは、[法人インフォ](http://hojin-info.go.jp/hojin/TopPage) で提供されている SPARQL Endpoint API を使った方法を紹介します。

# 2. 名称から法人番号を取得

まずは **A列** に企業・団体名が入っている状態から、下図のように **C列** に法人番号を埋めてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82494/3ad1e9d0-489a-5499-69df-1ffd6cae80eb.png)


B2～D2 に以下をコピーすることで、B2 に SPARQL 実行結果が、C2 に法人番号が、D2 にヒット件数がフィルされます。

```:セルB2
= WEBSERVICE("http://api.hojin-info.go.jp/sparql?query=" & ENCODEURL("PREFIX : <http://imi.go.jp/ns/core/rdf#> SELECT ?id WHERE {?s a <http://hojin-info.go.jp/ns/domain/biz/1#法人基本情報型> ; :ID/:識別値 ?id ; :名称/:表記 '" & A2 & "'.}"))
```

```:セルC2
= FILTERXML(B2,"//literal")
```

```:セルD2
= (LEN(B2) - LEN(SUBSTITUTE(B2,"<literal",""))) / 8
```

うまくいくようだったら、B2～D2を C3～D8 にコピペすることで完成です。
ここで、D列には SPARQL Endpoint の結果の件数が入ります。一件だけなら名称に対応する正しい法人番号が取得できていると考えていいのですが、複数の場合にはまだ確定できません。

# 3. 名称と都道府県から法人番号を取得

前の例では名前の完全一致でしたが、実際には同名の企業・団体というのはとても多いです。府中市は日本に二つありますし、「株式会社アルファシステム」にいたっては29件もあります。
ここでは **A列** に名称、 **B列** に都道府県が与えられているものとして、**D列** に法人番号を埋めてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82494/a86dfb37-09eb-5af9-35ed-e975d4eddac4.png)

```:セルC2
= WEBSERVICE("http://api.hojin-info.go.jp/sparql?query=" & ENCODEURL("PREFIX : <http://imi.go.jp/ns/core/rdf#> SELECT ?id WHERE {?s a <http://hojin-info.go.jp/ns/domain/biz/1#法人基本情報型> ; :ID/:識別値 ?id ; :名称/:表記 '" & A2 & "' ; :住所/:都道府県 '" & B2 &"'.}"))
```

```:セルD2
= FILTERXML(C2,"//literal")
```

```:セルE2
= (LEN(C2) - LEN(SUBSTITUTE(C2,"<literal",""))) / 8
```

セル C2 の中のクエリー文が少し違うだけで、やっていることはほとんどかわりません。うまくいったようだったら、C2～E2 を C3～E5 にコピペして完成です。

だいぶヒット数は減りましたが、都道府県内で名前が重複する事例もないとはいいきれません。

# 4. 名称と都道府県と市区町村から法人番号を取得

**C列** に市区町村名が与えられたパターンです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82494/615fbbe6-e381-f357-1071-5af182a96af5.png)

```:セルD2
= WEBSERVICE("http://api.hojin-info.go.jp/sparql?query=" & ENCODEURL("PREFIX : <http://imi.go.jp/ns/core/rdf#> SELECT ?id WHERE {?s a <http://hojin-info.go.jp/ns/domain/biz/1#法人基本情報型> ; :ID/:識別値 ?id ; :名称/:表記 '" & A2 & "' ; :住所/:都道府県 '" & B2 &"' ; :住所/:市区町村 '" & C2 &"'.}"))
```

```:セルE2
= FILTERXML(D2,"//literal")
```

```:セルF2
= (LEN(D2) - LEN(SUBSTITUTE(D2,"<literal",""))) / 8
```

# 5. 解説

それぞれ以下のような SPARQL が実行されています。

```name.rq
PREFIX : <http://imi.go.jp/ns/core/rdf#>
SELECT ?id WHERE {
  ?s a <http://hojin-info.go.jp/ns/domain/biz/1#法人基本情報型> ;
  :ID/:識別値 ?id ;
  :名称/:表記 "経済産業省".
}
```

```name_pref.rq
PREFIX : <http://imi.go.jp/ns/core/rdf#>
SELECT ?id WHERE {
  ?s a <http://hojin-info.go.jp/ns/domain/biz/1#法人基本情報型> ;
  :ID/:識別値 ?id ;
  :名称/:表記 '経済産業省' ;
  :住所/:都道府県 '東京都'.
}
```


```name_pref_city.rq
PREFIX : <http://imi.go.jp/ns/core/rdf#>
SELECT ?id WHERE {
  ?s a <http://hojin-info.go.jp/ns/domain/biz/1#法人基本情報型> ;
  :ID/:識別値 ?id ;
  :名称/:表記 '経済産業省' ;
  :住所/:都道府県 '東京都' ;
  :住所/:市区町村 '千代田区' .
}
```

# 6. まとめ

見ての通り実際の中身は SPARQL だったり共通語彙だったりするのですが、そのあたりの理解はあとまわしでもいいので、まずは Excel にコピペすれば名前から法人番号を引ける、という方法を紹介しました。手持ちのデータに法人番号をつけたくなったときに、ちょっと思い出してみてください。