Google Apps Script : 住所を分割するスクリプト

Google Apps Script : 住所を分割するスクリプト

2024年1月30日

住所を入力するときは1つのセルで書くほうが楽なのですが、集計するときはセルが分割されていると便利。
ということで、困っている人がいたのでGoogle Apps Scriptで分離できるようにしました。

Google Apps Script

A列に都道府県から始まる住所があり、それを下記のように分割して表示します。
B列:都道府県
C列:市または区
D列:それ以降
という感じです。
住所の並びはほぼ市区町村ですが、東京都は都道府県の後に区になるので特別処理が必要です。

function splitAddress(address) {
  if (!address || address.trim() === "") {
    return ["", "", ""];
  }

  var prefectures = ["北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県",
                     "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県",
                     "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", 
                     "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", 
                     "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", 
                     "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", 
                     "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"];
  var prefecture = prefectures.find(pref => address.startsWith(pref));
  if (!prefecture) {
    return ["", "", address]; // 都道府県が見つからない場合
  }

  var remainingAddress = address.split(prefecture)[1].trim();
  var cityRegex;

  // 東京都の場合の特別な処理
  if (prefecture === "東京都") {
    cityRegex = /区/;
  } else {
    cityRegex = /市|区|町|村/;
  }

  var cityIndex = remainingAddress.search(cityRegex);
  if (cityIndex >= 0) {
    var city = remainingAddress.substring(0, cityIndex + 1); // 市区町村の名前を取得
    var restAddress = remainingAddress.substring(cityIndex + 1).trim(); // それ以降の住所
    return [prefecture, city, restAddress];
  } else {
    return [prefecture, "", remainingAddress];
  }
}

function splitAddressesInSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  var addresses = sheet.getRange(1, 1, lastRow, 1).getValues();

  for (var i = 0; i < addresses.length; i++) {
    var address = addresses[i][0];
    var split = splitAddress(address);

    sheet.getRange(i + 1, 2).setValue(split[0]); // B列に都道府県
    sheet.getRange(i + 1, 3).setValue(split[1]); // C列に市区町村
    sheet.getRange(i + 1, 4).setValue(split[2]); // D列にそれ以降の住所
  }
}