みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptを使ってスプレッドシートの色々な自作関数を作っています。
前回はこちらの記事。
西暦から和暦を求めるスプレッドシート関数を作りました。
今回は、これまた便利なスプレッドシート関数だと思うのですが、Google Apps Scriptで郵便番号から住所を求めるスプレッドシート関数を作ります。
郵便番号APIを活用しますので、初めての方でもトライできるREST APIの使い方の勉強にもなると思います。
では、いってみましょう!
郵便番号から住所を求めるスプレッドシート関数
早速ですが、郵便番号から住所を求めるスプレッドシート関数ZIP_ADDRESSのスクリプトはこちらです。
function ZIP_ADDRESS(zip){ const response = UrlFetchApp.fetch('http://zipcloud.ibsnet.co.jp/api/search?zipcode=' + zip); const results = JSON.parse(response.getContentText()).results; return results[0].address1 + results[0].address2 + results[0].address3; }
たったのこれだけです。
このスクリプトをスクリプトエディタに仕込んだ上で、スプレッドシートで使ってみましょう。
とすると、その住所が求められます。
便利でしょ?
では、このスクリプトを説明していきますね。
郵便番号APIの概要
今回は郵便番号APIというREST形式のWebAPIを使っています。
郵便番号APIは株式会社アイビスが運営する「zipcloud」という郵便番号データ配信サービスが提供するものです。
- API
- REST
- JSON
など、知っておく必要があるものがいくつかありますので以下解説をしていきますね。
APIとは
APIとは「Application Programming Interface」の略で、
を言います。
今、APIエコノミーという言葉が流行ワードになっていますが、Googleの各種サービス、Facebook、Twitterなどの大手ITサービスをはじめ様々なサービスのAPIがどんどん公開されています。
私たちは、それらのサービスのAPIの使い方さえ知っていれば、簡単にその一部機能やデータを活用することができるんですね。
郵便番号APIはWeb経由で使用するAPIですから、WebAPIの一つということになります。
そして、その動作としては郵便番号を渡してリクエストをすると、その住所などの情報がレスポンスとして返ってくる、というものになります。
RESTとは
WebAPIにはRESTとSOAPという二種類の形式が一般的です。
RESTは「REpresentational State Transfer」の略なのですが、簡単に言うと
で、WebAPIの多くがREST形式で提供されています。
郵便番号APIのリクエストURL
郵便番号APIもREST APIで提供されています。
郵便番号APIのリクエストURLは
というルールになっていまして、{zipcode}の箇所に7桁の郵便番号を入力するんです。
例えば、郵便番号に「7830060」を指定して
とリクエストを送ると、その住所などの情報がレスポンスとして返ってくるというわけです。
面倒そうに見えますが、郵便番号以外はコピペでOK。覚える必要はないです。
JSONとは
REST形式のAPIで返ってくるレスポンスは主JSON形式、XML形式のものです。
JSONは
です。そして、そのデータは文字列で構成されているものです。
郵便番号APIのレスポンスもJSON形式です。
例えば、前述のURLにリクエストを送ると、以下のようなJSONデータをレスポンスとして受け取ります。
{ message=null, results=[ { zipcode=7830060, address1=高知県, address2=南国市, address3=蛍が丘, kana1=コウチケン, kana2=ナンコクシ, kana3=ホタルガオカ, prefcode=39 } ], status=200 }
この中から、住所に関連するデータを取り出せればよいということになりますね。
郵便番号ZIPのサイトには、レスポンスフィールドが以下のように説明されていますので、合わせてご覧ください。
Google Apps ScriptでREST APIを利用する
ここまで解説してきました通り、REST APIを利用する場合は
- 指定のURLに対してリクエストを送りレスポンスを受け取る
- 受け取ったレスポンスから欲しい情報を取り出す
という手順になります。
では、今回の郵便番号APIの例で一つ一つ確認してみましょう。
UrlFetchApp.fetchメソッドでREST APIにリクエストを送る
まず、REST APIにリクエストを送る場合はUrlFetchApp.fetchメソッドを使います。
URLは前述の郵便番号APIのリクエストURLですね。
今回はスプレッドシート関数ですから、関数ZIP_ADDRESSの引数zipを{zipcode}に使用します。
UrlFetchApp.fetchメソッドでリクエストした結果がレスポンスとして返って来ますが、それはHTTPResponseオブジェクトという種類のオブジェクトになります。
今回のスクリプトでは以下のように変数responseにレスポンスを格納しています。
const response = UrlFetchApp.fetch('http://zipcloud.ibsnet.co.jp/api/search?zipcode=' + zip);
getContentTextメソッドでレスポンスから文字列を取り出す
次に、レスポンスから欲しい情報を取り出していきます。
まず、レスポンスつまりHTTPResponseオブジェクトから、純粋なJSONデータを文字列として取り出す必要があります。
そのためには、getContentTextメソッドを使います。
JSON.parseメソッドでJSONデータを解析
次にJSON.parseメソッドを使い、JSONデータの文字列を解析してオブジェクト化します。
これをすると、欲しいフィールドの値を取り出しやすくなるのです。
getContentTextメソッドとJSON.parseメソッドはほぼセットで使うので、まとめて覚えておくと良いです。
JSONオブジェクトから値を取り出す
ここまで来ればあと少しです。
JSON.parseしたら、それはオブジェクトなので「.(ピリオド)」を使って辿れば欲しいデータを取り出すことができます。
例えば、郵便番号APIのレスポンスresponseからstatusの値を取り出そうとしたら、以下のようにします。
JSON.parse(response.getContentText()).status
address1の値を取り出したいのならこうです。
JSON.parse(response.getContentText()).results[0].address1;
こちら、resultsが配列になっていますね。
郵便番号APIのレスポンスフィールドによると、resultsは配列になっていますので、最初の要素[0]を指定しています。
(ほとんどの場合、resultsの配列の要素数は1だと思うのですが、複数の場合ってどんなときですかね?)
フィールド名でいうと、address1,address2,address3を連結したものを、関数の返し値としてリターンをします。
まとめ
Google Apps Scriptで郵便番号APIを使って郵便番号から住所を求めるスプレッドシート関数を作りました。
郵便番号APIはREST APIの中でも比較的簡単ですから、REST APIを初めて触る方でも良い練習になると思います。使いどころも多そうですしね。
もうお気づきだと思いますが、REST APIなどの活用は完全クラウドのスプレッドシートならではですよね。ローカルで動作するエクセルなどではこうはいきません。
得意・不得意を見極めて、ケースバイケースで使い分けるのが良いですね。
さて、次回ですが、また便利で面白いスプレッドシート関数とその作り方を思いついたらお伝えしますね。
どうぞお楽しみに!
コメント
初めまして。
こういった専門的な事は全くの初心者なのでお恥ずかしいのですが
ちょっとしたリスト管理で
”郵便番号から住所を自動入力できる方法はないかな?”
と探していたところこちらにたどり着きました。
おかげさまで住所が自導入六出来るようになったのですが
エラーが出てしまう事があります。
>
http://zipcloud.ibsnet.co.jp/api/search?zipcode=2420007 のリクエストに失敗しました(エラー: 403)。サーバー応答の一部: (応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 2)が発生しました。
と表示されてしまうのですが原因は分かりますでしょうか?
教えて頂けるととても助かります。
chisatoさん
コメントありがとうございます。
実は私も実行できるときと、そうでないときがあって少し困ることがあります。
ステータスコードが403ということは、「リクエストの権限がない」ということになります。
郵便番号API側で、何らかの理由で制限をかけているか、意図せずに制限されてしまうことがあるのか不明なのですが、GAS側での対処は難しいのではないかと考えています。
返信ありがとうございます。
そうだったのですね。
教えて頂きありがとうございます。
これからも、拝見させて頂きますね。
ありがとうございました。
こんにちは。最近会社でG Suite が導入されて、住所から郵便番号を求める方法を探しておりました。本記事の内容と逆になると思うのですが、スプレッドシートにある住所データから郵便番号を出力する求めることは可能でしょうか。不躾な質問で申し訳ございませんが、ご教示いただけますと幸いです。宜しくお願いいたします。
Hinaさん
コメントありがとうございます。
今回紹介したAPIでは、住所から郵便番号を求める機能はなさそうですね。
おそらく、何かしらかの方法でできると思うのですが…良い方法見つけたら記事化しますね。
web業界で働いている非エンジニアです。
非常にわかりやすい記事で嬉しく思います。
こちらの関数をそのままコピペして実行してみたのですが、
『TypeError: null からプロパティ「0」を読み取れません。(行 35、ファイル「コード」)』と表示されてしまい、うまく実行できず。。
何かお心当たりありましたら、ご教示のほどお願いいたしますm(_ _)m
function ZIP_ADDRESS(zip){
var response = UrlFetchApp.fetch(‘http://zipcloud.ibsnet.co.jp/api/search?zipcode=’ + zip); //郵便番号APIへのリクエスト
var results = JSON.parse(response.getContentText()).results; //レスポンスをjson解析してresultsを取り出す
return results[0].address1 + results[0].address2 + results[0].address3;
}
reyさん
コメントありがとうございます。
ちょっといただいた情報だけではわかりかねますね…
35行目はどのステートメントになりますか?
こんにちは。スプレッドシート上で郵便番号から住所を求める昨日を探しており、
こちらに辿り着きました。初心者で修正がまったくできませんでした。
function ZIP_ADDRESS(zip){
var response = UrlFetchApp.fetch(‘http://zipcloud.ibsnet.co.jp/api/search?zipcode=’ + zip); //郵便番号APIへのリクエスト
var results = JSON.parse(response.getContentText()).results; //レスポンスをjson解析してresultsを取り出す
return results[0].address1 + results[0].address2 + results[0].address3;
}
を実行すると、
TypeError: null からプロパティ「0」を読み取れません。(行 4、ファイル「コード」)
と出てしまい、実際のスプレッドシート上では入力した直後は反映されているものの、
一度、閉じて再立ち上げを行うと実行出来ているセルもあれば、
ERRORと表記されてしまうセルもあります。
ご教示いただけると助かります。
葛西さま
コメントありがとうございます。
いただいた事象に関しては、他の方からも報告がありますね。
ただ、私のほうで事象が確認できていませんので、なんとも…申し訳ありません。
確認できた際に、何かわかれば報告させていただきます。