製作の背景
猛威を振るう熱中症。死者も出ています。
そんな中、熱中症警戒アラートというものがあることをご存じの方も多いでしょう。
これはWBGTが33以上となることが予想される場合に、多くは都道府県毎に発表されるものです。
詳しくは環境省のサイトに説明を譲ります。
そんな中、熱中症警戒アラートが出ていたら、教頭先生が日報に書くという運用がスタートしそうでした。ただでさえお忙しい教頭先生の手を煩わすのも気が引けたので、GASで通知botを作成しました。
環境省のサイトはGASからアクセスできない
環境省熱中症予防情報サイトではWBGTの予測値をCSVで取ることができます。
ですから、このCSVをGASでチェックして、33度以上になっているかで判定しようと思ったのです。
ところが、なぜかは知りませんが、そのデータをGASから読み込むことができません。ドメインまるごとダメでした。
気象庁にJSONがあった
なら、気象庁のサイトを使うしか無いということで、気象庁のサイト。
ソース見ると、イマドキの作りというか、全部JavaScriptで、これをそのまま読み込んでも仕方ない様子。
そんな中、jsonファイルを発見。
https://www.jma.go.jp/bosai/information/data/information.json
これを見ていると、熱中症警戒アラートについてもきちんと入っていることを確認。
次のような条件になります。
- 熱中症警戒アラートは前日の17時と当日の5時に発表される。
- 17時に発表された場合はアラートがキャンセルの場合でも5時の発表はあるがレアケースだろうと勝手に推測
- なので、5時の発表を見ればよい。reportDatetimeが「2023-08-31T05:00:00+09:00」の形になる。
- JSONの controlTitle が「熱中症警戒アラート」
- 同じく headTitle が「地域名+熱中症警戒アラート」(例:埼玉県熱中症警戒アラート)
と言う訳で、これでどうにかなりそうです。
処理の流れ
- 5時から6時の間でGAS起動
- 気象庁のJSON取得
- 条件に合うものがあるか探す
- あったらWebhookでGoogle Chatに投げる
GAS起動とかWebhookの説明は前回違うGASで説明したので省略します。
実際のソース
function myFunction() { //初期設定 let area = "埼玉県"; let WebhookUrl = "https://chat.googleapis.com/v1/spaces/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; var today = new Date (); let alart = 0; //読み込ませるファイル let url = "https://www.jma.go.jp/bosai/information/data/information.json"; var response = UrlFetchApp.fetch(url).getContentText(); let json = JSON.parse(response); let jsonNum = json.length; //配列の数をカウントする //当日の朝5時の情報となるように文字列を作る var d = new Date(); let y = d.getFullYear(); let m = d.getMonth() + 1; if(m<10){m = "0"+m;} //1-9月は01-09月とする let d2 = d.getDate(); if(d2<10){d2 = "0"+d2} //1-9日は01-09日とする let todaydate = y+"-"+m+"-"+d2+"T05:00:00+09:00"; //2023-08-30T05:00:00+09:00 の形 //配列を照合して当日に発出された熱中症警戒アラートを探す for(i=0;i<jsonNum;i++){ if(json[i]["controlTitle"]=="熱中症警戒アラート" && json[i]["headTitle"] == area+"熱中症警戒アラート" && json[i]["reportDatetime"] == todaydate){ alart = 1; //フラグを立てる }; } if (isWorkday (today) == true && alart == 1) { //以下平日でアラートがONの時に動作 //Googleチャットで投稿するボットメッセージを定義する let message = { 'text' : "【"+area+"】本日、熱中症警戒アラートが発表されています。念のため最新情報をご確認ください。"+"\n"+"https://www.wbgt.env.go.jp/alert.php" }; let options = { 'payload' : JSON.stringify(message), 'myamethod' : 'POST', 'contentType' : 'application/json' }; //WebhookのURL対しHTTP POSTを実行する let response = UrlFetchApp.fetch(WebhookUrl,options); } } //以下 https://dev.classmethod.jp/articles/202001-workday-only-gas/ より function isWorkday (targetDate) { // targetDate の曜日を確認、土日は休む (false) var rest_or_work = ["REST","mon","tue","wed","thu","fri","REST"]; // 日〜土 if ( rest_or_work [targetDate.getDay ()] == "REST" ) { return false; }; // 全て当てはまらなければ営業日 (True) return true; }と
と言う訳で、動作確認。
うんうん。OKOK。
と言う訳で、一手間かけるだけでみんなが楽になるし、大きな事故も防げるのであれば大歓迎です。
皆さんも是非お試しを!