-----
・追記(2022-2-10)
Web APIを作成しました → 「最新のアメダスのデータを JSON 形式で取得する Web API を作りました。」
-----
現在、アメダスのデータはJSON形式でAPIチックに提供されるようになっているので、よりシンプルなデータの取得が可能になっています。(気象庁としては、あくまでもAPIではないらしいのですが。)
今回は、GASで小名浜のアメダスのデータを取得して、スプレッドシートに保存できるようにしてみます。
※ 相変わらず、動けばいいやの精神で作っておりますので、どうぞよろしくお願いいたします。
① 取得するアメダスのデータの確認
まずは観測所番号を確認します。
小名浜の場合ですと、上のアメダスのページより「都道府県」→「福島県」→「小名浜」と選択します。表示されるURLの「36846」の部分が小名浜の観測所番号になります。
https://www.jma.go.jp/bosai/amedas/#amdno=36846&area_type=offices&area_code=070000&format=table1h&elems=53414
10分毎のアメダスのデータを格納したJSONは、以下の形式のURLから取得できます。「yyyyMMddHHmm」の部分は10分刻みの年月日時分です(分の後ろにゼロが2つあります)。
https://www.jma.go.jp/bosai/amedas/data/map/yyyyMMddHHmm00.json
このJSONには全国の観測所のデータが含まれるため、小名浜のデータのみを抽出してスプレッドシートに記録します。
ちなみに、以下のJSONには全国の観測所のデータが格納されいます。ひと手間加えれば任意の観測所のデータを取得するアプリケーションなんかも作れそうですね。また今度。
https://www.jma.go.jp/bosai/amedas/const/amedastable.json
② スプレッドシートの準備
取得したデータを記録するスプレッドシートを準備します。
観測所によって取得できるデータの種類が異なるため確認が必要です。試しに、現在の10~20分前の日時でURLを手作りしてアクセスしてみます。(過去分については1週間分程度アクセス可能なようです。)
https://www.jma.go.jp/bosai/amedas/data/map/20220203123000.json
小名浜のデータは以下になります。(該当箇所は観測所番号で検索すると簡単に探せます。)
"36846":{"pressure":[1012.0,0],"normalPressure":[1012.6,0],"temp":[8.6,0],"humidity":[51,0],"visibility":[20000.0,0],"sun10m":[4,0],"sun1h":[0.8,0],"precipitation10m":[0.0,0],"precipitation1h":[0.0,0],"precipitation3h":[0.0,0],"precipitation24h":[0.0,0],"windDirection":[6,0],"wind":[2.7,0]}
含まれるデータは13種類だと分かりました。
1. pressure:現地気圧
2. normalPressure:海面気圧
3. temp:温度
4. humidity:湿度
5. visibility:水平視程
6. sun10m:日照時間(前10分)
7. sun1h:日照時間(前1h)
8. precipitation10m:降水量(前10分)
9. precipitation1h:降水量(前1h)
10. precipitation3h:降水量(前3h)
11. precipitation24h:降水量(前24h)
12. windDirection:風向
13. wind:風速
-----
追記(2022-2-10)
「snow12h」,「snow1h」,「snow24h」,「snow6h」,「weather」の5種類が追加されるタイミングもあるようです。雪が降った時のみでしょうか?
-----
スプレッドシートには、1行目に見出し、2行目に単位を入れておきます。取得したデータは3行目から入力されます。また、A列に日時が入り、B~N列に各データが入ります。(画像では、アメダスのページの表示に合わせて、各データの順番が入れ替わっています。)
シート名は「data」としておきます。(コード作成時にこの名前で使います。)
③ アメダスのデータを取得するGAS
作成したスプレッドシートの「拡張機能」→「Apps Script」からスクリプトファイルを作成します。
タイムゾーンは、「Asia/Tokyo」に変更してください。(「プロジェクトの設定」→「「appsscript.json」マニフェスト ファイルをエディタで表示する」をチェックから「appsscript.json」内を編集。)
まずは、アメダスのデータを取得するGASです。
function getAmadasData() { let url = "https://www.jma.go.jp/bosai/amedas/data/map/"; url = url + getDataTime() + "00.json"; //観測所番号 let point = "36846"; //JSONデータの取得 let response = ""; try { response = UrlFetchApp.fetch(url); } catch(e) { return response; } let data = JSON.parse(response.getContentText()); let amds = []; amds.push(getDataTime()); //日時 amds.push(data[point]["temp"][0]); //温度 amds.push(data[point]["precipitation10m"][0]); //降水量(前10分) amds.push(data[point]["precipitation1h"][0]); //降水量(前1h) amds.push(data[point]["precipitation3h"][0]); //降水量(前3h) amds.push(data[point]["precipitation24h"][0]); //降水量(前24h) let windDirection = data[point]["windDirection"][0]; //風向 switch(windDirection) { case 0: windDirection = "静穏"; break; case 1: windDirection = "北北東"; break; case 2: windDirection = "北東"; break; case 3: windDirection = "東北東"; break; case 4: windDirection = "東"; break; case 5: windDirection = "東南東"; break; case 6: windDirection = "南東"; break; case 7: windDirection = "南南東"; break; case 8: windDirection = "南"; break; case 9: windDirection = "南南西"; break; case 10: windDirection = "南西"; break; case 11: windDirection = "西南西"; break; case 12: windDirection = "西"; break; case 13: windDirection = "西北西"; break; case 14: windDirection = "北西"; break; case 15: windDirection = "北北西"; break; case 16: windDirection = "北"; break; } amds.push(windDirection); amds.push(data[point]["wind"][0]); //風速 amds.push(data[point]["sun10m"][0]); //日照時間(前10分) amds.push(data[point]["sun1h"][0]); //日照時間(前1h) amds.push(data[point]["humidity"][0]); //湿度 amds.push(data[point]["pressure"][0]); //現地気圧 amds.push(data[point]["normalPressure"][0]); //海面気圧 amds.push(data[point]["visibility"][0] / 1000); //水平視程 return amds; } function getDataTime() { //取得データの日時を定義 let date_and_time = new Date(); let hour = Utilities.formatDate(date_and_time, "JST", "HH"); let min = Utilities.formatDate(date_and_time, "JST", "mm") - 12; //12分猶予 min = (Math.floor(min / 10) * 10); if(min == -10 || min == -20) { if(hour == 0) { let day = date_and_time.getDate(); date_and_time.setDate(day - 1); hour = "23"; } else { hour = hour -1; } min = "50"; } else if (min == 0) { min = "00"; } let date = Utilities.formatDate(date_and_time, "JST", "yyyyMMdd"); let dataTime = date + ("00" + hour).slice(-2) + min; return dataTime; }
※ コードを一部修正(2022-2-12)
※ コードを一部修正(2022-2-21)
書き換えが必要なのは2か所です。
・6行目「観測所番号」
・19~85行目、配列への格納
配列への格納は、取得するデータに合わせて変更してください。今回は13種類のデータを格納しています。
また、風向は数値を方角に、水平視程はmをkmに変換しています。
アメダスのJSONファイルは、おおよそ10分遅れで提供されるようなので、getDataTime関数でスクリプトが実行された時刻から12分遡り1分単位を切り捨てて取得データの日時を定義しています。
④ 取得したデータをスプレッドシートに保存するGAS
次に、取得したデータをスプレッドシートに記録するGASです。
function setAmdsData() { const spreadsheet = SpreadsheetApp.openById("スプレッドシートID"); const dataSheet = spreadsheet.getSheetByName("data"); let dataLastRow = dataSheet.getLastRow(); if(getAmadasData() != "") { //900行以上なら1行追加 if(dataLastRow >= 900) { dataSheet.insertRows(dataLastRow + 1); } //スプレッドシートに入力 dataSheet.getRange(dataLastRow + 1, 1, 1, 14).setValues([getAmadasData()]); } }
書き換えが必要なのは2か所です。
・2行目「スプレッドシートID」
スプレッドシートを開いた状態でURLの下記部分に表示されます。
https://docs.google.com/spreadsheets/d/ここの値をコピペ/edit#gid=0
・13行目「14」
日時+データで必要となる列数の値です(今回は1+13=14)。
setAmdsData()を実行することで、アメダスのデータがスプレッドシートに記録されます。
トリガー設定をすれば定期的にデータを取得することもできます。
GAS初回実行時は承認が必要となります。無料のGoogleアカウントの場合「このアプリは確認されていません」というページが表示されます。ここで「安全なページに戻る」をクリックすると実行できませんので、「詳細」→「プロジェクト名(安全ではないページ)に移動」から承認します。
***
さて、うまく動きましたでしょうか。
JSONファイルとしてデータを取得できるようになったのは非常に便利ですね。アメダスのデータ以外にもいろいろあるようなので活用していきたいですね。
自作スマート農業、本年も頑張っていきましょう。
詳解! Google Apps Script完全入門 [第3版]
by SimpleImageLink
・関連投稿
Twitter(@nkkmd)日々更新中です。