0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GASで自動化】郵便番号検索APIを使ってランダムな郵便番号と郵便番号から住所を取得する

Last updated at Posted at 2025-11-10

記事の概要

・GASと郵便場号検索APIでランダムな郵便番号を取得する
・郵便番号検索APIを用いて、郵便番号に一致する住所を取得する

はじめに

GASと無料APIを使って何かできないかなと考えた時に、無料APIでは有名な郵便番号検索APIで、郵便番号の取得と郵便番号から住所を取得できたらいいなと思って、GASを作成してみることにしました。

スクリーンショット 2025-11-09 23.57.37.png
基本的には、郵便番号の列に郵便番号を入力して、郵便番号検索APIを用いて、郵便番号から該当する住所を自動的にセルに記載します。
※住所と住所カナは、郵便番号から自動で入力したものです。

また、郵便番号から住所を割り出すのは、割とありがちな内容ではあるので、もう一工夫したいなと思って、ゲーム性を取り入れました。
それがこちら
スクリーンショット 2025-11-10 0.03.18.png
ランダムな郵便番号を取得するといったものになります。
全国どこの郵便番号なのかわかりませんが、ランダムに郵便番号を取得してきて、どこの住所なのかなとゲーム感覚で楽しめます。
>>>私が運営するブログはこちら。メインは技術ブログですが、副業やポイ活についても紹介!

動作の説明

ステップ1

ランダムな郵便番号を取得してみましょう。
左上のランダムな郵便番号を取得を押すと、ランダムな郵便番号を取得します。
スクリーンショット 2025-11-10 0.06.47.png
こんな感じで郵便番号を検索します。
スクリーンショット 2025-11-10 0.07.35.png
存在する郵便番号があれば、見つかった郵便番号をダイアログ内に表示します。
スクリーンショット 2025-11-10 12.09.10.png
ちなみに、ランダムな郵便番号を取得するロジックとしては、まずランダムな7桁の数字を生成して、郵便番号検索APIを実行します。一致しなかったら30回繰り返します。
30回ぐらい繰り返せば、存在する郵便番号と一致するだろうと私の独断で試行回数は決めました。

ステップ2

取得した郵便番号をA列に記載します。
スクリーンショット 2025-11-10 19.43.27.png

ステップ3

郵便番号から住所を取得ボタンを押します。
すると、郵便番号検索APIを叩いて、住所を取得しにいきます。
スクリーンショット 2025-11-10 19.45.29.png
ちなみに先ほど、ランダムで取得した郵便番号の正体は、愛知県名古屋市天白区音聞山という住所みたいです。
このように、ランダムな郵便番号を取得して、住所を自動で取得する遊びができます。

備考

ちなみに、A列に複数の郵便番号を入力して郵便番号から住所を取得ボタンを押すと、
スクリーンショット 2025-11-10 19.49.18.png
まとめて住所を取得することが可能です。
スクリーンショット 2025-11-10 19.49.42.png

郵便番号検索APIとは?

郵便番号検索APIとは、郵便番号検索APIは、日本郵便が公開している郵便番号データを検索する機能をRESTで提供しているサービスです。

ベースとなるリスクエストURLは、下記となります。

https://zipcloud.ibsnet.co.jp/api/search

このURLに郵便番号のパラメータをつけてリクエストをすると、JSON形式で住所を取得できる仕組みになります。

APIの使い方としては、下記のように郵便番号のパラメータをつけるとレスポンスで住所が返ってきます。

https://zipcloud.ibsnet.co.jp/api/search?zipcode=0790177

下記はレスポンスです。

{
	"message": null,
	"results": [
		{
			"address1": "北海道",
			"address2": "美唄市",
			"address3": "上美唄町協和",
			"kana1": "ホッカイドウ",
			"kana2": "ビバイシ",
			"kana3": "カミビバイチョウキョウワ",
			"prefcode": "1",
			"zipcode": "0790177"
		},
		{
			"address1": "北海道",
			"address2": "美唄市",
			"address3": "上美唄町南",
			"kana1": "ホッカイドウ",
			"kana2": "ビバイシ",
			"kana3": "カミビバイチョウミナミ",
			"prefcode": "1",
			"zipcode": "0790177"
		}
	],
	"status": 200
}	

詳しくは、下記のサンプルJSONなどを確認してください。
>>>郵便番号検索APIの公式HP
郵便番号検索API

郵便番号検索APIを用いて、ランダムな郵便番号を取得するロジックと、郵便番号から住所を取得するロジックのコードは下記です。

ランダムな郵便番号を取得するロジック

ランダムな郵便番号を取得するコードの説明です。
機能としては、下記になります。
・ランダムな7桁の数字を生成する
・生成した7桁の数字を元に、郵便番号検索APIにリクエストする
・存在する郵便番号が取得できたら、郵便番号を表示する
・存在する郵便番号がなかったら、有効な郵便番号がありませんでしたと表示する
・存在する郵便番号に一致しなかったら、最大30回試行する
※ちなみに存在する郵便番号がない場合
郵便番号が1112222をリクエストした場合

https://zipcloud.ibsnet.co.jp/api/search?zipcode=1112222

statusは200が返ってくるが、resultsはnullが返ってきます。

{
	"message": null,
	"results": null,
	"status": 200
}

statusが200かつresultsがnullではない場合であれば、存在する郵便番号として判定しています。

コードはこちら。

/**
 * 存在する郵便番号をランダムに生成し、アラートで表示します。
 * 郵便番号APIでチェックし、住所が存在するもののみを表示します。
 */
