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 と提携したりするものではありません。