-----
・追記(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版]](https://m.media-amazon.com/images/I/51FYffSOBcS._SL160_.jpg)
詳解! Google Apps Script完全入門 [第3版]
by SimpleImageLink
・関連投稿
Twitter(@nkkmd)日々更新中です。