GASのMapsで住所を緯度経度に変換し
距離を測る方法

GASのMapsサービス(住所や地図を扱う組み込みサービス)を使うと、住所を緯度経度に変換したり、2地点間の距離・所要時間を求めたりできます。APIキーなしで動くコードで解説します。

|対象: GAS / Mapsサービス / ジオコーディング

Table of Contents

Mapsサービスでできること

GASにはMapsという組み込みサービス(地図や住所を扱う機能群)があり、APIキーなしで住所や地図の処理ができます。主な用途は次の3つです。

ジオコーディング

住所文字列を緯度・経度の座標に変換する(配送先の地図表示や集計に)

逆ジオコーディング

緯度・経度から住所を求める(GPSログや位置データの住所化に)

ルート・距離計算

2地点間の道のり距離と所要時間を求める(交通費精算や訪問計画に)

地図画像の生成

指定地点の地図を画像として作り、資料やメールに添付する

これらはスプレッドシートに溜まった住所データと相性がよく、手作業では大変な「住所→座標」「拠点間の距離」の一括処理を自動化できます。

住所を緯度経度に変換する(ジオコーディング)

基本はMaps.newGeocoder().geocode(住所)です。戻り値のstatusが「OK」のときだけ座標を取り出し、失敗時はnullを返すようにしておくと安全です。

// 住所を緯度経度に変換する(ジオコーディング)
function geocodeAddress(address) {
  const geocoder = Maps.newGeocoder().setLanguage("ja");
  const response = geocoder.geocode(address);

  // status が "OK" 以外なら変換失敗(ZERO_RESULTS など)
  if (response.status !== "OK" || response.results.length === 0) {
    Logger.log("住所が見つかりませんでした: " + address);
    return null;
  }

  const result = response.results[0];
  const location = result.geometry.location;
  return {
    lat: location.lat,                    // 緯度
    lng: location.lng,                    // 経度
    formatted: result.formatted_address,  // 正規化された住所
  };
}

function testGeocode() {
  const geo = geocodeAddress("東京都千代田区丸の内1-9-1");
  Logger.log(geo); // { lat: 35.68..., lng: 139.76..., formatted: "..." }
}

setLanguage("ja")を付けると、返ってくる正規化住所(formatted_address)が日本語になります。

緯度経度から住所を求める(逆ジオコーディング)

GPSログやスマホから取得した座標を住所に直したいときはreverseGeocode(lat, lng)を使います。引数の順番は「緯度, 経度」です。

// 緯度経度から住所を求める(逆ジオコーディング)
function reverseGeocode(lat, lng) {
  const geocoder = Maps.newGeocoder().setLanguage("ja");
  const response = geocoder.reverseGeocode(lat, lng);

  if (response.status !== "OK" || response.results.length === 0) {
    return null;
  }
  return response.results[0].formatted_address;
}

function testReverse() {
  const address = reverseGeocode(35.6812, 139.7671);
  Logger.log(address); // "日本、〒100-... 東京都千代田区..."
}

2地点間の距離・所要時間を求める

Maps.newDirectionFinder()は、出発地と目的地を指定して実際のルートに沿った道のり距離と所要時間を返します。setModeで車・徒歩・公共交通機関を切り替えられます。距離はメートル、時間は秒で返るので、使いやすい単位に変換します。

// 2地点間の距離・所要時間を求める
function getRoute(origin, destination) {
  const finder = Maps.newDirectionFinder()
    .setOrigin(origin)             // 出発地(住所でも "緯度,経度" でも可)
    .setDestination(destination)   // 目的地
    .setMode(Maps.DirectionFinder.Mode.DRIVING) // 車。WALKING/TRANSIT なども指定可
    .setLanguage("ja");

  const directions = finder.getDirections();
  if (!directions.routes || directions.routes.length === 0) {
    return null;
  }

  // legs[0] に距離と時間が入る
  const leg = directions.routes[0].legs[0];
  return {
    distanceKm: Math.round((leg.distance.value / 1000) * 10) / 10, // m → km
    durationMin: Math.round(leg.duration.value / 60),              // 秒 → 分
  };
}

function testRoute() {
  const route = getRoute("東京駅", "横浜駅");
  Logger.log(route); // { distanceKm: 30.x, durationMin: 50 前後 }
}

出発地・目的地は住所文字列でも「緯度,経度」の文字列でも指定できます。交通費精算や訪問ルートの見積もりに使えます。

住所一覧を一括で緯度経度に変換する

スプレッドシートに並んだ住所を一気に座標化する実務パターンです。A列の住所を読み取り、B列・C列に緯度・経度を書き戻します。 1行ずつsetValueせず、 最後にsetValuesで一括書き込みするのが高速化のコツです。

