Googleスプレッドシートで住所を自動分割!関数とGASでデータ整理を効率化

自動化事例

「住所データが一つのセルにまとまっていて、都道府県ごとに並べ替えられない…」
「DMを送るために、住所から建物名だけを抽出したいけど、手作業は大変すぎる…」
「入力された住所の形式がバラバラで、データの整理に時間がかかってしまう…」

これらの課題は、Googleスプレッドシートの関数やGAS(Google Apps Script)を使えば、自動で解決できるかもしれません。

この記事では、一つのセルに入力された住所を「都道府県」「市区町村」「町名・番地」「建物名・部屋番号」といった階層ごとに自動で分割し、整理する方法を解説します。コピー&ペーストで使えるサンプルコードも用意していますので、ぜひ最後までご覧ください。

この記事でできること・難しいこと

まずはじめに、この記事で解説する方法で対応できることと、対応が難しいことを明確にしておきます。

【できること】

  • 「東京都千代田区丸の内1-1-1 〇〇ビル101」のような一般的な形式の住所を分割する
  • 都道府県、市区町村、町名・番地、建物名・部屋番号 の4つの階層に分割する
  • 「四日市市」や「市川市」のように、地名に「市」が含まれる住所にも対応する

【できないこと・難しいこと】

  • 7階層(都道府県、市、行政区、町域名、番地、建物名、号室)への完璧な分割:住所表記の多様性から、特に「町域名」以降をルールベースで完璧に分割する
  • 「京都市中京区烏丸通御池上ル」のような、歴史的な通り名を含む特殊な形式の住所の完全な分割
  • 明らかに間違っている住所(例:郵便番号と住所が一致しない)の修正

今回ご紹介する方法は、多くの一般的な住所データに対応できますが、すべての形式に100%対応するものではない点をご理解ください。

準備:住所分割の完成形イメージ

まずは、どのような状態を目指すのか、完成形を確認しましょう。

今回は、A列に入力された住所データを、B列からE列にそれぞれ「都道府県」「市区町村」「町名・番地」「建物名・部屋番号」として分割します。

※画像内の住所はサンプルであり、実際の住所とは異なる場合があります

最終的には、A列の住所を更新すれば、B列からE列も自動で更新される状態を目指します。

