JA5CQH/4のblog ( + JO4EXC ) > 2025年 > 12月 > 15日

Google MyMaps 「公園アワードスポット」( 最終編:CSVファイル作成手順 )


たくさんの局長さんのご要望にお応えし纏めてみました …. ..( 写真:巨大な立ち木と高さ比べ )

1.はじめに

「スポット表示の定義CSVファイル」を作成するスクリプト「function_myAwardFunction」を公開します。生成物の「スポット表示の定義CSVファイル」はGoogle社の利用規約範囲での使用が可能ですが当面は個人範囲での利用を推奨します。

2.必要な準備物

1)ネット環境
2)パソコン(Windows11等)
3)GoogleChromeブラウザ(Googleアカウントでログイン)
4)アワード用csvファイル(事前に拡張子.mcsvから.csvへ変更)

・ n点盛.mcsvなどファイルも利用可能、「てんこ盛.csv」のファイル名で準備しておく

5)コピペ用のスクリプト「function_myAwardFunction」は本投稿記事内から入手する

3.作成手順

1)GoogleChromeブラウザのGoogleアプリメニューから「スプレッドシート」を選択

・ 以下、Googleスプレッドシートの画面操作へと続く

2)新しいスプレッドシートを作成「空白のスプレッドシート」を選択

・ 必要に応じて「無題のスプレッドシート」の名前変更(後で名前変更が可能)

3)メニュー「ファイル、インポート、アップロード」を選択

・ 「てんこ盛.csv」をアップロード(参照またはファイルをドラッグ)
・  インポート場所   「スプレッドシートを置換する」を選択
・  区切り文字の種類  「自動的に検出する」      を選択
・ 「□テキストを数値、日付、数式に変換する」    のチェックを外す
・ 「データをインポート」を選択しインポートを開始する

4)メニュー「拡張機能、Apps Script」でスクリプト記述の画面を表示 (ブラウザの別タブで開かれる)

・  右側の編集エリアに記述の「function myFunction(){}」を消去
・ スクリプト「function_myAwardFunction」の内容を貼り付け(コピペ)
・ スクリプトの「位置情報を取得する設定」でスポット情報を作成する範囲および条件を指定

5)編集エリアの上にあるメニュー「関数名 myAwardFunction 」を選択し「実行」を選択

・ 「承認が必要です」画面で「権限を確認」、自身の「Googleアカウント」を選択
・ 「詳細」を選択、「無題のプロジェクト(安全ではないページ)に移動」を選択
・ 「無題のプロジェクト が Google アカウントへのアクセスを求めています」を確認し「続行」を選択
・ 「実行開始」を示すメッセージが「編集エリア」の下の「実行ログ」欄に表示
・ 「実行完了」まで最大6分間待つ( 一例:約200スポットのPK岡山県は約3分で終了 )

6)「シート名:てんこ盛」の横に自動作成された「OUT_NAMEで定義したシート名のシート」を選択

・ メニュー「ファイル、ダウンロード、カンマ区切り形式(csv)」を選択
・ 「無題のスプレッドシート – SPOT_PK31.csv」を「20251231_SPOT_PK31.csv」等に名称変更し保存

7)保存したファイルはGoogleMyMapsなどで「スポット情報のCSVファイル」として利用できる

・ 先に公開の記事を参照

Google MyMaps 「公園アワードスポット」
Google MyMaps 「公園アワードスポット」( 続編:設定手順 )
Google MyMaps 「公園アワードスポット」( 続編2:てんこもり )

・ スプレッドシートの内容は、自身のクラウド「ドライブ」に自動保存されていて再利用が可能

4.公開スクリプトのソース ( function_myAwardFunction コピペ用 )

