気象庁のサイトから地震情報を取得してメール通知する


この記事でやること

気象庁のサイトから地震情報を取得して、

緊急地震速報(震度5弱以上)レベルの場合はメール通知するプログラミングを行います。

Google Apps Scriptで作ります。

 

 

この記事を書くに至った経緯

先日、Googleフォームを用いて安否確認システムを作りました。

Googleフォームを用いて安否確認システムを作成

 

地震が発生した際に、メールを自動送信する仕組みを作りたくてプログラムを書くことにしました。



情報の取得元について

はじめに、情報の取得元について紹介しようと思います。

気象庁防災情報XMLフォーマット形式電文の公開(PULL型)」のAtomフィード > 地震火山 を押下すると地震情報のxmlを確認することができます。

今回は30分ごとに地震情報を取得しようと思うので「高頻度フィード」のxmlを使用します。

 

 

地震火山情報の一覧を確認することができます。

「揺れ」というキーワードで検索すると地震情報がヒットします。

linkタグのurlを開きます。

 

 

詳細情報が表示され、Itemタグに震度と地域が表示されています。

ReportDateTimeには時刻が表示されています。

 

 

この一連の作業をプログラムで行い、内容をメール通知する仕組みを作ります。

 



プログラム手順

Googleスプレッドシートにアクセス

スプレッドシートに以下の通り書いてください。

プログラムで使うのはセル「C:2」だけです。日時は過去であればなんでもOKです。

・B:2 ⇒ 前回スクリプト実行時間

・B:4 ⇒ 30分ごとに実行するよう設定して利用する

・C:2 ⇒ 2018-09-09 14:54:45

 

 

②スクリプト エディタを開く

 

③プログラムを書く

ファイル名は何でもいいのですが「緊急地震速報」にしました。

 

プログラムは以下参照。

24行目まで:1つめのxmlのデータが多いので、セル「C:2」に書いてある、前回スクリプト実行時刻以降のデータのみ探索を行います。

29行目まで:現在時刻を、セル「C:2」に上書きします。

39行目:1つ目のxmlの内、震度3以上の場合は2つめのxmlを探索します。(震度3以上の場合は「震度速報」という表記になる)

58行目:「地震発生時刻 > 前回スクリプト実行時刻」かつ「震度が5~9」の場合は、メール送信対象の情報。

70行目:メール送信対象があった場合は、通知を行う。

71行目:宛先「address@gmail.com」を書き換えてご利用ください。(通知先のメールアドレス)

72行目:件名「安否確認」を書き換えてご利用ください。

73行目:本文「https://www.google.co.jp/」を書き換えてご利用ください。(安否確認のGoogleフォームへのリンクを書いてください。詳細はこちら)

 



④トリガーを設定

最後に30分ごとにプログラムを起動するための設定を行います

編集 > 現在のプロジェクトのトリガー

 

「トリガーを追加」より、各項目を選択して、保存。

 

 

以上で設定完了です!

30分ごとにプログラムが実行され、条件に合致すればメール通知が行われます。

震度5弱以上の地震は頻発しないので、動作確認したい場合は、59行目の条件を「震度[3-9]」にしたり、コメントアウトしてみてください。

ちなみに、ログの確認方法はスクリプトエディタより「表示 > ログ」です。

 

追記:都道府県名を指定して通知

2022/1/4 追記

指定した都道府県で地震が発生した際に、通知が行われるようプログラムを書いてみました。

前述ではHead内のItem要素を元に探索を行いましたが、Body内のPref要素を探索するようにしました。

泥臭いやり方でしかうまくいかなさそうでしたが、おそらくうまく機能するかと。

※すべての都道府県で動作確認できているわけではないので参考まで。

59行目:都道府県名を指定しています。(例:「和歌山県、大阪府、東京都」のいずれかで地震が発生したら通知)

 

追記:1分の誤差に対処

2022/4/19 追記
高頻度フィードは「毎分更新」なので地震とスクリプト実行時刻が同時刻の場合、
通知が行われない可能性がありました。
そこで以下の通り改善してみました。

以下処理の記載場所をメール送信処理後に移動してみました。(以下85行目へ)
こうすることで、過去30分以内の地震情報を探索するのではなく、前回メールを送信した時刻以降の地震情報を探索するようになります。

