質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

8043閲覧

GASでGoogleMAPの提示するルートの距離・時間をすべて表示させたい

coool

総合スコア29

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2022/03/01 05:30

編集2022/03/01 05:32

前提・実現したいこと

スプレッドシート上に記した地点間の距離・時間をGASで自動計算する際、
GoogleMAP上での最短距離を出したいと考えています。

例)
10km 25分 → 後述GASの結果はこちらが表示される
9km  28分 → 欲しいデータはこちら(最短距離)

そのために、下記の方法でアプローチするつもりです。

①Googleマップで提示されるルートを配列で取得
②スプレッドシート セルD列,E列に転記

計算式自体は作動しますが、ルートが一種類しか取得されません。

この場合伺いたいのは、下記2点です。

●GoogleMAP上での最短距離だけを出したい場合、ほかにいい方法はあるかどうか。
●この方法でのアプローチを続ける場合、全ルートを配列取得するためにはどうすればいいか。

GAS初心者ですので、不足している情報等ございましたらご指摘をお願い致します。
恐れ入りますがご教授のほど、宜しくお願い致します。

ABCDE
1スタートゴール移動手段距離時間
2東京タワー東京スカイツリーdrive
3
4

発生している問題・エラーメッセージ

14:13:45 お知らせ 実行開始 14:13:46 情報 1 14:13:47 情報 1 14:13:47 お知らせ 実行完了

結果

ABCDE
1スタートゴール移動手段距離時間
2東京タワー東京スカイツリーdrive10.66131.08333333
3
4

問題点
二種類のルートが出てくるため、配列の要素数は2になるはずなのに、配列の要素数は1

該当のソースコード

GAS

1var spreadSheetId = "シートID"; 2var spreadsheet = SpreadsheetApp.openById(spreadSheetId); //スプレッドシート 3var changesheet = spreadsheet.getSheetByName("MAP"); //シート名 4 5function mapQuery1(src, dest, type, result) { 6 7 var finder = Maps.newDirectionFinder() 8 .setOrigin(src) 9 .setDestination(dest) 10 .setLanguage("ja") 11 12 if (type=="highway"){ 13 finder = finder 14 .setMode(Maps.DirectionFinder.Mode.DRIVING); 15 16 } else if (type=="toll"){ 17 finder = finder 18 .setMode(Maps.DirectionFinder.Mode.DRIVING) 19 .setAvoid(Maps.DirectionFinder.Avoid.HIGHWAYS); 20 21 } else if (type=="drive"){ //今回はdriveで計算する 22 finder = finder 23 .setMode(Maps.DirectionFinder.Mode.DRIVING) 24 .setAvoid(Maps.DirectionFinder.Avoid.TOLLS) 25 .setOptimizeWaypoints(true); 26 27 } else if (type=="bicycle"){ 28 finder = finder 29 .setMode(Maps.DirectionFinder.Mode.BICYCLING); 30 31 } else if (type=="walk"){ 32 finder = finder 33 .setMode(Maps.DirectionFinder.Mode.WALKING); 34 35 } 36 37 var route = finder.getDirections().routes; 38 var length = route.length; 39 console.log(length) 40 for (let i = 0; i < length; i++) { 41 var route = finder.getDirections().routes[i]; 42 var length1 = route.legs.length; 43 //console.log(length1) 44 for (let k = 0; k < length1; k++) { 45 var value = route.legs[k]; 46 if (result=="distance"){ 47 value = value.distance.value/1000; //kilometer 48 changesheet1.getRange(2+k,4).setValue(value); 49 50 } else if (result=="duration"){ 51 value = value.duration.value/60; //minutes 52 changesheet1.getRange(2+k,5).setValue(value); 53 54 } 55 } 56 } 57 58 return value; 59 60} 61 62function MAP1(){ 63 if(changesheet1.getRange("A2").getValue() != ""){ 64 var src = changesheet1.getRange("A2").getValue(); 65 var dest = changesheet1.getRange("B2").getValue(); 66 var type = changesheet1.getRange("C2").getValue(); 67 var result = "distance" 68 mapQuery1(src, dest, type, result) 69 70 var src = changesheet1.getRange("A2").getValue(); 71 var dest = changesheet1.getRange("B2").getValue(); 72 var type = changesheet1.getRange("C2").getValue(); 73 var result = "duration" 74 mapQuery1(src, dest, type, result) 75 76 } 77 78}

分からないこと

配列routes、legsの役割

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ドキュメントを流し読みしてみました。
このページのところで

routes[] には DirectionsRoute オブジェクトの配列が格納されています。各ルートは、DirectionsRequest で指定された出発地から目的地に至る経路を示します。一般に、リクエストの provideRouteAlternatives フィールドが true に設定されている場合(このとき複数のルートが返されます)を除き、リクエストに対して返されるルートは 1 つだけです。

というのが目にとまったので、GASでprovideRouteAlternatives フィールドを制御するような関数がないか調べたところ
この関数が該当しそうということがわかりました。

なので、DirectionFinderオブジェクトの生成時に

var finder = Maps.newDirectionFinder() .setOrigin(src) .setDestination(dest) .setLanguage("ja") .setAlternatives(true) // 追加

としてやれば、複数のルートを取得できるでしょう。

たとえば距離(distance)が最短のルートを取得するのであれば、distanceで昇順ソートしてやればよいと思うので、下記のような形ではどうでしょうか。

// routeのleg[0]のdistanceで昇順ソートし先頭([0])を得る const nearestRoute = route.sort((a,b)=> a.legs[0].distance.value - b.legs[0].distance.value)[0] console.log(nearestRoute.legs[0].distance.value)

投稿2022/03/01 13:40

編集2022/03/01 13:45
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coool

2022/03/02 00:55

qnoir様 丁寧かつ迅速に教えていただき、本当にありがとうございます! 無事自分の理想の形で計算結果を出すことができました! 重ねて、本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問