「今すぐ使いたい」「設定が面倒」という場合は、設定済みのテンプレートを無料で配布しています。以下のフォームからテンプレートをお受け取りください。

    関数を使って住所を分割する方法

    まずは、比較的簡単な「関数」を使って住所を分割する方法から解説します。専門的な知識は不要で、数式をコピー&ペーストして少し調整するだけで実現できます。

    今回は、特定のパターン(ルール)に一致する文字列を抽出できるREGEXEXTRACT関数を主に使用します。

    ステップ1:都道府県を抽出する

    最初に、住所データから「都道府県」の部分だけを取り出します。

    B2セルに、以下の数式を入力してください。

    =IFERROR(REGEXEXTRACT(TRIM(A2),"^(北海道|東京都|京都府|大阪府|[^  ]+県)"),"")

    TRIM関数で前後の余分なスペースを削除してから、正規表現で都道府県名を抽出しています。

    ステップ2:市区町村を抽出する

    次に、市区町村を抽出します。

    C2セルに、以下の数式を入力してください。

    =IFERROR(
      REGEXEXTRACT(
        REGEXREPLACE(MID(TRIM(A2),LEN(B2)+1,999),"^[  ]+",""),
        "^([^\d0-9\--ー  ]+市[^\d0-9\--ー  ]+区|[^\d0-9\--ー  ]+市|[^\d0-9\--ー  ]+郡[^\d0-9\--ー  ]+(?:町|村)|[^\d0-9\--ー  ]+区|[^\d0-9\--ー  ]+町|[^\d0-9\--ー  ]+村)"
      ),
      ""
    )

    ステップ3:町名・番地を抽出する

    詳細な番地表記(漢数字の丁目、「-(ハイフン)」、「番地」など)を正規表現で抽出します。

    D2セルに、以下の数式を入力してください。

    =IFERROR(
      REGEXEXTRACT(
        REGEXREPLACE(MID(TRIM(A2),LEN(B2)+LEN(C2)+1,999),"^[  ]+",""),
        "^([^  ((]*?(?:(?:[0-90-9]+)(?:丁目)?|[一二三四五六七八九十〇零百千]+丁目)(?:[  ]*(?:北東|北西|南東|南西|中央|東|西|南|北|中))?(?:[ \-‐-–—―−-ーーの]?(?:[0-90-9]+))*(?:(?:番地|番|号)(?:の)?(?:[0-90-9]+)?)*)"
      ),
      IFERROR(
        REGEXEXTRACT(
          REGEXREPLACE(MID(TRIM(A2),LEN(B2)+LEN(C2)+1,999),"^[  ]+",""),
          "^([^  ((]+)"
        ),
        ""
      )
    )

    ステップ4:建物名・部屋番号を抽出する

    最後に、元の住所から「都道府県」「市区町村」「町名・番地」をすべて取り除き、残った部分を建物名とします。

    E2セルに、以下の数式を入力してください。

    =TRIM(SUBSTITUTE(
      A2,
      B2&C2&D2,
      ""
    ))

    これで、関数を使った4階層の住所分割は完了です。すべての行に数式をコピーして適用してください。

    GASを使って住所を分割する方法(応用編)

    「関数ではうまく分割できない」「より精度高く分割したい」という方には、GAS(Google Apps Script)を使った方法がおすすめです。GASを使うことで、より複雑な条件分岐が可能になり、分割の精度を高めることができます。

    ここでは、住所を4階層に分割するカスタム関数を作成します。

    GAS(Google Apps Script)の基本的な使い方やスクリプトの保存方法については、こちらの記事で詳しく解説しています。

    ステップ1:スクリプトを準備する

    以下のコードをスクリプトエディタに貼り付け、保存してください。

    /**
     * 住所を都道府県、市区町村、町名番地、建物名以降の4つに分割する
     * @param {string} address 分割したい住所の文字列
     * @return {Array<string>} 分割後の文字列の配列
     * @customfunction
     */
    function SPLIT_ADDRESS_V2(address) {
      if (!address || typeof address !== 'string') {
        return ["", "", "", ""];
      }
    
      let fullAddress = address.trim();
      let prefecture = "";
      let municipality = "";
      let street = "";
      let building = "";
    
      // 1. 都道府県の抽出
      const prefRegex = /^(北海道|東京都|京都府|大阪府|[^  ]+県)/;
      const prefMatch = fullAddress.match(prefRegex);
      if (prefMatch) {
        prefecture = prefMatch[0];
        fullAddress = fullAddress.substring(prefecture.length).trim();
      }
    
      // 2. 市区町村の抽出
      const cityRegex = /^([^\d0-9\--ー  ]+市[^\d0-9\--ー  ]+区|[^\d0-9\--ー  ]+市|[^\d0-9\--ー  ]+郡[^\d0-9\--ー  ]+(?:町|村)|[^\d0-9\--ー  ]+区|[^\d0-9\--ー  ]+町|[^\d0-9\--ー  ]+村)/;
      const cityMatch = fullAddress.match(cityRegex);
      if (cityMatch) {
        municipality = cityMatch[0];
        fullAddress = fullAddress.substring(municipality.length).trim();
      }
    
      // 3. 町名番地と建物名の分割
      const streetRegex = /^([^  ((]*?(?:(?:[0-90-9]+)(?:丁目)?|[一二三四五六七八九十〇零百千]+丁目)(?:[  ]*(?:北東|北西|南東|南西|中央|東|西|南|北|中))?(?:[ \-‐-–—―−-ーーの]?(?:[0-90-9]+))*(?:(?:番地|番|号)(?:の)?(?:[0-90-9]+)?)*)/;
      const streetMatch = fullAddress.match(streetRegex);
      if(streetMatch){
        street = streetMatch[0];
        building = fullAddress.substring(street.length).trim();
      } else {
        // 番地が見つからない場合は、建物名がないと判断
        street = fullAddress;
        building = "";
      }
    
      return [prefecture, municipality, street, building];
    }

    ステップ2:スプレッドシートでカスタム関数を実行する

    スプレッドシートに戻り、関数を使いたいセル(今回はB2セル)に、以下の数式を入力します。

    =TRANSPOSE(SPLIT_ADDRESS_V2(A2))
    C列以降には何も入力しません

    あとは、関数を使った方法と同じように、フィルハンドルをドラッグして下の行にも数式をコピーすれば完了です。

    まとめ

    今回は、Googleスプレッドシートで住所データを4つの階層に自動的に分割する方法を、「関数」と「GAS」の2つのアプローチで解説しました。

    • 手軽に試したい、コピー&ペーストで実装したい関数がおすすめ
    • より複雑な処理や、メンテナンス性を重視したいGASがおすすめ

    住所データの整理は、顧客管理やマーケティング活動の第一歩です。手作業で時間をかけるのではなく、スプレッドシートの機能を活用して、業務を効率化してみてはいかがでしょうか。

    ※Googleサービスは、Google LLC の商標であり、この記事はGoogleによって承認されたり、Google と提携したりするものではありません。