見出し画像

【GAS】Google Apps Script 活用事例 Maps Serviceを使ってみよう!!SpreadsheetにGoogle Mapsのリンクを追加も出来ちゃう!!

先日、初めてMaps serviceを使ったスクリプトを書きました。個人的な感想としては、住所からGoogle Mapsのリンクを生成する機能が一番使い勝手が良かったです。

いろいろな機能があるようですが、Google Mapsのスマートフォンアプリはそれ自体が、とても使いやすいので、GASでそんなに頑張らなくても良いかなと思っています。

住所からGoogle Mapsのリンクを作成

function GoogleMapsUrl() {
  const maps = Maps.newGeocoder()
   .setLanguage("ja")
   .geocode('東京都港区芝公園4丁目2−8');//住所
   
   console.log(maps);
   
   const geoCode = maps.results[0];
   const addressText = geoCode.formatted_address;
   const geoData = geoCode.geometry;
   
   console.log(geoData);
   
   const latitude  = geoData.location.lat;//緯度
   const longitude = geoData.location.lng;//経度
   
   /*https://www.google.com/maps/search/?api=1&query= と緯度経度の情報を組み合わせる事で検索可能*/
   const common        = 'https://www.google.com/maps/search/?api=1&query=';
   const googleMapsUrl = common + latitude + ',' + longitude;
   
   console.log(googleMapsUrl);
}

https://www.google.com/maps/search/?api=1&query=35.6585769,139.7454506

上記のような、query= の後に、緯度経度(北緯35°、東経139°)が入ったデータがあり、このリンクをクリックすると、Google Mapsを開く事が出来ます。noteのリンクがエラーになってしまったので貼る事が出来なかったのですが、東京タワー🗼の住所です。

今は、コロナの影響で閉館してるのかな?

スクリーンショット 2020-03-20 9.17.12

.geocode('東京都港区芝公園4丁目2−8');

//.geocode(values[i][3]);

この部分は、spreadsheetのデータを読み取って、隣の列にGoogle Mapのリンクを生成したい場合は、getDataRangeで読み取って、values[i][3]みたいに書けば、OKです。

SpreadSheetにGoogle Maps のURLを書き込みたい場合

 function GoogleMapsUrl() {
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet       = spreadsheet.getSheetByName('シート名');
 const values      = sheet.getDataRange().getValues();
 const array       = [];
 
 /*見出しを省くため*/
 for(let i = 1; i < values.length; i++){
   if(values[i][0] === ''){continue}
   
   /*Maps serviceを利用して、緯度経度を取り出す*/
   const maps = Maps.newGeocoder()
   .setLanguage("ja")
   .geocode(values[i][1]);
   
   console.log(maps);
   
   const geoCode = maps.results[0];
   const addresstext = geoCode.formatted_address;
   const geoData = geoCode.geometry;
   
   console.log(geoData);
   
   const latitude = geoData.location.lat;
   const longitude = geoData.location.lng;
   
   /*https://www.google.com/maps/search/?api=1&query= と緯度経度の情報を組み合わせる事で検索可能*/
   const common      = 'https://www.google.com/maps/search/?api=1&query=';
   const googleMapsUrl = common + latitude + ',' + longitude;
   
   
   console.log(searchWords);
   array.push([googleMapsUrl]);
   
 }//for_i
 
 sheet.getRange(2, 3, array.length, array[0].length)
 .clearContent()
 .setValues(array);
}

こんな感じで、シートにリンクを追加できます。

現在、仕事は人事で新卒の採用事務をやっているのですが、大学のDBというか一覧が欲しいなと思ったので自分で作りました。文部科学省の大学一覧から情報を取得して、GASで住所から、Google Mapsのリンクを生成しています。

お手軽HYPERLINK関数でも実装できます。

=ARRAYFORMULA(IF($C$2:$C<>"",HYPERLINK("http://maps.google.co.jp/maps?q="&ENCODEURL($C$2:$C),"Google Mapsで"&$C$2:$C&"を検索する"),""))

スクリーンショット 2020-03-20 9.30.49

おそらく、ENCODEURL($C$2:$C) と上述のスクリプトのformatted_address: '日本、〒105-0011 東京都港区芝公園4丁目2−8' は、同じような役割を果たしているのではないかと推測しています。

出発地から目的地までのルートや移動距離を出力する

簡易的にルートを知りたいときとかに使えるかなぁ?.....ちょっと微妙。行きたい場所が複数あって、大体の所要時間とかを知りたい時なんかに使えるかな?