// スプレッドシートの住所一覧を一括で緯度経度に変換する
// A列:住所  B列:緯度  C列:経度
function geocodeSheet() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("住所一覧");
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  const addresses = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
  const output = [];

  addresses.forEach((row) => {
    const address = String(row[0]).trim();
    if (!address) {
      output.push(["", ""]);
      return;
    }
    const geo = geocodeAddress(address);
    output.push(geo ? [geo.lat, geo.lng] : ["取得失敗", ""]);
    Utilities.sleep(200); // クォータ対策で少し間隔をあける
  });

  // B列・C列にまとめて書き戻す(1回のsetValuesで高速化)
  sheet.getRange(2, 2, output.length, 2).setValues(output);
}

Utilities.sleep(200)で呼び出しの間隔をあけ、クォータ(後述)に一気に達するのを防いでいます。

地図画像を生成して保存する

Maps.newStaticMap()を使うと、指定した地点の地図を1枚の画像として生成できます。作った画像はBlob(バイナリデータ)として取り出せるので、Drive保存やメール添付、スプレッドシートへの挿入に使えます。

// 緯度経度から地図画像を作ってDriveに保存する
function saveStaticMap(lat, lng) {
  const map = Maps.newStaticMap()
    .setSize(600, 400)     // 画像サイズ(px)
    .setZoom(15)           // ズームレベル(大きいほど拡大)
    .setCenter(lat, lng)
    .addMarker(lat, lng);  // 中心にピンを立てる

  const blob = map.getBlob().setName("map.png");
  const file = DriveApp.createFile(blob);
  Logger.log("地図を保存しました: " + file.getUrl());
  return file.getUrl();
}

取り出したBlobはMailApp.sendEmailの添付やinsertImageでのシート挿入にもそのまま渡せます。

実務での注意点(クォータと精度)

1. 1日あたりの利用回数に上限がある

Mapsサービスにはジオコーディングやルート計算の1日あたりの呼び出し上限(クォータ)があります。数百件を超える一括処理では、処理済み行のスキップ・sleepでの間隔調整・日をまたいだ分割実行を組み合わせるのが安全です。上限を超えると例外が発生して処理が止まります。

2. 大量・商用利用は有料APIキーを検討する

恒常的に大量処理が必要な場合や商用サービスに組み込む場合は、Google Maps Platformの有料APIキーをsetAuthenticationで設定し、上限を引き上げるのが現実的です。利用規約や料金体系を事前に確認してください。

3. 住所の精度は入力データに左右される

建物名や部屋番号が混ざった住所、番地の表記ゆれは変換精度を下げます。変換前にtrimや不要文字の除去で整え、statusが「OK」でない住所は別列に記録して人が確認できるようにしておくと、取りこぼしを防げます。

まとめ

GASのMapsサービスを使えば、住所→緯度経度の変換、その逆引き、2地点間の距離・所要時間の計算、地図画像の生成までAPIキーなしで実装できます。 スプレッドシートの住所一覧と組み合わせれば、配送先の地図化や交通費の自動計算といった実務を大きく効率化できます。 あとはクォータと入力データの精度に気を配れば、安定した自動処理が組めます。

よくある質問

基本的な利用ならAPIキーは不要です。GASのMapsサービス(Maps.newGeocoderなど)はGoogle Apps Scriptに組み込まれており、そのまま呼び出せます。ただし1日あたりの利用回数に上限(クォータ)があり、大量に呼ぶ場合はGoogle Maps Platformの有料APIキーをsetAuthenticationで設定して上限を引き上げる必要があります。

「東京都千代田区丸の内1-1」のような住所文字列を、緯度(lat)と経度(lng)という地図上の座標に変換することを指します。これをジオコーディング(geocoding)と呼びます。座標に変換すると、地図へのマーカー表示や2地点間の距離計算ができるようになります。

newDirectionFinderで求める距離は、指定した移動手段(車・徒歩など)の実際のルートに沿った道のりです。setModeで移動手段を切り替えると距離も変わります。一方で緯度経度から直線距離を計算すると道路を無視した最短距離になるため、用途に合わせて使い分けてください。

geocodeの戻り値のstatusが「OK」以外(ZERO_RESULTSなど)の場合は変換できていません。番地の表記ゆれや建物名の混在が原因になりやすいため、変換前に前後の空白除去や不要な文字の削除を行い、失敗した住所はログや別列に記録して後から人が確認できるようにするのがおすすめです。

1日あたりの呼び出し回数に上限があるため、数百件を超える場合はUtilities.sleepで間隔をあけ、処理済みの行はスキップする設計にします。件数が非常に多いときは日をまたいで分割実行するか、有料APIキーの設定を検討してください。

GAS開発・業務Webシステムを
相談する。

住所の地図化や距離計算のほかにも、フォーム連携・帳票出力・Gmail自動化など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る