SlackのBot通知を任意の条件の日で実装させてみる Part.1 JavaScriptでの通知日時設定の実装

# はじめに
お久しぶりです。中の人です（なんて名前でやっていたのかも覚えていない…）

ありがたいことに、SEとしてたくさんの業務をこなしてきましたが、今回久しぶりに業務そのものではなく、日頃気になっていた人力での作業（作業といえるものでもないかもしれない）をなんとか自動化させたいと思い、久しぶりにちょっとひとりでいじってみました。
結構、似たような境遇の人はいるんじゃないかと勝手に思ったので、記事に落とし込むところも久しぶりにやってみました。せっかくなので、やってみたくなったら試してみてね。

では、早速書き進めていきます。
ちなみに今回は全3回のシリーズものです。
それぞれ、こんな内容でやっていきます。
- Part.1：[JavaScriptでの通知日時設定の実装](https://qiita.com/icchy_sh33p/items/068d450735029d95adc4/)　←このページです
- Part.2：[実装通知判定関数のGoogle Apps Scriptへのアップロード](https://qiita.com/icchy_sh33p/items/43c28fe25b7842ed260f)
- Part.3：[Slackとの連携](https://qiita.com/icchy_sh33p/items/2d267a1fa68514d9c591)
# 前提条件
今回準備したものと解決させたかったことはそれぞれ以下の通り。
## 開発ツール
### JavaScriptでの実装
日時指定のロジックの実装に使用しました。
任意の環境で基本は大丈夫ですが、初心者の方もいるかと思うので書き残しておきます。
・Atom
　→エディタツールであればなんでもOKですが、コードを色つけしてくれるのでおすすめ。
　　今回はロジックの実装と動作確認用の白紙の.htmlファイルの作成に使用しました。
・Google Chrome
　→これも任意のブラウザアプリでOKですが、開発者用ツールでコンソールを開くのが楽でした。
### Googleアカウント
Google Apps Scriptとして日時ロジックを実装したJavaScriptを乗せる先として使用。
### Slack
最終的に通知先として指定するワークスペースとチャンネルを作成します。
## 実施内容
### 実現したかったこと
毎月、所属部署の部長が最後の営業日に手動で勤怠や交通費などの申請期限の告知を連絡してくださっていたが、手間がかかるのではないかと思い、自動でBot通知が来るようにしたかった。
### 実装した仕様
日時ロジックによって、以下2つの条件を満たす日に限りBot通知が来るようにした。
- 1ヶ月のうち、一番最後の祝日ではない日→具体的には以下を考慮。
   - 月末に近い祝日は4/29のみ（GWを考慮し、4/28を4月の最終営業日と仮置き）
   - 年末年始の休暇は12/29〜1/3とする
- 1ヶ月のうち、一番最後の平日

Bot通知文言は下記。
>【周知】
>月末最終営業日です。勤怠／交通費申請は来月1日中、顧客請求は本日7月31日中に提出してください。
>※長期休暇前の対応は、別途締切日時をご確認ください。
# 実装
結論からいうと、以下コードが実装結果。
```JavaScript:getLastBusinessDay.js
  var date = new Date();
  var currentDate = new Date(date);
  var lastDate = new Date();
  var lastBusinessDate = new Date();

  // 月別での通知設定日時の変更
  if (currentDate.getMonth == 4 || currentDate.getMonth == 12) {
    lastDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), 28);
  } else {
    lastDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0);
  }
  // 曜日別での通知設定日時の変更
  var lastDay = lastDate.getDay();
  var lastDayJpName = ["日", "月", "火", "水", "木", "金", "土"][lastDay];
  if (lastDayJpName == "日"){
    lastBusinessDate.setDate(lastDate.getDate() - 2);
  } else if (lastDayJpName == "土") {
    lastBusinessDate.setDate(lastDate.getDate() - 1);
  } else {
    lastBusinessDate.setDate(lastDate.getDate());
  }

  console.log(currentDate);
  console.log(lastDate);
  console.log(lastDayJpName);
  console.log(lastBusinessDate);

  // Slack通知の実行
  if (currentDate.getDate() == lastBusinessDate.getDate()) {
    // 表示用月を格納する変数の定義
    var showCurrentMonth = currentDate.getMonth() + 1;
    // 実行Slack通知の詳細を実装
    console.log("Slack通知を実行します");
    console.log("【周知】\n月末最終営業日です。勤怠／交通費申請は来月1日中、顧客請求は本日"
         + showCurrentMonth + "月" + currentDate.getDate() + "日中に提出してください。\n"
         + "※長期休暇前の対応は、別途締切日時をご確認ください。");
  }
```
ローカル環境上では、いったん問題なくコンソール上にログが出力されればOKとした。
結果、以下ログ出力が確認できた。
#### Slack通知対象日だった場合
![スクリーンショット 2022-07-31 22.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274468/f70d8178-7849-e74b-3f3d-a31afdccb0ba.png)
#### Slack通知対象外日だった場合
![スクリーンショット 2022-07-31 22.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274468/fdeb9c4c-4d32-0de8-d373-cf79434569d3.png)
## 参考：動作確認用表示.htmlファイル
これをそのまま作成、Google Chromeなどのブラウザアプリで開き
『右クリック』→『検証』→『Console』
を選択すれば、実行結果が表示されるためそれで確認できました。
```html:test.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="JavaScript">
<title>月末最終営業日取得実装確認用</title>
</head>
<body>
<script type="text/javascript" src="getLastBusinessDay.js"></script>
</body>
</html>
```
さて、これでローカル環境での通知日時判定ロジックの実装は完了しました。
次回は、Google Apps Scriptへのアップロードを行い、自動で定期実行されるよう設定してみましょう。

続く！