function showRandomExistingPostcodeAlert() {
  const ui = SpreadsheetApp.getUi();
  const MAX_ATTEMPTS = 30; // 最大試行回数
  let foundPostcode = null;

  ui.alert("存在する郵便番号を検索中...");

  for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
    // 1. ランダムな7桁の数字を生成
    const randomNumber = Math.floor(Math.random() * 10000000);
    const randomPostcode = String(randomNumber).padStart(7, '0');

    // 2. 郵便番号API (ZipCloud) のURLを構築
    const apiUrl = "https://zipcloud.ibsnet.co.jp/api/search?zipcode=" + randomPostcode;
    
    try {
      // 3. APIを実行して存在チェック
      const response = UrlFetchApp.fetch(apiUrl);
      const json = JSON.parse(response.getContentText());
      
      // 4. 結果のチェック (status: 200 かつ results が null でない = 存在する)
      if (json.status === 200 && json.results !== null) {
        foundPostcode = randomPostcode;
        break; // 存在する郵便番号が見つかったのでループを終了
      }
      
    } catch (error) {
      Logger.log("API実行エラー: " + error.toString());
      // エラーが発生しても処理は継続
    }
  }

  // 5. 結果のアラート表示
  if (foundPostcode) {
    ui.alert(
      "存在するランダム郵便番号", 
      "見つかった郵便番号は: " + foundPostcode, 
      ui.ButtonSet.OK
    );
  } else {
    ui.alert(
      "結果", 
      "有効な郵便番号が見つかりませんでした。再度お試しください。", 
      ui.ButtonSet.OK
    );
  }
}

郵便番号から住所を取得するロジック

ロジックの説明としては下記です。
・A列に郵便番号が記載されているので、郵便番号を取得
・郵便番号の形式チェック
・郵便番号検索APIの実行用にURLを生成
・レスポンス結果をもとにセルに住所を記載

実際のコードはこちら。

/**
 * 実行ボタンから呼び出される関数です。
 * A列に入力された郵便番号を読み取り、B列〜G列に住所情報を自動で入力します。
 */
function generateAddress() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const ui = SpreadsheetApp.getUi();

  // A列のデータがある範囲を取得
  const lastRow = sheet.getLastRow();
  
  // A7から最終行までを対象とする
  const START_ROW = 7; 
  if (lastRow < START_ROW) return; 
  
  const postcodeRange = sheet.getRange("A" + START_ROW + ":A" + lastRow);
  const postcodes = postcodeRange.getValues();
  
  // 処理開始メッセージ
  ui.alert('A列の郵便番号から住所の取得を開始します。');

  for (let i = 0; i < postcodes.length; i++) {
    const postcode = postcodes[i][0]; // A列の値を取得
    // 実際の書き込み行番号は「配列のインデックス + 開始行」
    const targetRow = i + START_ROW; 
    
    // 郵便番号が7桁の数字であるかを確認
    if (postcode.toString().length !== 7 || isNaN(postcode) || postcode === "") {
      // 形式が正しくないか、空の場合はスキップ
      continue; 
    }
    
    // 郵便番号API (ZipCloud) のURLを構築
    const apiUrl = "https://zipcloud.ibsnet.co.jp/api/search?zipcode=" + postcode;
    
    try {
      // APIを実行
      const response = UrlFetchApp.fetch(apiUrl);
      const json = JSON.parse(response.getContentText());
      
      // 結果のチェック (住所情報が見つからない場合)
      if (json.status !== 200 || json.results === null) {
        // B列(2列目)からG列(6列分)までをまとめてクリア
        sheet.getRange(targetRow, 2, 1, 6).clearContent(); 
        continue;
      }
      
      const result = json.results[0];
      
      // 取得した住所情報をスプレッドシートに出力
      // B列 (2): address1 (都道府県)
      sheet.getRange(targetRow, 2).setValue(result.address1);
      // C列 (3): address2 (市区町村)
      sheet.getRange(targetRow, 3).setValue(result.address2);
      // D列 (4): address3 (町域)
      sheet.getRange(targetRow, 4).setValue(result.address3);
      // E列 (5): kana1 (都道府県カナ)
      sheet.getRange(targetRow, 5).setValue(result.kana1);
      // F列 (6): kana2 (市区町村カナ)
      sheet.getRange(targetRow, 6).setValue(result.kana2);
      // G列 (7): kana3 (町域カナ)
      sheet.getRange(targetRow, 7).setValue(result.kana3);
      
    } catch (error) {
      Logger.log("API実行エラー (Row " + targetRow + "): " + error.toString());
      // APIエラーの場合、B列からG列までをまとめてクリア
      sheet.getRange(targetRow, 2, 1, 6).clearContent(); 
    }
  }
  // 処理完了メッセージ
  ui.alert('住所の取得が完了しました。');
}

まとめ

郵便番号検索APIを用いて、GASで何か面白いことはできないかなと思い今回このようなものを作成してみました。郵便番号検索APIは無料のAPIで幅広く活用されているので、GASを作成していく過程で、私自身勉強になりました。
他にも無料で用意されているAPIはたくさんあるので、APIを活用してGASを作成しようかなと思っています。
これからも記事を更新していく予定ですので、他の記事であったり、以下に記載されている私のブログもみていただけたら嬉しいです。
>>>私が運営するブログはこちら。メインは技術ブログですが、副業やポイ活についても紹介!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?