前提・実現したいこと
スプレッドシート上に記した地点間の距離・時間を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
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の役割
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/02 00:55