いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Gスプレッドシート)関数で郵便番号から住所を取得する

 Googleスプレッドシートで、入力された郵便番号をもとに住所を取得する方法についてです。
 ただしここで紹介するのはIMEの設定によるものではなく、関数を使って郵便番号を住所に変換する方法です。具体的には無料で利用できる郵便番号検索APIから都道府県・市区町村・町域名を取得します。

  • 関数を使い、ネット上で提供されている郵便番号検索用のAPIを通じて郵便番号に対応する住所を取得することができます。

手順

関数を使った住所の取得例

 早速ですが画像にて結果を示します。
 B3:B6に4つの郵便番号が入力されています(ハイフンなし数値、ハイフンあり文字列の2種)。
 C3セルに次の式を入力してB3セルの郵便番号に対応する都道府県・市区町村・町域名を取得しています。

f:id:accs2014:20200913154834p:plain:w780

 C3セル

=TRANSPOSE(INDEX(SPLIT(QUERY(IMPORTDATA("http://zipcloud.ibsnet.co.jp/api/search?zipcode="&$B3),"WHERE Col1 LIKE 'a%'"),""""),,2))

 まずはIMPORTDATA関数を使って株式会社アイビスより提供されている郵便番号提供APIのURLに郵便番号を送信(「?zipcode="&$B3」の部分)してデータを取得しています。
 APIの詳細については同社による解説をご覧ください。

zipcloud.ibsnet.co.jp

 取得できるデータの詳細は後述しますが、このデータから必要となる部分をQUERY関数やSPLIT関数などで抽出して表示しています。
 

 次の画像は式をC6までフィルコピーした結果です。
 ハイフンの有無にかかわらず住所が得られているのがわかります。ただし先頭が0の郵便番号については0ではじまる文字列にしていないと取得できないので注意が必要です(これらはいずれもAPIの仕様です)。
 なお、最後の行では2組のデータが得られています(C6:E6とF6:H6)。これはこの郵便番号に対応する町域名が2つあるからで、レアケースではありますがその場合にはAPIは2組のデータを返すためこのような結果となります。

f:id:accs2014:20200913154838p:plain:w780

 
 次の画像は都道府県から町域名までをすべて結合して表示する例です。
 C3セルに次の式を入力して、C6セルまでコピーしています。

f:id:accs2014:20200913154842p:plain:w780

 C3セル

=CONCATENATE(INDEX(SPLIT(QUERY(IMPORTDATA("http://zipcloud.ibsnet.co.jp/api/search?zipcode="&$B3),"WHERE Col1 LIKE 'a%'"),""""),,2))

 基本的には上記の式と同様ですがTRANSPOSE関数の代わりにCONCATENATE関数を使うことで文字列を結合しています。
 また、画像は省略しますが都道府県、市区町村、町域名のいずれかだけを取得する式は次のようになります。最後から2番目の数字(INDEX関数の引数)が異なるだけです。

=INDEX(SPLIT(QUERY(IMPORTDATA("http://zipcloud.ibsnet.co.jp/api/search?zipcode="&$B3),"WHERE Col1 LIKE 'a%'"),""""),1,2)
=INDEX(SPLIT(QUERY(IMPORTDATA("http://zipcloud.ibsnet.co.jp/api/search?zipcode="&$B3),"WHERE Col1 LIKE 'a%'"),""""),2,2)
=INDEX(SPLIT(QUERY(IMPORTDATA("http://zipcloud.ibsnet.co.jp/api/search?zipcode="&$B3),"WHERE Col1 LIKE 'a%'"),""""),3,2)

備考

 さて、上記APIを通じて取得できるデータがどういうものかですが、次の画像では例として郵便番号「2740814」に対して取得できるデータを表示しています。

f:id:accs2014:20200913154847p:plain:right:w600

 都道府県・市区町村名・町域名のほかフリガナ含まれたものとなっており、これから必要なデータを抽出して利用することとなります。上記の関数では「a」で始まる行を抽出して、それぞれSPLIT関数で分割して2番目の部分を取得することで都道府県・市区町村名・町域名を取得しています。
 ちなみにこのデータは2列からなりますのでQUERY関数などでデータの抽出しようとする場合はご注意ください。

 ところでスプレッドシートの場合は最初からCSVかXMLでデータが得られるAPIを使った方が早いのではないか(XMLならIMPORTXML関数が使えて有利)、と言われれば確かにその通りかと思います。ただ最初に目に入ったAPIを利用した結果このようになりました。
 なおAPIの利用にあたっては示されている利用条件等をよくご確認ください。