function distance(){
 
 /*出発地点と到着地点*/
 const origin      = '東京都中央区日本橋人形町2丁目6';//人形町駅
 const destination = '東京都江東区三好4丁目1-1';//東京都現代美術館
 
 const directions = Maps.newDirectionFinder()
 .setLanguage('ja')
 .setOrigin(origin)
 .setDestination(destination)
 .setMode(Maps.DirectionFinder.Mode.TRANSIT)
 .setDepart(new Date())
 .getDirections();
 const route = directions.routes[0];
 const duration = route.legs[0].duration.text;//所要時間
 const distance  = route.legs[0].distance.text;//距離
 const instructions  = route.legs[0].steps;//ルート
 
 console.log(duration);//25分
 console.log(distance);//3.3 km
 
 let words = '【所要時間】 ' + duration + '\n' + 
             '【移動距離】 ' + distance + '\n' +
             '【交通手段】 ' + '\n\n';
             
 for(let i = 0; i < instructions.length; i++){
   //    console.log(steps[i].html_instructions);
   words += '・ '+ instructions[i].html_instructions + '\n';
 }
 
 console.log(words);
}

スクリーンショット 2020-03-20 9.51.14

起点も終点も緯度経度ではない曖昧な検索のためか、移動距離や時間に変動があります。最適ルートもその時々で代わります。

静止画の地図を作る。

正直微妙〜でした。こんな感じで作れます。静止画なんで、ちょっと不便。パスを結び線を紫色から他の色に変える方法が分からず.....エンコードがどうも絡んでいるらしく難しかった.....。

.setPathStyle(4, Maps.StaticMap.Color.BLACK, Maps.StaticMap.Color.BLUE);

それらしき、メソッドがあるものの、何回やってもダメだったので降参しました....。

画像4

画像5

.setMode(Maps.DirectionFinder.Mode.TRANSIT)//公共交通機関

スクリーンショット 2020-03-20 10.18.12

スクリーンショット 2020-03-20 10.20.05

Google Documentに地図と、その所要時間を記載する

function insertMap(){
 
 /*出発地点と到着地点*/
 const origin      = '〒260-0031 千葉県千葉市中央区新千葉1丁目1';
 const destination = '東京都江東区三好4丁目1-1';
 
 const directions = Maps.newDirectionFinder()
 .setLanguage('ja')
 .setOrigin(origin)
 .setOptimizeWaypoints(true)
 //.addWaypoint('JR船橋駅')//経由点?、しかし、これを入れるとエラーになってしまう事が多発
 .setDestination(destination)
 .setMode(Maps.DirectionFinder.Mode.TRANSIT)//公共交通機関
 .setDepart(new Date())
 .getDirections();
 const route = directions.routes[0];
 const duration = route.legs[0].duration.text;//所要時間
 const distance  = route.legs[0].distance.text;//距離
 const instructions  = route.legs[0].steps;//ルート
 
 console.log(duration);//25分
 console.log(distance);//3.3 km
 
 let words = '【所要時間】 ' + duration + '\n' + 
             '【移動距離】 ' + distance + '\n' +
             '【交通手段】 ' + '\n\n';
             
 for(let i = 0; i < instructions.length; i++){
   //    console.log(steps[i].html_instructions);
   words += '・ '+ instructions[i].html_instructions + '\n';
 }
 
 console.log(words);

 const map = Maps.newStaticMap()
 .setLanguage("ja")
 .addMarker(origin)
 .addMarker(destination)
 //.setMapType(Maps.StaticMap.Type.SATELLITE)//衛星写真
 .addPath(route.overview_polyline.points)
 .setSize(600, 400)
 .setZoom(15)
 .addVisible(origin)
 .addVisible(destination);
 
 // Save the map to your drive
 const folder = DriveApp.getFolderById('******************');
 const mapPicture = folder.createFile(Utilities.newBlob(map.getMapImage(), 'image/png', 'map.png'));
 
 const newDocument   = DocumentApp.create('Google Maps');
 const docId         = newDocument.getId();
 const document      = DocumentApp.openById(docId);
 document.insertImage(0, mapPicture);
 
 const body            = document.getBody();
 const insertParagraph = body.appendParagraph(words);
}

スクリーンショット 2020-03-20 10.10.28

んー微妙.......Google Document作っても、なぁ.....。印刷よりもアプリの方が遥かに便利だしなぁ.....。setZoomで、倍率を選択できるのですが、横や縦が足りないと、出発地点から目的地までの地図がはみ出てしまいます。

何度も試してみたところ、setZoomは、電車などの公共交通機関で都内を移動するような場合であれば、大体15〜18くらいの間くらいがちょうど良い事がわかりました。

東京都から飛行機で沖縄とかに行くような移動距離が長く、列島を俯瞰してみたいような場合であれば、setZoomが10くらい?距離を把握していない方が良いドライブもありそう。事前に距離が分かると、うわぁ....と思っちゃうな。

画像10

スクリーンショット 2020-03-20 10.14.26

ストリートビューを取れるメソッドは、今の所、ないと思います。ただし、高度が取得出来たり、高速道路を避けて、掛かる時間が計算出来たりするので、そのうち追加されるかもしれませんね!!


この記事が気に入ったらサポートをしてみませんか?