【Google Apps Script】LINE Notifyで毎日降水量をチェックしたい

# はじめに
研究の関係上、私は毎日新ひだかの降水量を確認する必要がある。
そこで、LINE Notifyに毎日、前日の降水量を通知してもらえるbotを作成したので記事にしました。
簡単に言うと、Google Apps Scriptでスクレイピングして、LINE Notifyに毎日降水量を通知させようというものです。

# LINE Notifyからトークンの取得
[LINE notifyのHP](https://notify-bot.line.me/ja/)にログイン、マイページをクリックしてトークンを発行する。ページから移動したら発行したトークンは二度と表示されないので注意。
トークンを取得したら、毎日通知をしたいグループにLINE Notifyを招待する。

# Google Apps Scriptにコードを書く
JavaScriptに似ているのでとっつきやすい。
Google Driveの 新規 > その他 > Google Apps Scriptを選択してファイルを作成。

## スクレイピングのためのライブラリを導入
GASのWebスクレイピングではParserライブラリを使いがち(らしい)。
GASのエディタ画面のライブラリを選択し、そこでスクリプトIDを入力して追加。
スクリプトIDは、[このページ](https://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html)の下部にある"[Completed code of Parser library.](https://script.google.com/home/projects/1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw/edit)"から飛んだ先にあるGASのプロジェクトの設定のスクリプトIDから得られる。
私が導入したときは以下のIDだった(2022/11/20)。
```
1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
```

## 書いたコードはこちら
前日の日付を取得し、アメダス笹山の1時間毎の降水量をスクレイピング。その後、降水量のデータをLINE Notifyを利用しLINEに送る。このコードでは閾値を5 mmに設定し、1時間最大降水量が5 mm以上であれば詳細な降水量のデータを、5 mm未満であれば簡素な降水量のデータを通知するようにしている。
```diff_javascript
//アメダスから降水量を取得
function getPrecipitation(year, month, day) {
  //降水量閾値設定
  THRESHOLD = 5 

  //スクレイピングし、降水量の部分を取得
  let response = UrlFetchApp.fetch(`https://tenki.jp/past/${year}/${String(month).padStart(2,'0')}/${String(day).padStart(2,'0')}/amedas/1/4/22206.html`);
  let text = response.getContentText("utf-8");
  let topic_block = Parser.data(text).from('<table class="common-list-entries amedas-table-entries"').to('</table>').build();
  let content_block = Parser.data(topic_block).from('<tr>').to('</tr>').iterate();

  //降水量と時間を配列に格納
  let times = []
  let values = []
  for(let i = 1; i<content_block.length -1 ;i++){
    time = Parser.data(content_block[i]).from('<td>').to('</td>').iterate()[0]; //時間
    value = Parser.data(content_block[i]).from('<td>').to('</td>').iterate()[2]; // 降水量
    times.push(time);
    values.push(Number(value).toFixed(1));
  }
   let value_max = Math.max.apply(null,values); //1日の1時間最大降水量を取得

  //降水量によって通知内容を変更
   if(value_max >= THRESHOLD){ //閾値以上であれば詳細な降水量を通知
     ret = `\n${Number(year)}年${Number(month)}月${Number(day)}日の1時間最大降水量は${value_max} mmでした。\n\n時 　 降水量(mm)\n`
     for (let i = values.length -1; i >= 0; i--){
       ret += `${times[i]}　${values[i]} mm\n`
     }
   }else{ //閾値以下であれば最大降水量のみを通知
     ret = `\n${Number(year)}年${Number(month)}月${Number(day)}日の1時間最大降水量は${value_max} mmでした。`
   }
   return ret;
}

//LINEnotifyを利用してLINEに通知
function sendToLINE(txt) {
  let token = ['ここにトークンを入力'];
  let options = {
    "method": "post",
    "payload" : {"message": txt },
    "headers": {"Authorization": "Bearer " + token}    
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

//実行
function main(){
  //前日の日付を取得
  let date    =  new Date();
  let day     = date.getDate();
  date.setDate(day-1); //前日に変更
  let year    = date.getFullYear();
  let month   = date.getMonth()+1;
  day         = date.getDate();
  console.log(`${year} ${String(month).padStart(2,'0')} ${String(day).padStart(2,'0')}`)

  //前日の降水量を取得し、LINEに通知
  let txt = getPrecipitation(year, month, day)
  sendToLINE(txt);
}

```

## 実行間隔を設定
GASのトリガー画面からトリガーを追加する。この時、実行する関数はmainを選択。
これで時間通りにLINEに通知がくるはず。

# おわりに
GASはとっつきやすくて良いですね。LINE Notifyも非常に便利でよろしい。

# 参考文献

https://tetsuooo.net/gas/82/

https://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html