Googleアカウントは多くの人が持っていると思いますが、Googleスプレッドシート(これ以降スプレッドシートと書きます)やGメール、グーグルドライブなどのGoogleアプリをJava Scriptで操作できるGoogle Apps Scriptを使っている人はそれほど多くはないと思います。
最近「Googleスプレッドシートに測定データをアップロード」という記事を書いたついでにGoogle Apps Scriptで面白い使い方ができないか調べていました。Googleといえば「ググる」という言葉が辞書に採用されるほど検索に強い、Googleマップもストリートビューでプライバシー問題を起こしながらも便利に使われています。そこで、この二つを結びつけるアプリをGoogle Apps Scriptを使って作ることにしました。DOKORAという名前にしましたが、適当なキーワードで検索した施設、お店などの緯度・経度、住所と周辺の地図を数種類の拡大率でGoogleスプレッドシートに作成するスクリプトです。
「手がかり」セルの隣に検索キーワードを入力して「どこら?」と書かれたボタンを押します。手がかりが十分であれば緯度・経度、郵便番号と住所が表示され、倍率の異なる4枚のGoogleマップで作られた画像が表示されます。
DOKORAを使ってみる方法を説明します。 ”検索して地図表示240610”というスプレッドシートファイルですが、スプレッドシートはオンラインのWebアプリケーションなので、共有してからご自分のGoogleドライブにコピーして使うことになります。
① ご自分のGoogleアカウントでGoogleドライブを開きます。
② 以下の共有ファイルへのリンクをクリックして”検索して地図表示240610”を開きます。
共有ファイルへのリンク
③ ファイルメニューから”コピーを作成”を選択すると、Googleドライブに”検索して地図表示240610のコピー”ができます。普通のファイルならダウンロードして開けば良いところですがとても面倒です。
Google Apps Scriptで作成されたプログラム(Script)はファイルの参照、編集、作成、削除ができるため、Googleアカウントを持っている人の許可を確認してから実行されます。何気なく許可がされないように若干くどくて分かりにくい確認手順になっています。一度確認すればその後は確認を求められなくなります。面倒ですが、自分でGoogle Apps Scriptを作成したときにも同様の確認が行われますので直に慣れると思います。
最初のウィンドウですが、自分のアカウントを選択します。
以下のウィンドウが分かりにくいのですが、左下の”詳細”をクリックします。秘密の通路のようなものです。
左下の”DokaraScript(安全ではないページ)に移動”をクリックします。//Scriptの名前をDokoraScriptにするつもりでしたが、間違えてDokaraScriptになってしまいました。
許可をクリックします。
使えるようになるまでの道のりが長い。
DokaraScriptでは次のような処理を行なっています。
① 前回の検索結果をクリア・削除します。
② スプレッドシートから”施設名”を読み取り、緯度・経度を求めて、スプレッドシートに記入する。[ジオコーディング]
③ スプレッドシートから緯度・経度を読み取り、郵便番号と住所を求めて、スプレッドシートに記入する。[逆ジオコーディング]
④ 緯度・経度を中心にした4種類の地図を作成して、スプレッドシートに貼り付ける。[roadmap :道路地図ビュー、satellite :Google Earth の衛星画像、hybrid :通常ビューと衛星画像ビューの複合ビュー、terrain :地形情報に基づいた物理地図]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
function dokora() { const FACILITY_ROW = 2; const FACILITY_COL = 6; const DATA_ROW = 11 const LAT_COL = 2; const LNG_COL = 3; const PCODE_COL = 5; const ADDR_COL = 6; //GeoCodeという名前のシートを操作します var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dokora'); //console.log(facility) let images = spreadsheet.getImages(); var imageCount = images.length; for(var i=0; i < imageCount; i++ ){ images[i].remove(); } spreadsheet.getRange(DATA_ROW, LAT_COL, 1, 5).clearContent(); var facility = spreadsheet.getRange(FACILITY_ROW,FACILITY_COL).getValue(); var geocoder = Maps.newGeocoder(); geocoder.setLanguage('ja'); var response = geocoder.geocode(facility); console.log(response['results'][0]) if(response['results'][0] != null){ spreadsheet.getRange(DATA_ROW,LAT_COL).setValue(response['results'][0]['geometry']['location']['lat']); spreadsheet.getRange(DATA_ROW,LNG_COL).setValue(response['results'][0]['geometry']['location']['lng']); } else { //console.log('見つけられなかった'); Browser.msgBox('見つけられませんでした'); return; } var latitude = spreadsheet.getRange(DATA_ROW,LAT_COL).getValue(); //B列の緯度を取得 var longitude = spreadsheet.getRange(DATA_ROW,LNG_COL).getValue(); //C列の経度を取得 if(latitude!='' && longitude!=''){ var response = geocoder.reverseGeocode(latitude, longitude); // 緯度、経度から情報を取得 if(response['results'][0] != null){ var myAddress = response['results'][0]['formatted_address']; var posPostCode = myAddress.indexOf('〒'); var posCode = myAddress.substring(posPostCode, posPostCode + 9); var address = myAddress.substring(posPostCode +10); var posGabage = address.indexOf(' '); if(posGabage>0){ address = address.substring(0,posGabage); } spreadsheet.getRange(DATA_ROW,PCODE_COL).setValue(posCode); spreadsheet.getRange(DATA_ROW,ADDR_COL).setValue(address); } } var map1 = Maps.newStaticMap() .setLanguage('ja') .setSize(470,600) .setZoom(10) //.setType(Maps.StaticMap.Type.SATELLITE) .setMapType(Maps.StaticMap.Type.HYBRID) .setCenter(latitude, longitude) .addMarker(latitude, longitude); spreadsheet.insertImage(map1, 1, 13); var map2 = Maps.newStaticMap() .setLanguage('ja') .setSize(600,600) .setZoom(14) //.setType(Maps.StaticMap.Type.SATELLITE) .setMapType(Maps.StaticMap.Type.HYBRID) .setCenter(latitude, longitude) .addMarker(latitude, longitude); spreadsheet.insertImage(map2, 6, 13); var map3 = Maps.newStaticMap() .setLanguage('ja') .setSize(470,600) .setZoom(16) //.setType(Maps.StaticMap.Type.SATELLITE) .setMapType(Maps.StaticMap.Type.ROADMAP) .setCenter(latitude, longitude) .addMarker(latitude, longitude); spreadsheet.insertImage(map3, 1, 42); var map4 = Maps.newStaticMap() .setLanguage('ja') .setSize(600,600) .setZoom(18) //.setType(Maps.StaticMap.Type.SATELLITE) .setMapType(Maps.StaticMap.Type.HYBRID) .setCenter(latitude, longitude) .addMarker(latitude, longitude); spreadsheet.insertImage(map4, 6, 42); } |
参考にさせていただいたサイトは多々ありますが、記録に残さなかったので誠に申し訳ない。