Google Apps Script 入門 登録された住所が間違いないか判定する

スポンサーリンク

登録された住所が間違いないか判定する方法

スプレットシートとGoogle Apps Script【グーグルアップススクリプト】を使用して、顧客住所一覧の住所に間違いがないかの判定をするプログラムのご紹介と解説をします。

プログラムの概要

システムなどから抽出した顧客住所一覧でA列に顧客名、B列に住所があるデータを想定し、B列の住所を値にして、ジオコーディングにより、C列に緯度 D列に経度 E列にロケーションタイプを出力します。

ローケーションタイプにより、その住所が正確かどうか判断します。E列に出力される値がROOFTOP【ルーフトップ】の場合は、住所が正しいと判断、E列に出力される値がAPPROXIMATE【アプロキシメテ】の場合は、住所があいまいと判断します。

ジオコーディングサービスを使用するときは、値だけの利用は許可されていないため、F列に地図を表示します。

注意点

住所に地区と番地以外の値が含まれているとエラーまたは、APPROXIMATE(アプロキシメテ)になります。番地の後にマンション名や部屋番号がある場合は削除してください。

顧客住所一覧から住所に間違いがないかの判定をするコードと解説

function geocode(){
  var adr_col = "B"; //住所の列の位置をアルファベットで定義
  var lat_col = "C"; //緯度(lat)の列の位置をアルファベットで定義
  var lng_col = "D"; //経度(lng)の列の位置をアルファベットで定義
  var type_col = "E";//精度(type)の列の位置をアルファベットで定義
  var map_col = "F"; //マップ画像を表示する列の位置をアルファベットで定義
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var last_row = sheet.getLastRow();
 for(var i = 2; i <= last_row; i++) {
  var address = sheet.getRange(adr_col + i).getValue();
  var geocode = Maps.newGeocoder().geocode(address);//住所からジオコーティング
  var lat = geocode.results[0].geometry.location.lat;//緯度(lat)を取得
  var lng = geocode.results[0].geometry.location.lng;//経度(lng)を取得
  var type = geocode.results[0].geometry.location_type;//精度を取得
   sheet.getRange(lat_col + i).setValue(lat);
   sheet.getRange(lng_col + i).setValue(lng);
   sheet.getRange(type_col + i).setValue(type);
  var map = Maps.newStaticMap().setSize(128, 128)
  .setCenter(lat, lng).addMarker(lat, lng).setZoom(14).setLanguage('ja')
  .setMapType(Maps.StaticMap.Type.ROADMAP);
  var url = map.getMapUrl();
   sheet.getRange(map_col + i).setFormula('=image("' + url + '", 3)');
  }
}
2行目【var adr_col = “B”;】
スプレッドシートの住所が入力されてる列を代入する変数「adr_col」を宣言してB列を代入します。データの形式により値を変更してください。


3行目【var lat_col = “C”;】
ジオコーディングの結果で取得した緯度を代入する列を代入する変数「lat_col」を宣言してC列を代入します。。データの形式により値を変更してください。


4行目【var lng_col = “D”; 】
ジオコーディングの結果で取得した経度を代入する列を代入する変数「lng_col」を宣言してD列を代入します。データの形式により値を変更してください。


5行目【var type_col = “E”;】
オコーディングの結果で取得した住所の精度を代入する列を代入する変数「var type_col」を宣言してE列を代入します。データの形式により値を変更してください。


6行目【var map_col = “F”;】
GoogleMapの画像を表示する列を代入する変数「map_col」を宣言してF列を代入します。データの形式により値を変更してください。


7行目【var ss = SpreadsheetApp.getActiveSpreadsheet();】
スプレッドシートを表すSpreadsheetApp【スプレッドシートエイピーピー】クラスのgetActiveSpreadsheet【ゲットアクティブスプレッドシート】
メソッドでアクティブなスプレッドシートを取得して、変数「ss」に代入します。


8行目【var sheet = ss.getActiveSheet();】
変数「ss」に格納されているアクティブスプレッドシートクラスのgetActiveSheet【ゲットアクティブシート】メソッドでアクティブなシートを取得して変数「sheet」に代入します。


9行目【var last_row = sheet.getLastRow();】
変数「sheet」に格納されているアクティブスプレッドシートのアクティブなシートクラスのgetLastRow【ゲットラストロウ】メソッドでデータが入力されている最後の行番号を取得して、変数「last_row」に代入します。