function myAwardFunction() {

// ------------  位置情報を取得する設定 ここから ---- google apps script(略 GAS)無償版は6分間の連続使用時間制限あり -----------
  const RUN_PHASE_1 = 1;          // 1: 前準備      、 0(1以外): 何もしない
  const RUN_PHASE_2 = 1;          // 1: 位置情報取得、 0(1以外): 何もしない
  const PREF_NUM    = "31";       // 岡山県
  const CSV_NAME    = "てんこ盛";  // 拡張子.mcsvを.csvに置換してインポートしたファイル名
  const AWARD_CODE  = "PK";       // アワードコード "PK": 公園アワードを指定 (先頭 半角2文字または漢字1文字) 、 "": すべて対象
  const AREATOP_ROW = 16000;      // 0以外: 抽出を行う開始行 、 0: FINDTOP_ROW で示す行から抽出
  const AREAEND_ROW = 16600;      // 0以外: 抽出を行う終了行 、 0:最終行まで抽出
  const OUT_NAME = "SPOT_PK31";   // 位置情報取得シート名(取得後にCSV形式でダウンロードしてMyMapsへインポートします)
// ------------  位置情報を取得する設定 ここまで ------------------------------------------------------------------------

  const FINDTOP_ROW = 2;
  const S2_SPOT_COL = 1;
  const S2_ADRS_COL = 2;
  const S2_LATI_COL = 3;
  const S2_LONG_COL = 4;
  const S2_JCCG_COL = 5;
  const S2_AWRD_COL = 6;
  const S2_FIND_COL = 7;
  const S1_AWRD_COL = 1;
  const S1_NAME_COL = 2;
  const S1_CODE_COL = 3;
  const S1_ADRS_COL = 4;
  // const S1_COLS = 4;
  // const S1_title = ["アワード","名称","Code","所在地"];
  const S2_COLS = 7;
  const S2_title = ["スポット名称","住所","緯度","経度","JCCG","アワード","検索ワード"];

  var spreadsheet_2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(OUT_NAME);

  if (RUN_PHASE_1 == 1){ // 1: 前準備 、 1以外: 何もしない
    var spreadsheet_1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CSV_NAME);
    if (spreadsheet_2 != null ){
      // 現在アクティブなスプレッドシートを取得
      let mySheet = SpreadsheetApp.getActiveSpreadsheet();
      // 取得したスプレッドシートでシート名を入力し、削除したいシートを取得
      let delSheet = mySheet.getSheetByName(OUT_NAME);
      // deleteSheetメソッドでシート削除を実行
      mySheet.deleteSheet(delSheet);
    }
    const newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet();
    newSheet.setName(OUT_NAME);
    spreadsheet_2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(OUT_NAME);
    spreadsheet_2.appendRow(S2_title);  //Titl  var S1_award;
    var S1_name;
    var S1_code;
    var S1_adrs;
    var S1_award;
    var S1_cord;
    var strfind;
    var topRow1;
    var endRow1;

    var endrow1 = spreadsheet_1.getLastRow();

    if (AREATOP_ROW != 0 ) topRow1 = AREATOP_ROW;
    else                   topRow1 = FINDTOP_ROW;

    if (AREAEND_ROW != 0 ) endrow1 = AREAEND_ROW;
    else                   endrow1 = FINDTOP_ROW;

    for(var i=topRow1; i<=endrow1; i++){

      S1_code  = spreadsheet_1.getRange(i,S1_CODE_COL).getValue();
      S1_award = spreadsheet_1.getRange(i,S1_AWRD_COL).getValue();
      if ((S1_code.substring(0,2)==PREF_NUM)&&((S1_award.substring(0,2)==AWARD_CODE)||(AWARD_CODE==""))){

        S1_name  = spreadsheet_1.getRange(i,S1_NAME_COL).getValue();
        S1_adrs  = spreadsheet_1.getRange(i,S1_ADRS_COL).getValue();

        strfind = S1_name + " ( " + S1_adrs + " )";
        if ((S1_award.indexOf("RS") == 0)||(S1_award.indexOf("□") == 0)){
          S2_find = "道の駅 " + strfind;
          S2_spot = "RS-" + strfind;
        } else {
          S2_find = strfind;
          S2_spot = S1_award.substring(0, 3) + strfind;
        }
        S1_code = "'" + S1_code;  // テキスト扱い強制
        spreadsheet_2.appendRow([S2_spot,"","","",S1_code,S1_award,S2_find]);   // 行追加
      }
    }
  }

  if (RUN_PHASE_2 == 1){        // 1: 位置情報取得、 1以外: 何もしない

    var lastrow2 = spreadsheet_2.getLastRow();
    for(var i=FINDTOP_ROW; i<=lastrow2; i++){
      var findword = spreadsheet_2.getRange(i,S2_FIND_COL).getValue();
      var geocoder = Maps.newGeocoder();
      geocoder.setLanguage('ja');

      var response = geocoder.geocode(findword);
      if(response['results'][0] != null){
        spreadsheet_2.getRange(i,S2_LATI_COL).setValue(response['results'][0]['geometry']['location']['lat']);
        spreadsheet_2.getRange(i,S2_LONG_COL).setValue(response['results'][0]['geometry']['location']['lng']);
        spreadsheet_2.getRange(i,S2_ADRS_COL).setValue(response['results'][0]['formatted_address']);
      }
    }
  }
}