GASで2地点間の移動距離と時間を計算!スプレッドシートで効率的に管理
Googleマップを使えば、出発地と到着地の移動距離や時間を調べられますが、2地点間の情報をスプレッドシートにまとめたいと思ったことはありませんか?
たとえば、出発地と目的地が複数パターンある場合や、移動手段(車・徒歩・自転車)ごとに時間を比較したい場合、一つ一つ確認して記録するのはとても手間がかかります。
この記事では、Google Apps Script (GAS)を使い、2地点間の移動距離と時間を一括で計算してスプレッドシートにまとめる方法をご紹介します。
完成イメージ
出発地と到着地を入力してスクリプトを実行すると、移動手段ごとの距離と時間を表示
スクリプト内のMaps.DirectionFinder で取得できる情報
今回のスクリプト内で使用するMaps.DirectionFinder
は、Google Apps Script に組み込まれたサービスで、Google Maps API を使わずに簡単にルート情報を取得することができます。
以下のような情報が得られます。
- 距離 (
distance
) -
出発地から到着地までの移動距離。
- 所要時間 (
duration
) -
出発地から到着地までの移動時間。
- 移動モード (
mode
) -
交通手段を指定して、ルート情報を取得できます。
- 車:
Maps.DirectionFinder.Mode.DRIVING
- 徒歩:
Maps.DirectionFinder.Mode.WALKING
- 自転車:
Maps.DirectionFinder.Mode.BICYCLING
- 車:
- ルート詳細情報
-
ルート全体の詳細情報を JSON 形式で取得可能です。
- 例: 各ステップごとの進む距離や曲がる方向。
今回のスクリプトでは、移動モードごとの移動距離と時間を取得しています。
手順
スプレッドシートの準備
- A列: 出発地を入力
- B列: 到着地を入力
出発地(A列)と到着地(B列)に計算したい地点をそれぞれ入力します。
C列以降にはスクリプト実行後に移動距離や時間が自動的に入力されます。(車・徒歩・自転車の順)
今回の例ではシート名を「移動計算シート」としてスクリプト実行時にシートを参照します。
シート名を変更する場合はスクリプトを調整する必要があります。
GASの実行
メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。
function myFunction(){
}
が最初から入っているため、消去して以下のスクリプトを貼り付けます。
function calculateDistancesAndTimes() {
const sheetName = "移動計算シート"; // 使用するシート名を指定
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
if (!sheet) {
throw new Error(`シート名 '${sheetName}' が見つかりません。`);
}
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues(); // A列とB列の範囲
const results = [];
data.forEach(row => {
const origin = row[0]; // A列: 出発地点
const destination = row[1]; // B列: 到着地点
if (origin && destination) {
const modes = [
{ name: "車", mode: Maps.DirectionFinder.Mode.DRIVING },
{ name: "徒歩", mode: Maps.DirectionFinder.Mode.WALKING },
{ name: "自転車", mode: Maps.DirectionFinder.Mode.BICYCLING }
];
const rowResult = [];
modes.forEach(option => {
try {
const directions = Maps.newDirectionFinder()
.setOrigin(origin)
.setDestination(destination)
.setMode(option.mode)
.getDirections();
const distance = directions.routes[0].legs[0].distance.text; // 距離 (例: "5.2 km")
let duration = directions.routes[0].legs[0].duration.text; // 時間 (例: "1 hour 15 mins")
// 時間のフォーマットを日本語に変換
duration = duration.replace("hours", "時間").replace("hour", "時間").replace("mins", "分");
rowResult.push(distance, duration); // 距離と時間を追加
} catch (e) {
rowResult.push("エラー", "エラー");
}
});
results.push(rowResult);
} else {
results.push(["入力なし", "入力なし", "入力なし", "入力なし", "入力なし", "入力なし"]);
}
});
// C列以降に結果を出力
const outputRange = sheet.getRange(2, 3, results.length, results[0].length);
outputRange.setValues(results);
}
スクリプトの説明
- シートの指定
-
function calculateDistancesAndTimes() { const sheetName = "移動計算シート"; // 使用するシート名を指定 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); if (!sheet) { throw new Error(`シート名 '${sheetName}' が見つかりません。`); }
- sheetName計算結果を記録するスプレッドシートのシート名を指定します。
- 必要に応じてシート名をご変更ください。
- シートが見つからない場合にはエラーとなります。
- データの取得
-
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues(); // A列とB列の範囲 const results = []; data.forEach(row => { const origin = row[0]; // A列: 出発地点 const destination = row[1]; // B列: 到着地点
getRange(2, 1, sheet.getLastRow() - 1, 2)
で2行目から最終行までの A列(出発地) と B列(到着地) のデータを取得します。- 1行目はヘッダー行となるためスキップします。
getValues()
で範囲内の値を2次元配列で取得します。
- 移動モードの設定
-
if (origin && destination) { const modes = [ { name: "車", mode: Maps.DirectionFinder.Mode.DRIVING }, { name: "徒歩", mode: Maps.DirectionFinder.Mode.WALKING }, { name: "自転車", mode: Maps.DirectionFinder.Mode.BICYCLING } ]; const rowResult = [];
- 車・徒歩・自転車の移動モードを指定しています。
Maps.DirectionFinder.Mode.DRIVING
:車での移動。Maps.DirectionFinder.Mode.WALKING
:徒歩での移動。Maps.DirectionFinder.Mode.BICYCLING
:自転車での移動。
- ルート情報の取得
-
modes.forEach(option => { try { const directions = Maps.newDirectionFinder() .setOrigin(origin) .setDestination(destination) .setMode(option.mode) .getDirections();
Maps.newDirectionFinder()
:Google Apps Script のルート計算機能を利用します。setOrigin(origin)
:出発地を指定。etDestination(destination)
:到着地を指定。setMode(option.mode)
:移動モード(車・徒歩・自転車)を設定。getDirections()
:指定した条件に基づいてルート情報を取得
- 距離と時間の取得
-
const distance = directions.routes[0].legs[0].distance.text; // 距離 (例: "5.2 km") let duration = directions.routes[0].legs[0].duration.text; // 時間 (例: "1 hour 15 mins")
directions.routes[0].legs[0]
:最適ルートの最初の区間の情報を取得。distance.text
:距離情報を取得します。(例:"5.2 km"
)duration.text
:時間情報を取得します。(例:"1 hour 15 mins"
)
- 時間の日本語変換
-
// 時間のフォーマットを日本語に変換 duration = duration.replace("hours", "時間").replace("hour", "時間").replace("mins", "分");
- 英語表記の時間を日本語に変換しています。
"hours"
→"時間"
"mins"
→"分"
- 例:
"1 hour 15 mins"
→"1時間15分"
- エラーハンドリング
-
rowResult.push(distance, duration); // 距離と時間を追加 } catch (e) { rowResult.push("エラー", "エラー"); } }); results.push(rowResult); } else { results.push(["入力なし", "入力なし", "入力なし", "入力なし", "入力なし", "入力なし"]); } });
- 出発地や到着地が無効だった場合、またはルートが見つからなかった場合は、エラーとして
"エラー"
を出力します。
- 出発地や到着地が無効だった場合、またはルートが見つからなかった場合は、エラーとして
- 結果の出力
-
// C列以降に結果を出力 const outputRange = sheet.getRange(2, 3, results.length, results[0].length); outputRange.setValues(results); }
sheet.getRange(2, 3, results.length, results[0].length)
:C列以降(3列目)に結果を出力。2行目から始めて、計算結果を全て書き込みます。setValues(results)
:配列形式で結果をまとめて書き込みます。
スクリプトを書いたら、名前を付けて保存します。
(例:「移動距離・時間」)
スクリプトを実行して移動距離・時間を出力します。
初めてそのスクリプトを実行する場合は権限の確認が必要です。
そのため、『権限を確認』を押します。
許可の詳細手順
「詳細」をクリックします。
「無題のプロジェクト(安全ではないページ)に移動」をクリックします。
「許可」をクリックします。
C列以降に移動距離と時間が出力されます。
注意事項
- 住所の正確さ
-
曖昧な地名だとエラーになる場合があります
まとめ
この記事では、GASを使って2地点間の移動距離と時間をスプレッドシートで簡単にまとめる方法をご紹介しました。
移動手段ごとの結果を見ることができるため時間を節約できます。
複数地点の移動距離と時間を調べる際にご活用ください。
また、過去の記事で出発地点と目的地を入力すると地図経路リンクが作成される方法も紹介しています。
こちらも併せてご活用ください。
弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。
GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。
また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。
貴方の業務改善を全力でサポートいたします。
コメント