10行目【for(var i = 2; i <= last_row; i++) {】
for文(繰り返し処理)でカウンター変数になるi変数を宣言しています。項目行を除いた2行目から9行目で宣言したデータが入力されている最後の行数が格納されている変数「last_row」の値を変数「i」にインクリメント演算子「i++」で1つずつ加算します。


11行目【var address = sheet.getRange(adr_col + i).getValue();】
住所が入力されている列の各行をsheet【シート】クラスのgetRange【ゲットレンジ】メソッドで住所が入力されている変数「adr_col」に格納されているB列の変数「i」行を参照してRange【レンジ】クラスのgetValue【ゲットバリュー】メソッドで住所を
取得し、変数「address」に代入します。


12行目【var geocode = Maps.newGeocoder().geocode(address);】
Maps【マップス】クラスのnewGeocoder【ニュージオコーダー】メソッドで住所を地理座標に変換するジオコーダークラスを取得し、ジオコーダークラスのgeocode【ジオコード】メソッドの引数に住所が格納されている変数「address」を設定して地理座標を取得して変数「geocode」に代入します。


13行目【var lat = geocode.results[0].geometry.location.lat;】
ジオコーディングの結果の地理座標結果が格納されている、変数「geocode」の結果が配列で格納されているresult【リゾルト】オブジェクトをresults【リゾルツ】プロパティで取得して最初の要素のジオコーディングの結果で得られた地理座標などの情報が格納されているgeometry【ジオメトリー】の中の座標情報が格納されているlocation【ロケーション】の緯度情報であるlat【ラット】を取得して変数「lat」に代入します。


14行目【var lng = geocode.results[0].geometry.location.lng;】
経度情報であるlng【ラング】を取得して変数「lng」に代入します。


15行目【var type = geocode.results[0].geometry.location_type;】
緯度経度の精度であるlocation_type【ロケーションタイプ】を取得して変数「type」に代入します。
精度のタイプはROOFTOP【ルーフトップ】正確と、APPROXIMATE【アプロキシメテ】あいまいの2タイプです。


16行目~18行目
【sheet.getRange(lat_col + i).setValue(lat);
sheet.getRange(lng_col + i).setValue(lng);
sheet.getRange(type_col + i).setValue(type);】

それぞれ、取得した値をsetValueメソッドで設定した列に代入しています。


19行目~21行目
【var map = Maps.newStaticMap().setSize(128, 128)
.setCenter(lat, lng).addMarker(lat, lng).setZoom(14).setLanguage(‘ja’)
.setMapType(Maps.StaticMap.Type.ROADMAP);】

Maps【マップス】クラスの新しい静的マップを表すStaticMap【スタティックマップ】オブジェクトをnewStaticMap【ニュースタテックマップ】メソッドで取得し、StaticMap【スタティックマップ】クラスの各メソッドを使用して静的マップの大きさやタイプを指定します。
各メソッドのsetSize【セットサイズ】地図のサイズ、setCenter【セットセンター】地図の中心位置addMarker【アドマーカー】マーカの追加、setZoom【セットズーム】地図の拡大率、setLanguage【セットランゲージ】地図の言語、setMapType【セットマップタイプ】地図のタイプを
設定して、変数「map」に代入します。


22行目【var url = map.getMapUrl();】
静的マップ情報が格納されている変数「map」クラスのgetMapUrl【ゲットマップウーアールエル】メソッドでマップイメージのURLを取得して変数「url」に代入します。


23行目【sheet.getRange(map_col + i).setFormula(‘=image(“‘ + url + ‘”, 3)’);】
sheet【シート】クラスのgetRangeメソッドで静的マップを表示するセルを取得してRange【レンジ】クラスのsetFormula【セットフォーミュラー】メソッドで書式をイメージ(図)にして静的マップをセルに書き出します。

ジオーコーティングは1日あたり、2500回までと制限があります。2500件以上のデータの精度を確認する場合は、何日かに分けて作業する必要があります。また、Google Apps Scriptの1回あたりの実行時間も連続6分と制限があり、2500回のループ(繰り返し処理)は6分で終わらす、停止する場合があります。その場合は、再度実行ボタンを押してください。
スクリプトエディタの使い方はこちらをご参照ください。

以上で、住所の精度を判定するコードの解説を終了します。

スポンサーリンク

関連記事・広告