//スクリプト実行時刻の更新(スプレッドシートを更新)
var now = Utilities.formatDate(new Date(),”JST”,”yyyy-MM-dd HH:mm:ss”);
sheet.getRange(2, 3).setValue(now);
Logger.log(“スクリプト実行時刻  :” + now);

改善後のプログラムは以下の通りです。

 

ここまで書くならPUSH型の方法にした方がよいかと思いましたが、
いつの間にかPUSH型の提供は終わっていたのですね。

気象庁防災情報XMLフォーマット 情報提供ページ

“PUSH型”の提供環境につきましては、令和2年9月1日をもって終了いたしました。
今後は、”PULL型”の提供環境や、(一財)気象業務支援センターの配信サービス等のご利用をお願いいたします。

当記事ではPULL型を使っているので一安心。

最後まで読んで頂きありがとうございました^^

 

この投稿へのコメント

  1. ジーク said on 2018年11月2日 at 09:34

    ありがとうございます。

    大変有益な情報でした。
    参考にさせていただきました。

    「気象庁防災情報XMLフォーマット形式電文の公開(PULL型)」のサイトが移動してました。

    移動先は下記のようです。
    http://xml.kishou.go.jp/xmlpull.html

    xmlの保存先に変更はないようなのでスクリプトはそのままで動きました。

    • s said on 2018年11月3日 at 21:19

      ご連絡頂きありがとうございます!
      リンクを更新致しました。

  2. DAG73 said on 2021年9月24日 at 14:42

    コメント恐縮なのですけど、何故か、地震が起こっても、メールが送信されないのですが、どうしたらいいと思いますか?

    • s said on 2021年12月9日 at 23:40

      コメントいただきありがとうございます。
      すみません。返信が遅くなってしまいました。

      メール送信だけのスクリプトを書いてみました。
      まずは以下のプログラムを参考に、動作確認頂ければと思います。
      ※「address@gmail.com」の箇所は自身のメールアドレスに変更してください。
      ※初めて実行する際は「承認が必要です」といったメッセージが表示されると思うので実行を承認する必要があります。
      —————————————
      function myFunction() {
      var sendToAddress =”address@gmail.com”;
      var mailTitle = ‘test’;
      var mailMessage = ‘test’;
      MailApp.sendEmail(sendToAddress,mailTitle,mailMessage);
      }
      —————————————

  3. pa-su said on 2021年12月13日 at 09:09

    お世話になります。
    最近地震が多く、何か社員の安否確認をする方法がないかと検索していましたら、この記事にたどり着きました。
    メール配信までうまくいったのですが、震度3以上のすべての都道府県の連絡が来るので、これを選択した都道府県だけをピックアップして送信することは可能なのでしょうか。
    コード系が疎く調べてみたのですが、なかなかうまくいかなかったのでご質問させて頂きます。

    • s said on 2021年12月25日 at 23:13

      コメントありがとうございます。
      可能ですが、XMLの形式的に少々泥臭い実装方法が必要そうです。

      HeadタグではなくBodyタグの方から都道府県名や震度情報を取るようにすれば、絞り込みも容易なのですが文字を分割したり置換したりする必要がありそうかなと。
      試しに実装してみまして、動作確認中です。(不謹慎ではありますが、とある県で地震が発生すれば確認完了の状況です)
      確認出来たら公開いたします。

      このブログを公開した際に、コメントいただいた内容も試そうとしたのですが、さっと作れるものではなさそうだったので断念していました^^;
      出張中に他県で地震が発生することもありうるので、一旦こういう実装にしていました。

    • s said on 2022年1月4日 at 22:01

      試しに書いてみたコードを掲載してみました。
      良かったら試してみてください。
      追記:都道府県名を指定して通知

  4. 勉強中 said on 2022年4月2日 at 09:12

    大変参考になります。
    ありがとうございます。

    一点教えていただきたいのですが、
    都道府県指定の部分で仮に「宮城県」と入力した場合、「宮城県北部」でも取得されますでしょうか?

    震度は1-9で設定しており、実際に先日、震度3の地震が来た際、スクリプトは実行されましたが該当無しとなってしまいメールが飛んできませんでした

    • s said on 2022年4月7日 at 18:04

      コメントありがとうございます。

      動作確認のため、
      高頻度フィード(https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml)のURLを
      長期フィード(https://www.data.jma.go.jp/developer/xml/feed/eqvol_l.xml)に変更したところ、
      「宮城県北部」でも処理対象になることを確認いたしました。

      ですので、県名のチェックを行っているロジックが問題ではなさそうです。

      届かなかったのは、プログラムの実行時刻と、
      入電のタイミングによるものかもしれません。
      ※高頻度フィードは「毎分更新」なので、取得するデータの範囲を少し広げるなどの考慮が必要かもしれません。
       単純に時間を遡って探索にしてしまうと、通知済のメールが再通知される問題が発生するので、
       そういった点も考慮する必要がありそうです。
       時間があるときに改良してみます。

      • s said on 2022年4月19日 at 20:19

        入電とスクリプトの実行が被った場合の対処を行ってみました。
        おそらくこれで解消されるかと思います。
        追記:1分の誤差に対処

        • 勉強中 said on 2022年4月25日 at 00:27

          回答だけでなく、改善策までありがとうございます・・・!
          さっそく試させていただきます。

  5. s said on 2022年4月7日 at 18:09

    URLがいつの間にか変わってますね(SSL対応されてる)
    リダイレクトされるので動作には影響ないようですが、後日更新しときます。
    http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml
    ↓↓↓
    https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml

  6. 勉強中 said on 2022年4月29日 at 12:05

    度々申し訳ございません。

    同じエリアでも通知が飛ぶ時と該当無しとなるときがあり悩んでおります・・・


    高頻度フィードは「毎分更新」とのことですが
    例えば指定エリアで地震が発生し、スクリプトが起動するまでの間に「指定外のエリアで地震が発生した場合」、
    指定エリアで発生した地震の情報を取得してくれるのでしょうか・・・?


    トリガーは30分ではなく、5分や1分おきの起動でも大丈夫でしょうか・・・?


    1.スプシのシート名を指定。2.都道府県名を変更。3.震度を変更。4.メールアドレスを変更しておりますがうまくいきません・・・

    • s said on 2022年5月1日 at 21:59

      気になった点として、以前いただいたコメントで「震度は1-9で設定しており」とありますが、
      情報の取得元について内に書いてある通り、1つ目のxmlでは震度3以上の情報を探索します。
      ※全ての地震情報を探索するプログラムではありません。
      該当なしとなっている地震の情報は、1つ目のxmlにも2つめのxmlにも地震情報が載っていますでしょうか?
      「具体的に、○○県を指定しおり、このxmlには地震情報があるのに取れない」といった質問を頂ければ私の方でも確認してみます。

      以下質問の回答です。

      >①
      高頻度フィードのxml内に存在する場合は取得されます。

      >②
      プログラム的には問題ございませんが、Googleサービスの割り当てに関する制限がありますのでご注意ください。
      https://developers.google.com/apps-script/guides/services/quotas

      >③
      すみません。具体的な質問内容でないと回答が難しいです。

      • 勉強中 said on 2022年5月19日 at 10:10

        大変申し訳ございません。
        意味を理解しておりませんでした・・・

        試したところ上手く作動しました。ありがとうございます。

        もう一点だけ教えていただきたいのですが、
        震度6弱以上の時に作動させたい場合は
        strPref.match(/震度[7-9]
        でよろしいでしょうか?

        • s said on 2022年5月19日 at 18:15

          動作したとのことで良かったです。
          「震度6弱以上」でしたら、「strPref.match(/震度[6-9]」です。
          記載した震度を含む範囲の震度で処理が行われます。

          • 勉強中 said on 2022年5月28日 at 10:14

            「震度6弱以上」でしたら、「strPref.match(/震度[6-9]」の件、
            承知しました。

            ご教授いただきまして、本当にありがとうございました。

            感謝です。

  7. _ said on 2022年10月18日 at 15:20

    こちらのサイトを参考にしているのですが、
    現在、気象庁のurlが itemタグがなくなっているようです。
    MaxIntタグで震度が拾えるようなのですが、
    どのように変えればよいでしょうか…
    初心者なもので、たよってスミマセン。

    • s said on 2022年10月18日 at 21:09

      コメントいただきましてありがとうございます。
      今「高頻度フィード」では地震情報がなかったので確認できませんでした。
      xmlのurlを教えていただければ私の方でも確認してみます。

  8. _ said on 2022年10月19日 at 13:49

    こんなに早く確認頂けるなんて、嬉しいです!ありがとうございます。

    もう一度確認していて、違いをやっと理解できました。
    「地震速報」で発令があったものはタグがありますが、
    「震源・震度に関する情報」で発令があったものはタグがなく、こちらを見ておりました。
    こちらのGASは「地震速報」のみ対応ということでしたね。

    8行目の https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml へ行って、
    地震速報があった京都の分を選びました。こちらはタグがあります。
    https://www.data.jma.go.jp/developer/xml/data/20221019020612_0_VXSE53_270000.xml

    震源・震度に関する情報があった新潟の分は、がなく、同様のケースをみていました。
    ですが、この「震源・震度に関する情報」はカバーされないということで認識いたしました。
    https://www.data.jma.go.jp/developer/xml/data/20221018183835_0_VXSE53_010000.xml

    • s said on 2022年10月19日 at 23:04

      おっしゃる通りです!
      似たような情報が混在してて分かりずらいですよね^^;
      解決したようで良かったです

  9. john doe said on 2022年11月9日 at 14:39

    こちらのスクリプトを利用してmattermostへの通知ができるようにしてみました。
    たいへん助かっております。ありがとうございます。
    情報共有に変更部分を記載しようとしたのですが、スパム扱い担ってしまいましたので、ご報告まで

    • s said on 2022年11月11日 at 23:42

      コメントありがとうございます。
      mattermostへの通知良いですね。
      私は使ったことないので時間が出来たら試してみようと思います。

  10. 渡邊健太 said on 2022年12月20日 at 12:55

    先日コメントした者です。
    無事動き情報も取得できましたのでご連絡いたします。
    原因は、スプレットシート設定にあることが判明しました。
    > //前回スクリプト実行時刻の保持(スプレッドシートから取得)
    >var sheet = SpreadsheetApp.getActiveSheet();
    この部分です。
    この後シートを特定するscriptを入れることで、解消しました。
    var sheet= ss.getSheetByName(‘速報時刻’);
    の様に私はしました。

    • s said on 2023年4月12日 at 23:28

      返信遅くなりました。
      複数シートがある場合はそのような考慮も必要ですね。
      解決して良かったです。

  11. _ said on 2023年5月26日 at 20:03

    こちらのサイト、大変参考になります。ありがとうございます。
    震度5強以上で作動させたい場合はどのような設定が可能でしょうか。
    教えて頂けたらありがたいです。

    • s said on 2023年5月26日 at 22:11

      コメントありがとうございます。
      「設定」というのは何を指していますでしょうか?

      • _ said on 2023年5月28日 at 22:02

        質問の仕方が悪くて大変申し訳ございません。
        strPref.match以降の記載についての質問でした。
        コメントで「「震度6弱以上」でしたら「strPref.match(/震度[6-9]」です。記載した震度を含む範囲の震度で処理が行われます。」との記載を拝見したのですが、震度5強の場合(震度5弱ではなく)の記載要領が分からず質問させていただきました。

        • s said on 2023年5月28日 at 23:37

          震度[6-9]の箇所は正規表現で定義しています。
          震度5強の際にどういった内容が気象庁から出るかについては存じ上げませんが、xmlの仕様を確認したり、実際に震度5強の地震が発生した際のデータを探すことで分かるかと思います。
          当初は詳しい仕様を見つけられなかったので試行錯誤してましたが今は公開されているかもしれません。

  12. _ said on 2023年5月28日 at 21:58

    質問の仕方が悪く申し訳ありません。
    strPref.match以降の記載についての質問でした。
    コメントで「「震度6弱以上」でしたら「strPref.match(/震度[6-9]」です。記載した震度を含む範囲の震度で処理が行われます。」
    との記載を拝見したのですが、震度5強の場合(震度5弱ではない場合)の記載が分からず質問させていただきました。

  13. _ said on 2023年5月30日 at 22:28

    ご回答ありがとうございました。
    初心者なものですぐには難しいと思いますが、少しずつ調べてやってみます!
    また重複して質問してしまったようで重ねて申し訳ありませんでした。

s へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL