パパ教員の戯れ言日記

このブログの発信は個人としての発信です。こんな教員もいるのかと思っていただければ幸いです。

熱中症警戒アラートが出ていたらGoogle Chatに投げるGASを書いた

製作の背景

猛威を振るう熱中症。死者も出ています。

そんな中、熱中症警戒アラートというものがあることをご存じの方も多いでしょう。

これはWBGTが33以上となることが予想される場合に、多くは都道府県毎に発表されるものです。

詳しくは環境省のサイトに説明を譲ります。

www.wbgt.env.go.jp

そんな中、熱中症警戒アラートが出ていたら、教頭先生が日報に書くという運用がスタートしそうでした。ただでさえお忙しい教頭先生の手を煩わすのも気が引けたので、GASで通知botを作成しました。

環境省のサイトはGASからアクセスできない

環境省熱中症予防情報サイトではWBGTの予測値をCSVで取ることができます。
ですから、このCSVをGASでチェックして、33度以上になっているかで判定しようと思ったのです。

www.wbgt.env.go.jp

ところが、なぜかは知りませんが、そのデータをGASから読み込むことができません。ドメインまるごとダメでした。

エラーになる(試しにドメインの他のアドレスを得ようとした例)

気象庁にJSONがあった

なら、気象庁のサイトを使うしか無いということで、気象庁のサイト。

www.jma.go.jp

ソース見ると、イマドキの作りというか、全部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 が「地域名+熱中症警戒アラート」(例:埼玉県熱中症警戒アラート)

と言う訳で、これでどうにかなりそうです。

処理の流れ

  1. 5時から6時の間でGAS起動
  2. 気象庁のJSON取得
  3. 条件に合うものがあるか探す
  4. あったらWebhookでGoogle Chatに投げる

GAS起動とかWebhookの説明は前回違うGASで説明したので省略します。

blog.edunote.jp

実際のソース

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。

と言う訳で、一手間かけるだけでみんなが楽になるし、大きな事故も防げるのであれば大歓迎です。

皆さんも是非お試しを!