見出し画像

施設名から住所を取得しようとしたらつまずいた話(SpreadSheet+GAS)

やりたかったこと


 生データに施設名のみ存在。施設名から住所を取得したかった。ただ、当該データは数百個あり、ひとつひとつ検索して調べるのは骨が折れる。

 Google Apps Script(以下、GAS)およびGoogle Sheets(以下、スプレッドシート)を用いて自動取得する方法を発見。

 しかしながら、早速上記サイトを参考に試してみたがいずれも上手くできず。


つまずいたところ


 GASにてコーディングののち実行するとなぜかエラー(サンプルコードは後述)。

エラー	
TypeError: Cannot read properties of null (reading 'getLastRow')
geocoder	@ コード.gs:7

 エラー文を読むと、スプレッドシート内のシートを読み込む最初の段階でエラーが吐かれていることがわかる。
 なぜシートが読み込まれないのかがわからず四苦八苦。
 とりあえずエラー文をググってみる。

 同様の事例を発見。閲覧数4,355(記事作成時点)。困ってる人結構いるのかな?

 しかしベストアンサーを見ても解決には至らず。
 その後、ChatGPTに尋ねてみたがこちらも解決には至らず。


解決方法


var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('hogehoge');


 上記部分の'hogehoge'にファイル名を入れて実行していたことがエラー発生の原因だった。
'hogehoge'にはシート名を入れる(もちろんシート名はシングルクォーテーションで囲む)。

シート指定するんだからシート名が必須だろと思い返せば当たり前の話だが、なぜかファイル名を入れてしまい困り果てていた。
これでなんとか実行できた。


サンプルコード


function geocoder() {
 const START_ROW = 2;
 const FACILITY_COL = 1;
 const ADDRESS_COL = 2;
 
 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('**YOUR SHEET NAME**');
 var lastrow = spreadsheet.getLastRow();
  
 for(var i=START_ROW; i<=lastrow; i++){
   var facility = spreadsheet.getRange(i,FACILITY_COL).getValue();
  
   var geocoder = Maps.newGeocoder();
   geocoder.setLanguage('ja');
  
   var response = geocoder.geocode(facility);
    
   if(response['results'][0] != null){
     spreadsheet.getRange(i,ADDRESS_COL).setValue(response['results'][0]['formatted_address']);
   }

 }

}
  1.  スプレッドシート内、拡張機能>Apps ScriptよりGASを開く。

  2.  上記サンプルコードをコピペ(**YOUR SHEET NAME**をシート名に変更する)。

  3.  スプレッドシート内についてはあらかじめ、A2、A3、A4…セルに住所を取得したい施設名を打ち込んでおく(A1セルは見出しとして使う。施設名等と入力しておくとわかりやすい)。

  4.  開いたGASより実行*1をすると、スプレッドシート内のB2、B3、B4…セルに住所が自動で出力される。

 コードは冒頭で紹介したサイトのものを参考にしました。感謝します。


出力結果


出力結果(元データは適当なため結果については精査してません)

 施設名に不備があると住所が返されない。ただ生データがそこそこしっかりしてれば9割9分なにかしら返される。
 GoogleMapsのマイマップを使えば、作成したデータをインポートしてマッピングすることも可能(擬似GIS?)。

*1 初回は権限云々の許可が要求される。

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