前提・実現したいこと
スプレッドシート上に記した地点間の距離・時間をGASで自動計算する際、
GoogleMAP上での最短距離を出したいと考えています。
例)
10km 25分 → 後述GASの結果はこちらが表示される
9km 28分 → 欲しいデータはこちら(最短距離)
そのために、下記の方法でアプローチするつもりです。
①Googleマップで提示されるルートを配列で取得
②スプレッドシート セルD列,E列に転記
計算式自体は作動しますが、ルートが一種類しか取得されません。
この場合伺いたいのは、下記2点です。
●GoogleMAP上での最短距離だけを出したい場合、ほかにいい方法はあるかどうか。
●この方法でのアプローチを続ける場合、全ルートを配列取得するためにはどうすればいいか。
GAS初心者ですので、不足している情報等ございましたらご指摘をお願い致します。
恐れ入りますがご教授のほど、宜しくお願い致します。
A | B | C | D | E | |
---|---|---|---|---|---|
1 | スタート | ゴール | 移動手段 | 距離 | 時間 |
2 | 東京タワー | 東京スカイツリー | drive | ||
3 | |||||
4 |
発生している問題・エラーメッセージ
14:13:45 お知らせ 実行開始 14:13:46 情報 1 14:13:47 情報 1 14:13:47 お知らせ 実行完了
結果
A | B | C | D | E | |
---|---|---|---|---|---|
1 | スタート | ゴール | 移動手段 | 距離 | 時間 |
2 | 東京タワー | 東京スカイツリー | drive | 10.661 | 31.08333333 |
3 | |||||
4 |
問題点
二種類のルートが出てくるため、配列の要素数は2になるはずなのに、配列の要素数は1
該当のソースコード
GAS
var spreadSheetId = "シートID"; var spreadsheet = SpreadsheetApp.openById(spreadSheetId); //スプレッドシート var changesheet = spreadsheet.getSheetByName("MAP"); //シート名 function mapQuery1(src, dest, type, result) { var finder = Maps.newDirectionFinder() .setOrigin(src) .setDestination(dest) .setLanguage("ja") if (type=="highway"){ finder = finder .setMode(Maps.DirectionFinder.Mode.DRIVING); } else if (type=="toll"){ finder = finder .setMode(Maps.DirectionFinder.Mode.DRIVING) .setAvoid(Maps.DirectionFinder.Avoid.HIGHWAYS); } else if (type=="drive"){ //今回はdriveで計算する finder = finder .setMode(Maps.DirectionFinder.Mode.DRIVING) .setAvoid(Maps.DirectionFinder.Avoid.TOLLS) .setOptimizeWaypoints(true); } else if (type=="bicycle"){ finder = finder .setMode(Maps.DirectionFinder.Mode.BICYCLING); } else if (type=="walk"){ finder = finder .setMode(Maps.DirectionFinder.Mode.WALKING); } var route = finder.getDirections().routes; var length = route.length; console.log(length) for (let i = 0; i < length; i++) { var route = finder.getDirections().routes[i]; var length1 = route.legs.length; //console.log(length1) for (let k = 0; k < length1; k++) { var value = route.legs[k]; if (result=="distance"){ value = value.distance.value/1000; //kilometer changesheet1.getRange(2+k,4).setValue(value); } else if (result=="duration"){ value = value.duration.value/60; //minutes changesheet1.getRange(2+k,5).setValue(value); } } } return value; } function MAP1(){ if(changesheet1.getRange("A2").getValue() != ""){ var src = changesheet1.getRange("A2").getValue(); var dest = changesheet1.getRange("B2").getValue(); var type = changesheet1.getRange("C2").getValue(); var result = "distance" mapQuery1(src, dest, type, result) var src = changesheet1.getRange("A2").getValue(); var dest = changesheet1.getRange("B2").getValue(); var type = changesheet1.getRange("C2").getValue(); var result = "duration" mapQuery1(src, dest, type, result) } }
分からないこと
配列routes、legsの役割
まだ回答がついていません
会員登録して回答してみよう