5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Googleマップの場所の情報を取得ツールを作成しました(Googleマップ+Googleスプレッドシート+Google Places API)

Last updated at Posted at 2019-09-26

目的

Google Apps ScriptとGoogle Maps Platformの勉強のため、GoogleスプレッドシートとGoogle Maps PlatformPlaces APIを用いて、検索施設名から場所の情報(Googleマップの住所や座標、施設名称等)を取得するツールを作成してみました。

Places API

  • 今回は、Google Maps Platformの中でも「プレイス」に分類される「Places API」を使用しています。
  • Places APIは、HTTP リクエストを使用して、多くの場所の最新情報を取得できます。

Google Apps Script

  • Google Apps Scriptは、Google社が提供するJavaScriptベースのプログラミング言語であり、クラウドサーバ上で動作します。
  • Gmail、Googleスプレッドシート、Googleカレンダー、Googleドライブ、Google翻訳などのGoogleが提供する数々のアプリケーション群をプログラミングにより操作可能です。

実行環境

この記事ではGoogle Apps Scriptを使っています。
コードを実行するためにはGoogle Maps PlatformのAPIキーが必要です。

※Google Maps Platform APIキーの取得・発行についてはこちらを参照してください。
https://www.zenrin-datacom.net/business/gmapsapi/api_key/index.html

前提条件

道の駅のリスト

  • 場所の情報(住所や座標、施設名称等)を取得する対象は、「道の駅の駅名(全国1,160駅)」を対象としました。
  • 道の駅のリストは、以下よりエクセル形式がダウンロードできます。
  • 「道の駅」一覧
  • 上記のリストには、所在地が記載されていますが、市町村までの記載のため、場所の特定が困難です。
  • そこで、道の駅の駅名をもとに、Places APIを用いて、場所の情報(住所や座標、施設名称等)を取得します。

実行方法

入力設定

  • Googleスプレッドシートに駅名を入力します。
  • 駅名は、A列に入力してください。
  • 駅名は、場所の情報の取得を上手く行うために、もとの駅名に「道の駅」という文字を付加し、余計なスペースを削除しています。
  • シート名は「List」に変更してください。
list.PNG

実行

  • Googleスプレッドシートのツール>スクリプトエディタを開いて、下記のソースを貼り付けます。
  • "APIキーを入力してください"のところに、APIキーを入力してください。
  • 「関数を選択」を「Main」にしてスクリプトを実行してください。
  • Googleスプレッドシートへのアクセス権の確認画面が出ますので許可してください。
gas1.gs
//基本的な設定
//**********************************************************************************************
// APIKEYを設定する
var APIKEY = "APIキーを入力してください" // APIキー
//**********************************************************************************************

var InputText;      // インプットテキスト
var ArrInputList;   // インプットリスト
var LastRow;        // 最終行

//**********************************************************************************************
// Main関数
//**********************************************************************************************
function Main() {  
  // インプットリストを設定する
  SetInputList();
  
  // 戻り値を格納する配列
  var ArrRes = [];
  for (var i = 0; i <= LastRow-2; i++) {
    
    // PlacesAPI関数によるname,formatted_address,lat,lngの取得
    var data = PlacesAPI(ArrInputList[i][0], APIKEY);
    
    // 戻り値を配列に格納する
    ArrRes[i] = [];
    ArrRes[i][0] = data[0]; // name
    ArrRes[i][1] = data[1]; // formatted_address
    ArrRes[i][2] = data[2]; // lat
    ArrRes[i][3] = data[3]; // lng
  }
  // 結果をスプレッドシートに出力する
  var bk = SpreadsheetApp.getActiveSpreadsheet();  // アクティブなスプレッドシートを取得する
  var sh = bk.getSheetByName('List');            // Listシートを取得する
  
  for (var i = 0; i <= LastRow-2; i++) {
    // 値をセルに入力する
    sh.getRange(i + 2, 2).setValue(ArrRes[i][0]);  // name
    sh.getRange(i + 2, 3).setValue(ArrRes[i][1]);  // formatted_address
    sh.getRange(i + 2, 4).setValue(ArrRes[i][2]);  // lat
    sh.getRange(i + 2, 5).setValue(ArrRes[i][3]);  // lng
  }  
}

//**********************************************************************************************
// インプットリストを作成する関数
//**********************************************************************************************
function SetInputList() {
  // addressシートの内容を配列に格納する
  var bk = SpreadsheetApp.getActiveSpreadsheet();             // アクティブなスプレッドシートを取得する
  var sh = bk.getSheetByName('List');                       // Listシートを取得する
  LastRow = sh.getLastRow();                                  // 最終行を取得する
  // var colLst = sh.getLastColumn();                         // 最終列を取得する
  
  Logger.log(LastRow);
  
  // データを配列に格納する
  // Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
  ArrInputList = sh.getRange(2, 1, LastRow-1, 1).getValues();

  Logger.log(ArrInputList);
}

//**********************************************************************************************
// PlacesAPIを実行する関数
//**********************************************************************************************
function PlacesAPI(InputText, APIKEY){
  // URLを作成する
  var url = "https://maps.googleapis.com/maps/api/place/findplacefromtext/json?language=ja" +
            "&input=" + InputText +             // for example, a name, address, or phone number
            "&inputtype=textquery" +                    // textquery or phonenumber
            "&fields=formatted_address,geometry,name" + // fields
            "&key=" + APIKEY;                           // API key
  
  Logger.log(url);
  
  // HTTPリクエストを行う
  var res  = UrlFetchApp.fetch(url,{muteHttpExceptions:true});
  Logger.log(res); 
  
  // HTTPレスポンスを文字列として取得、JSON形式の文字列を解析してオブジェクトとして返す
  var json = JSON.parse(res.getContentText()); 
  Logger.log(json);
  
  if (json["status"] == "OK") {
    var json_formatted_address = json["candidates"][0]["formatted_address"];
    var json_lat = json["candidates"][0]["geometry"]["location"]["lat"];
    var json_lng = json["candidates"][0]["geometry"]["location"]["lng"];    
    var json_name = json["candidates"][0]["name"];
    
    // 「日本、」「郵便番号」を除外
    var formatted_address = json_formatted_address.split(' ');
    
    return [json_name,formatted_address[1],json_lat,json_lng];
    
  } else {
    //"status"が"OK"以外は空白として返却する
    return ["","","",""]
  }
}

実行結果

  • 実行結果は、B列にname(施設名称)、C列にformatted_address(住所)、D列にlat(緯度)、E列にlng(経度)が出力されます。
  • formatted_addressに含まれる「日本」や「郵便番号」は除外しています。
list2.PNG

留意事項

参考書

詳解! GoogleAppsScript完全入門 ~GoogleApps & G Suiteの最新プログラミングガイド~
Developer Guide(Geocoding API)

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?