気象庁のサイトから地震情報を取得してメール通知する
この記事でやること
気象庁のサイトから地震情報を取得して、
緊急地震速報(震度5弱以上)レベルの場合はメール通知するプログラミングを行います。
Google Apps Scriptで作ります。
この記事を書くに至った経緯
先日、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フォームへのリンクを書いてください。詳細はこちら)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
/** * 気象庁が公開している地震情報(高頻度フィード)を取得し、震度5~9の場合は安否確認メールを送る * http://xml.kishou.go.jp/xmlpull.html */ function getEarthQuake() { var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); var feedUrl = 'https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml'; var feedRes = UrlFetchApp.fetch(feedUrl).getContentText(); var feedDoc = XmlService.parse(feedRes); var feedXml = feedDoc.getRootElement(); var feedLocs = getElementsByTagName(feedXml, 'entry'); // xmlに含まれるentry要素を配列で取得する var sendFlg = false; //メール送信フラグ //前回スクリプト実行時刻の保持(スプレッドシートから取得) var sheet = SpreadsheetApp.getActiveSheet(); if(sheet.getRange(2, 3).getValue() == ''){ //空の場合は現在時刻を設定 sheet.getRange(2, 2).setValue('前回スクリプト実行時刻'); var preDate = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); }else{ var preDate = Utilities.formatDate(sheet.getRange(2, 3).getValue(),"JST","yyyy-MM-dd HH:mm:ss"); Logger.log("前回スクリプト実行時刻:" + preDate); } //スクリプト実行時刻の更新(スプレッドシートを更新) var now = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); sheet.getRange(2, 3).setValue(now); Logger.log("スクリプト実行時刻 :" + now); //気象庁のxmlデータ(feed)より、entry要素を繰り返し探索 var quakeInfo = ""; //地震情報 feedLocs.forEach(function(value, i) { var titleText = value.getChild('title', atom).getText(); //title var linkText = value.getChild('link', atom).getAttribute('href').getValue(); //link //titleが震度速報の場合(震度3以上) if('震度速報' == titleText){ //気象庁のxmlデータ(data)の情報を取得 var dataUrl = linkText; var dataRes = UrlFetchApp.fetch(dataUrl).getContentText(); var dataDoc = XmlService.parse(dataRes); var dataXml = dataDoc.getRootElement(); var dataLocs = getElementsByTagName(dataXml, 'Item'); // xmlに含まれるItem要素を配列で取得する var dataReportDateTime = getElementsByTagName(dataXml, 'TargetDateTime')[0].getValue(); // 地震発生時刻 dataReportDateTime = dataReportDateTime.replace('T', ' '); dataReportDateTime = dataReportDateTime.replace('+09:00', ''); //気象庁のxmlデータ(data)より、Item要素を繰り返し探索 dataLocs.forEach(function(value, i) { //Item要素の文字列を取得(震度と地域) var strItem = value.getValue(); //「地震発生時刻 > 前回スクリプト実行時刻」かつ「震度が5~9」の場合 if(dataReportDateTime > preDate && strItem.match(/震度[5-9]/)){ sendFlg = true; //送信フラグをtrue quakeInfo = quakeInfo + strItem; //地震情報 Logger.log("地震発生時刻 :" + dataReportDateTime); Logger.log(strItem); //Item要素 } }); } }); //送信フラグがtrueの場合 if(sendFlg == true){ var sendToAddress ="address@gmail.com"; var mailTitle = '安否確認'; var mailMessage = '【安否確認】\n'+ '震度5弱以上の強い揺れを検知しました。\n'+ '安否確認のため、今の状況を入力してください。\n'+ 'https://www.google.co.jp/\n\n'+ '【地震情報】\n'+ quakeInfo; MailApp.sendEmail(sendToAddress,mailTitle,mailMessage); Logger.log("送信完了"); }else{ Logger.log("送信なし"); } } /** * @param {string} element 検索要素 * @param {string} tagName タグ * @return {string} data 要素 */ function getElementsByTagName(element, tagName) { var data = [], descendants = element.getDescendants(); for(var i in descendants) { var elem = descendants[i].asElement(); if ( elem != null && elem.getName() == tagName) data.push(elem); } return data; } |
④トリガーを設定
最後に30分ごとにプログラムを起動するための設定を行います
編集 > 現在のプロジェクトのトリガー
「トリガーを追加」より、各項目を選択して、保存。
以上で設定完了です!
30分ごとにプログラムが実行され、条件に合致すればメール通知が行われます。
震度5弱以上の地震は頻発しないので、動作確認したい場合は、59行目の条件を「震度[3-9]」にしたり、コメントアウトしてみてください。
ちなみに、ログの確認方法はスクリプトエディタより「表示 > ログ」です。
追記:都道府県名を指定して通知
2022/1/4 追記
指定した都道府県で地震が発生した際に、通知が行われるようプログラムを書いてみました。
前述ではHead内のItem要素を元に探索を行いましたが、Body内のPref要素を探索するようにしました。
泥臭いやり方でしかうまくいかなさそうでしたが、おそらくうまく機能するかと。
※すべての都道府県で動作確認できているわけではないので参考まで。
59行目:都道府県名を指定しています。(例:「和歌山県、大阪府、東京都」のいずれかで地震が発生したら通知)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
/** * 気象庁が公開している地震情報(高頻度フィード)を取得し、震度5~9の場合は安否確認メールを送る * http://xml.kishou.go.jp/xmlpull.html */ function getEarthQuake() { var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); var feedUrl = 'https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml'; var feedRes = UrlFetchApp.fetch(feedUrl).getContentText(); var feedDoc = XmlService.parse(feedRes); var feedXml = feedDoc.getRootElement(); var feedLocs = getElementsByTagName(feedXml, 'entry'); // xmlに含まれるentry要素を配列で取得する var sendFlg = false; //メール送信フラグ var dt59 = ""; //5-9地震発生時刻 //前回スクリプト実行時刻の保持(スプレッドシートから取得) var sheet = SpreadsheetApp.getActiveSheet(); if(sheet.getRange(2, 3).getValue() == ''){ //空の場合は現在時刻を設定 sheet.getRange(2, 2).setValue('前回スクリプト実行時刻'); var preDate = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); }else{ var preDate = Utilities.formatDate(sheet.getRange(2, 3).getValue(),"JST","yyyy-MM-dd HH:mm:ss"); Logger.log("前回スクリプト実行時刻:" + preDate); } //スクリプト実行時刻の更新(スプレッドシートを更新) var now = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); sheet.getRange(2, 3).setValue(now); Logger.log("スクリプト実行時刻 :" + now); //気象庁のxmlデータ(feed)より、entry要素を繰り返し探索 var quakeInfo = ""; //地震情報 feedLocs.forEach(function(value, i) { var titleText = value.getChild('title', atom).getText(); //title var linkText = value.getChild('link', atom).getAttribute('href').getValue(); //link //titleが震度速報の場合(震度3以上) if('震度速報' == titleText){ //気象庁のxmlデータ(data)の情報を取得 var dataUrl = linkText; var dataRes = UrlFetchApp.fetch(dataUrl).getContentText(); var dataDoc = XmlService.parse(dataRes); var dataXml = dataDoc.getRootElement(); var dataLocs = getElementsByTagName(dataXml, 'Pref'); // xmlに含まれるPref要素を配列で取得する var dataReportDateTime = getElementsByTagName(dataXml, 'TargetDateTime')[0].getValue(); // 地震発生時刻 dataReportDateTime = dataReportDateTime.replace('T', ' '); dataReportDateTime = dataReportDateTime.replace('+09:00', ''); //気象庁のxmlデータ(data)より、Pref要素を繰り返し探索 dataLocs.forEach(function(value, i) { //Pref要素の文字列を取得(震度と地域) var strPref = value.getValue(); // 都道府県指定 if(strPref.match(/和歌山県/) || strPref.match(/大阪府/) || strPref.match(/東京都/)){ // 震度情報成形 strPref = molding1(strPref); //「地震発生時刻 > 前回スクリプト実行時刻」かつ「震度が5~9」の場合 if(dataReportDateTime > preDate && strPref.match(/震度[5-9]/)){ sendFlg = true; //送信フラグをtrue quakeInfo = quakeInfo + strPref; //地震情報 dt59 = dataReportDateTime; //5-9地震発生時刻 Logger.log("地震発生時刻 :" + dataReportDateTime); Logger.log(strPref); //Pref要素 } } }); } }); //送信フラグがtrueの場合 if(sendFlg == true){ var sendToAddress ="address@gmail.com"; var mailTitle = '安否確認'; var mailMessage = '【安否確認】\n'+ '震度5弱以上の強い揺れを検知しました。\n'+ '安否確認のため、今の状況を入力してください。\n'+ 'https://www.google.co.jp/\n\n'+ '【地震情報】\n'+ dt59 +'\n'+ quakeInfo; MailApp.sendEmail(sendToAddress,mailTitle,mailMessage); Logger.log("送信完了"); }else{ Logger.log("送信なし"); } } /** * @param {string} element 検索要素 * @param {string} tagName タグ * @return {string} data 要素 */ function getElementsByTagName(element, tagName) { var data = [], descendants = element.getDescendants(); for(var i in descendants) { var elem = descendants[i].asElement(); if ( elem != null && elem.getName() == tagName) data.push(elem); } return data; } /** * @param {string} moji タグ * @return {string} data 要素 */ function molding1(moji) { var moji1 = moji.charAt(4); var moji2 = moji.charAt(5); if(moji1.match(/[0-9]/)){ //4文字目が数字の場合(都道府県名が3文字の場合) data = molding2(moji, 6); }else if(moji2.match(/[0-9]/)){ //5文字目が数字の場合(都道府県名が4文字の場合) data = molding2(moji, 7); } return data; } /** * @param {string} moji タグ * @return {string} data 要素 */ function molding2(moji, i) { var sindo = '震度' + moji.substr(i,1); if(moji.match(/県/)){ data = moji.replace(/県[0-9][0-9][0-9]*/,"県 " + sindo); }else if(moji.match(/府/)){ data = moji.replace(/府[0-9][0-9][0-9]*/,"府 " + sindo); }else if(moji.match(/東京都/)){ data = moji.replace(/東京都[0-9][0-9][0-9]*/,"東京都 " + sindo); }else if(moji.match(/北海道/)){ data = moji.replace(/北海道[0-9][0-9][0-9]*/,"北海道 " + sindo); }else{ console.log('molding2 エラー'); } return data; } |
追記: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);
改善後のプログラムは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
/** * 気象庁が公開している地震情報(高頻度フィード)を取得し、震度5~9の場合は安否確認メールを送る * http://xml.kishou.go.jp/xmlpull.html */ function getEarthQuake() { var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); var feedUrl = 'https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml'; var feedRes = UrlFetchApp.fetch(feedUrl).getContentText(); var feedDoc = XmlService.parse(feedRes); var feedXml = feedDoc.getRootElement(); var feedLocs = getElementsByTagName(feedXml, 'entry'); // xmlに含まれるentry要素を配列で取得する var sendFlg = false; //メール送信フラグ var dt59 = ""; //5-9地震発生時刻 //前回スクリプト実行時刻の保持(スプレッドシートから取得) var sheet = SpreadsheetApp.getActiveSheet(); if(sheet.getRange(2, 3).getValue() == ''){ //空の場合は現在時刻を設定 sheet.getRange(2, 2).setValue('前回スクリプト実行時刻'); var preDate = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); }else{ var preDate = Utilities.formatDate(sheet.getRange(2, 3).getValue(),"JST","yyyy-MM-dd HH:mm:ss"); Logger.log("前回スクリプト実行時刻:" + preDate); } //気象庁のxmlデータ(feed)より、entry要素を繰り返し探索 var quakeInfo = ""; //地震情報 feedLocs.forEach(function(value, i) { var titleText = value.getChild('title', atom).getText(); //title var linkText = value.getChild('link', atom).getAttribute('href').getValue(); //link //titleが震度速報の場合(震度3以上) if('震度速報' == titleText){ //気象庁のxmlデータ(data)の情報を取得 var dataUrl = linkText; var dataRes = UrlFetchApp.fetch(dataUrl).getContentText(); var dataDoc = XmlService.parse(dataRes); var dataXml = dataDoc.getRootElement(); var dataLocs = getElementsByTagName(dataXml, 'Pref'); // xmlに含まれるPref要素を配列で取得する var dataReportDateTime = getElementsByTagName(dataXml, 'TargetDateTime')[0].getValue(); // 地震発生時刻 dataReportDateTime = dataReportDateTime.replace('T', ' '); dataReportDateTime = dataReportDateTime.replace('+09:00', ''); //気象庁のxmlデータ(data)より、Pref要素を繰り返し探索 dataLocs.forEach(function(value, i) { //Pref要素の文字列を取得(震度と地域) var strPref = value.getValue(); // 都道府県指定 if(strPref.match(/和歌山県/) || strPref.match(/大阪府/) || strPref.match(/東京都/)){ // 震度情報成形 strPref = molding1(strPref); //「地震発生時刻 > 前回スクリプト実行時刻」かつ「震度が5~9」の場合 if(dataReportDateTime > preDate && strPref.match(/震度[5-9]/)){ sendFlg = true; //送信フラグをtrue quakeInfo = quakeInfo + strPref; //地震情報 dt59 = dataReportDateTime; //5-9地震発生時刻 Logger.log("地震発生時刻 :" + dataReportDateTime); Logger.log(strPref); //Pref要素 } } }); } }); //送信フラグがtrueの場合 if(sendFlg == true){ var sendToAddress ="address@gmail.com"; var mailTitle = '安否確認'; var mailMessage = '【安否確認】\n'+ '震度5弱以上の強い揺れを検知しました。\n'+ '安否確認のため、今の状況を入力してください。\n'+ 'https://www.google.co.jp/\n\n'+ '【地震情報】\n'+ dt59 +'\n'+ quakeInfo; MailApp.sendEmail(sendToAddress,mailTitle,mailMessage); //スクリプト実行時刻の更新(スプレッドシートを更新) var now = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); sheet.getRange(2, 3).setValue(now); Logger.log("スクリプト実行時刻 :" + now); Logger.log("送信完了"); }else{ Logger.log("送信なし"); } } /** * @param {string} element 検索要素 * @param {string} tagName タグ * @return {string} data 要素 */ function getElementsByTagName(element, tagName) { var data = [], descendants = element.getDescendants(); for(var i in descendants) { var elem = descendants[i].asElement(); if ( elem != null && elem.getName() == tagName) data.push(elem); } return data; } /** * @param {string} moji タグ * @return {string} data 要素 */ function molding1(moji) { var moji1 = moji.charAt(4); var moji2 = moji.charAt(5); if(moji1.match(/[0-9]/)){ //4文字目が数字の場合(都道府県名が3文字の場合) data = molding2(moji, 6); }else if(moji2.match(/[0-9]/)){ //5文字目が数字の場合(都道府県名が4文字の場合) data = molding2(moji, 7); } return data; } /** * @param {string} moji タグ * @return {string} data 要素 */ function molding2(moji, i) { var sindo = '震度' + moji.substr(i,1); if(moji.match(/県/)){ data = moji.replace(/県[0-9][0-9][0-9]*/,"県 " + sindo); }else if(moji.match(/府/)){ data = moji.replace(/府[0-9][0-9][0-9]*/,"府 " + sindo); }else if(moji.match(/東京都/)){ data = moji.replace(/東京都[0-9][0-9][0-9]*/,"東京都 " + sindo); }else if(moji.match(/北海道/)){ data = moji.replace(/北海道[0-9][0-9][0-9]*/,"北海道 " + sindo); }else{ console.log('molding2 エラー'); } return data; } |
ここまで書くならPUSH型の方法にした方がよいかと思いましたが、
いつの間にかPUSH型の提供は終わっていたのですね。
“PUSH型”の提供環境につきましては、令和2年9月1日をもって終了いたしました。
今後は、”PULL型”の提供環境や、(一財)気象業務支援センターの配信サービス等のご利用をお願いいたします。
当記事ではPULL型を使っているので一安心。
最後まで読んで頂きありがとうございました^^
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント
ありがとうございます。
大変有益な情報でした。
参考にさせていただきました。
「気象庁防災情報XMLフォーマット形式電文の公開(PULL型)」のサイトが移動してました。
移動先は下記のようです。
http://xml.kishou.go.jp/xmlpull.html
xmlの保存先に変更はないようなのでスクリプトはそのままで動きました。
ご連絡頂きありがとうございます!
リンクを更新致しました。
コメント恐縮なのですけど、何故か、地震が起こっても、メールが送信されないのですが、どうしたらいいと思いますか?
コメントいただきありがとうございます。
すみません。返信が遅くなってしまいました。
メール送信だけのスクリプトを書いてみました。
まずは以下のプログラムを参考に、動作確認頂ければと思います。
※「address@gmail.com」の箇所は自身のメールアドレスに変更してください。
※初めて実行する際は「承認が必要です」といったメッセージが表示されると思うので実行を承認する必要があります。
—————————————
function myFunction() {
var sendToAddress =”address@gmail.com”;
var mailTitle = ‘test’;
var mailMessage = ‘test’;
MailApp.sendEmail(sendToAddress,mailTitle,mailMessage);
}
—————————————
お世話になります。
最近地震が多く、何か社員の安否確認をする方法がないかと検索していましたら、この記事にたどり着きました。
メール配信までうまくいったのですが、震度3以上のすべての都道府県の連絡が来るので、これを選択した都道府県だけをピックアップして送信することは可能なのでしょうか。
コード系が疎く調べてみたのですが、なかなかうまくいかなかったのでご質問させて頂きます。
コメントありがとうございます。
可能ですが、XMLの形式的に少々泥臭い実装方法が必要そうです。
HeadタグではなくBodyタグの方から都道府県名や震度情報を取るようにすれば、絞り込みも容易なのですが文字を分割したり置換したりする必要がありそうかなと。
試しに実装してみまして、動作確認中です。(不謹慎ではありますが、とある県で地震が発生すれば確認完了の状況です)
確認出来たら公開いたします。
このブログを公開した際に、コメントいただいた内容も試そうとしたのですが、さっと作れるものではなさそうだったので断念していました^^;
出張中に他県で地震が発生することもありうるので、一旦こういう実装にしていました。
試しに書いてみたコードを掲載してみました。
良かったら試してみてください。
追記:都道府県名を指定して通知
大変参考になります。
ありがとうございます。
一点教えていただきたいのですが、
都道府県指定の部分で仮に「宮城県」と入力した場合、「宮城県北部」でも取得されますでしょうか?
震度は1-9で設定しており、実際に先日、震度3の地震が来た際、スクリプトは実行されましたが該当無しとなってしまいメールが飛んできませんでした
コメントありがとうございます。
動作確認のため、
高頻度フィード(https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml)のURLを
長期フィード(https://www.data.jma.go.jp/developer/xml/feed/eqvol_l.xml)に変更したところ、
「宮城県北部」でも処理対象になることを確認いたしました。
ですので、県名のチェックを行っているロジックが問題ではなさそうです。
届かなかったのは、プログラムの実行時刻と、
入電のタイミングによるものかもしれません。
※高頻度フィードは「毎分更新」なので、取得するデータの範囲を少し広げるなどの考慮が必要かもしれません。
単純に時間を遡って探索にしてしまうと、通知済のメールが再通知される問題が発生するので、
そういった点も考慮する必要がありそうです。
時間があるときに改良してみます。
入電とスクリプトの実行が被った場合の対処を行ってみました。
おそらくこれで解消されるかと思います。
追記:1分の誤差に対処
回答だけでなく、改善策までありがとうございます・・・!
さっそく試させていただきます。
URLがいつの間にか変わってますね(SSL対応されてる)
リダイレクトされるので動作には影響ないようですが、後日更新しときます。
http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml
↓↓↓
https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml
度々申し訳ございません。
同じエリアでも通知が飛ぶ時と該当無しとなるときがあり悩んでおります・・・
①
高頻度フィードは「毎分更新」とのことですが
例えば指定エリアで地震が発生し、スクリプトが起動するまでの間に「指定外のエリアで地震が発生した場合」、
指定エリアで発生した地震の情報を取得してくれるのでしょうか・・・?
②
トリガーは30分ではなく、5分や1分おきの起動でも大丈夫でしょうか・・・?
③
1.スプシのシート名を指定。2.都道府県名を変更。3.震度を変更。4.メールアドレスを変更しておりますがうまくいきません・・・
気になった点として、以前いただいたコメントで「震度は1-9で設定しており」とありますが、
情報の取得元について内に書いてある通り、1つ目のxmlでは震度3以上の情報を探索します。
※全ての地震情報を探索するプログラムではありません。
該当なしとなっている地震の情報は、1つ目のxmlにも2つめのxmlにも地震情報が載っていますでしょうか?
「具体的に、○○県を指定しおり、このxmlには地震情報があるのに取れない」といった質問を頂ければ私の方でも確認してみます。
以下質問の回答です。
>①
高頻度フィードのxml内に存在する場合は取得されます。
>②
プログラム的には問題ございませんが、Googleサービスの割り当てに関する制限がありますのでご注意ください。
https://developers.google.com/apps-script/guides/services/quotas
>③
すみません。具体的な質問内容でないと回答が難しいです。
大変申し訳ございません。
意味を理解しておりませんでした・・・
試したところ上手く作動しました。ありがとうございます。
もう一点だけ教えていただきたいのですが、
震度6弱以上の時に作動させたい場合は
strPref.match(/震度[7-9]
でよろしいでしょうか?
動作したとのことで良かったです。
「震度6弱以上」でしたら、「strPref.match(/震度[6-9]」です。
記載した震度を含む範囲の震度で処理が行われます。
「震度6弱以上」でしたら、「strPref.match(/震度[6-9]」の件、
承知しました。
ご教授いただきまして、本当にありがとうございました。
感謝です。
こちらのサイトを参考にしているのですが、
現在、気象庁のurlが itemタグがなくなっているようです。
MaxIntタグで震度が拾えるようなのですが、
どのように変えればよいでしょうか…
初心者なもので、たよってスミマセン。
コメントいただきましてありがとうございます。
今「高頻度フィード」では地震情報がなかったので確認できませんでした。
xmlのurlを教えていただければ私の方でも確認してみます。
こんなに早く確認頂けるなんて、嬉しいです!ありがとうございます。
もう一度確認していて、違いをやっと理解できました。
「地震速報」で発令があったものはタグがありますが、
「震源・震度に関する情報」で発令があったものはタグがなく、こちらを見ておりました。
こちらの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
おっしゃる通りです!
似たような情報が混在してて分かりずらいですよね^^;
解決したようで良かったです
こちらのスクリプトを利用してmattermostへの通知ができるようにしてみました。
たいへん助かっております。ありがとうございます。
情報共有に変更部分を記載しようとしたのですが、スパム扱い担ってしまいましたので、ご報告まで
コメントありがとうございます。
mattermostへの通知良いですね。
私は使ったことないので時間が出来たら試してみようと思います。
先日コメントした者です。
無事動き情報も取得できましたのでご連絡いたします。
原因は、スプレットシート設定にあることが判明しました。
> //前回スクリプト実行時刻の保持(スプレッドシートから取得)
>var sheet = SpreadsheetApp.getActiveSheet();
この部分です。
この後シートを特定するscriptを入れることで、解消しました。
var sheet= ss.getSheetByName(‘速報時刻’);
の様に私はしました。
返信遅くなりました。
複数シートがある場合はそのような考慮も必要ですね。
解決して良かったです。
こちらのサイト、大変参考になります。ありがとうございます。
震度5強以上で作動させたい場合はどのような設定が可能でしょうか。
教えて頂けたらありがたいです。
コメントありがとうございます。
「設定」というのは何を指していますでしょうか?
質問の仕方が悪くて大変申し訳ございません。
strPref.match以降の記載についての質問でした。
コメントで「「震度6弱以上」でしたら「strPref.match(/震度[6-9]」です。記載した震度を含む範囲の震度で処理が行われます。」との記載を拝見したのですが、震度5強の場合(震度5弱ではなく)の記載要領が分からず質問させていただきました。
震度[6-9]の箇所は正規表現で定義しています。
震度5強の際にどういった内容が気象庁から出るかについては存じ上げませんが、xmlの仕様を確認したり、実際に震度5強の地震が発生した際のデータを探すことで分かるかと思います。
当初は詳しい仕様を見つけられなかったので試行錯誤してましたが今は公開されているかもしれません。
質問の仕方が悪く申し訳ありません。
strPref.match以降の記載についての質問でした。
コメントで「「震度6弱以上」でしたら「strPref.match(/震度[6-9]」です。記載した震度を含む範囲の震度で処理が行われます。」
との記載を拝見したのですが、震度5強の場合(震度5弱ではない場合)の記載が分からず質問させていただきました。
ご回答ありがとうございました。
初心者なものですぐには難しいと思いますが、少しずつ調べてやってみます!
また重複して質問してしまったようで重ねて申し訳ありませんでした。