2022/06/29に更新

【GASで防災】猛暑日をメールで通知する

API防災

指定した地域の天気予報を取得し、明日が猛暑日の予想であればメールで通知するGoogle Apps Scriptです。遠方に住んでいる親類に熱中症予防を呼びかけるきっかけにどうぞ。

こんな悩みを解決します


  • 明日が暑いかどうか通知してほしい
  • 遠方に住む高齢の親に、猛暑日はエアコンを付けるよう連絡したいけど天気予報見るのはめんどくさい

用意するもの


特にありませんが、スクリプト置き場としてスプレッドシートを利用しています(コンテナバインド型)。
スタンドアロン型としても動作するはずです。

このスクリプトで出来ること


  • 指定した都道府県の天気予報を取得し、明日の最高気温が35℃以上(猛暑日)ならメールで通知してくれます。

使い方


1.事前準備

事前設定エリアの「都道府県コード」と「通知先メールアドレス」を設定してください。
都道府県コードはソースコードに乗せてあります。
準備が終わったら関数「onOpen」を一度実行しておきましょう。

2.動作確認

スプレッドシートに戻ると「猛暑日をお知らせする」というメニューが増えているはずです。
これを押してテスト実行してみます。

指定したメールアドレスにこのようなメールが届けば成功です。

3.トリガーの設定

動作確認で問題なければ、トリガーで定期的に実行しましょう。
実行時刻はいつでもよいですが、できるだけ精度高く翌日の気温を知りたいので夕方〜夜ぐらいがよいのではないでしょうか。

  • 実行する関数: report_extreme_hot_day
  • 実行するデプロイ: HEAD
  • イベントのソース: 時間主導型
  • 時間ベースのトリガーのタイプ: 日付ベースのタイマー
  • 時刻をを選択: 午後7時〜8時

4.注意点

このサンプルスクリプトでは、北海道や沖縄を除いて都道府県単位で指定しています。
東京都を指定しても八丈島の気温も拾ってしまうので、より細かく判定したい場合は61〜70行目あたりで特定の地域だけ取得するように条件分岐を追加してあげてください。

なお、天気予報データは気象庁のJSONファイルを利用させていただいています。APIとして提供されているわけではないため、突然仕様が変わる可能性もありますのでシビアな用途には向かないかもしれません。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00113/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('猛暑日をお知らせする', 'report_extreme_hot_day');

  // メニューを画面に追加する
  menu.addToUi();
}

function report_extreme_hot_day() {

  // ########## 事前設定エリア ここから ##########

  // 以下を参考に、希望の都道府県コードをセットしてください。
  /* 
  '宗谷': '011000', '上川・留萌': '012000', '網走・北見・紋別': '013000', '十勝': '014030',
  '釧路・根室': '014100', '胆振・日高': '015000', '石狩・空知・後志': '016000', '渡島・檜山': '017000',
  '青森県': '020000', '岩手県': '030000', '宮城県': '040000', '秋田県': '050000',
  '山形県': '060000', '福島県': '070000', '茨城県': '080000', '栃木県': '090000', '群馬県': '100000',
  '埼玉県': '110000', '千葉県': '120000', '東京都': '130000', '神奈川県': '140000', '新潟県': '150000',
  '富山県': '160000', '石川県': '170000', '福井県': '180000', '山梨県': '190000', '長野県': '200000',
  '岐阜県': '210000', '静岡県': '220000', '愛知県': '230000', '三重県': '240000', '滋賀県': '250000',
  '京都府': '260000', '大阪府': '270000', '兵庫県': '280000', '奈良県': '290000', '和歌山県': '300000',
  '鳥取県': '310000', '島根県': '320000', '岡山県': '330000', '広島県': '340000', '山口県': '350000',
  '徳島県': '360000', '香川県': '370000', '愛媛県': '380000', '高知県': '390000', '福岡県': '400000',
  '佐賀県': '410000', '長崎県': '420000', '熊本県': '430000', '大分県': '440000', '宮崎県': '450000',
  '鹿児島県': '460100', '奄美': '460040',
  '沖縄本島': '471000', '大東島': '472000', '宮古島': '473000', '八重山': '474000'
  */
  const pref_code = '130000'; // サンプルとして東京にしてあります

  // 通知先のメールアドレスをセットしてください。
  const mail_to = '******************';

  // ########## 事前設定エリア ここまで ##########


  // 都道府県コードを元に、リクエストURLを生成
  const url = 'https://www.jma.go.jp/bosai/forecast/data/forecast/' + pref_code + '.json';

  // URLにアクセスする
  const response = UrlFetchApp.fetch(url);

  // コンテンツを取得する
  const response_text = response.getContentText();

  // JSONとしてパースする
  const json = Utilities.jsonParse(response_text);

  // 明日の気温が35℃以上の地域を格納する変数を宣言
  const hot_areas = [];

  // ひとつの都道府県コード内に複数の地域が入っている場合があるので、ループで取得する。
  for (let j = 0; j < json[1]['timeSeries'][1]['areas'].length; j++) {

    let area = json[1]['timeSeries'][1]['areas'][j]['area']['name']; // 地域を取得する
    let temp_max = json[1]['timeSeries'][1]['areas'][j]['tempsMax']; // 最高気温を取得する

    if (temp_max[1] >= 35) { // 明日(配列の2番目)の気温が35度以上なら
      // 地域と最高気温を配列に追加する
      hot_areas.push([area, temp_max[1]]);
    }
  }

  // 猛暑日の地域が1つ以上あれば
  if (hot_areas.length > 0) {

    // メールの件名を作成する
    const mail_subject = '猛暑日アラート(' + Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + ')';

    // メール本文用の変数を宣言
    const mail_body = [];

    // 猛暑日の地域の数だけループして本文を作成する
    for (let i = 0; i < hot_areas.length; i++) {

      mail_body.push('明日は' + hot_areas[i][0] + '地方で猛暑日(' + hot_areas[i][1]  + '℃)の見込みです。');
    }

    // メールの送信処理
    GmailApp.sendEmail(mail_to, mail_subject, mail_body.join('\n'));
  }
}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp