【DX推進】GASを使って学習で取り組む問題をスラック通知することで朝の学習を強制的にルーティング化する方法

どうもエンジニア２年目を迎える元教員です。

https://note.com/hajimari_nagano/n/nd39730300afc?from=notice

１０月に実施される「情報処理技術者検定」を受検する予定なのですが、

**学習時間がちゃんと確保できてへん！！**

基本は夜寝る前に勉強をしていました。
しかし最近はタスク優先になってしまったり寝てしまったり・・・

そこで

- **強制的に朝やろう**
- **皆にやっているアピールをしよう(人の目がないとサボる）**

結果、
**指定した「応用技術者試験ドットコム」の問題URLをGASで取得し、Slackへ通知するbotを作成する**
にしました。

https://www.ap-siken.com

非エンジニア、初学者にも優しい内容となっております。
ぜひお試しあれ。。。



# 完成形はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287130/e3af9257-860a-a754-15aa-c8afaa2f2af3.png)

毎朝５時に問題のURLが通知されます。

# スプレッドシートの記入

slackへ通知する日付をA列に、載せたいURLをB列に書きます。
こちらのURLについては自動でスクレイピングする方法があります。
しかし現時点では手入力をしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287130/dd65d51d-9567-4501-a1bd-b1e197eb0686.png)


# SlackのIncoming WebHooksの登録

まずは通知をするslackチャンネルでIncoing WebHooksの設定をする必要があります。

1. まずはインテグレーションからAppを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287130/c818496a-9db1-291b-2fd6-bfc737397a5c.png)

2. 通知するチャンネルを選択し、インテグレーションを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287130/ed86ab7b-6527-f0ea-31d3-dcae9fbb09f0.png)

3. Webhook URLが表示されるので、それを下記のpostUrlへ記入します。

```
var postUrl = 'https://hooks.slack.com/services/＊＊＊＊＊＊＊＊＊＊';
var username = 'morningStudybot';  // 通知時に表示されるユーザー名
var icon = ':hatching_chick:';  // 通知時に表示されるアイコン
```

ここまでが基本設定となります。


# slackに投函するまで

## スプレッドシートから情報取得

```
Function myFunction() {

  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシート 
  const sheet = spreadsheet.getActiveSheet();                // シート  
  const activeCell = sheet.getActiveCell();                  // セル 

  var date = new Date();
  let now = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd');
  let URL = '';
  for(var i=3; i<10000000; i++){
    let Notificationdate = Utilities.formatDate(sheet.getRange(i,1).getValue(), 'Asia/Tokyo', 'yyyy/MM/dd');
    if(datee == now){
      URL = sheet.getRange(i,2).getValue();　
      break;
    }
  }
  // 投稿内容  
  var message = "\本日の朝活問題だよ〜\n"  
                +  "問題URL:"     + URL     + "\n" 
                +  "1日最低５問よ〜" + "\n" 
"---------------------------------------------------------------------------------------------------------------------------------\n";
```

処理内容は簡単です。
やっていることとしては

1.今日の日付を取得
2.A列が今日の日付ならB列からURLを取得
3.URL取得後、messageに表示内容を格納

## JSONに変換後Slackで投稿

```
var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}
```
JSON形式に変換し、UrlFetchApp.fetch()メソッドを使って、Slackに投稿します。


# 指定時間でSlackに投稿するには

GASのトリガー設定では「時間主導型」という設定ができます。しかしこちらは１時間単位でしかできません。
具体的にいうと「午前５時〜午前６時」に設定してしまうと５時何分に実行されるかわからないという問題点が生じます。
今回はピッタリ５時に設定できる方法を紹介します。

やることは以下の２ステップです。
1. 5:00に実行するトリガー登録をするスクリプトを毎日午前4～5時に実行
2. 5:00になったら処理したいスクリプトが実行


それでは以下の方法で実装していきましょう。

### myFunctionメソッドを５時に実行するトリガー
５時に実行するトリガーを以下のように実装しました。

```
function setTrigger(){
  //Dateオブジェクトで実行した時間を取得
  let time = new Date();
  //setHours,setMinutesでトリガー登録したい時間を設定
  time.setHours(05);
  time.setMinutes(00);
  //newTriggerメソッドで特定日時でトリガー登録
  ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
}
```
これで５時にmyFunctionメソッドが実行されます。


### 「時間主導型」で以下のようにトリガーを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287130/9df6632b-1550-0621-ce65-bd329b5a04bb.png)

これで今回設定したsetTriggerメソッドが4時〜５時の間に実行されます。


# GASは初学者にも優しくDX化の入り口

今回はSlack通知にしましたが、LINEなどのSNSに同様の方法で通知することも可能です。英検など他のテスト対策や情報を通知できます。
また教員時代に連絡ツールとしてClassroomを使っていました。こちらにも類似の方法で通知が可能となります。

特定の時間に通知したいものがあっても

**「あ、忘れてた！！」**

ってことありませんか？
そういったことの予防策にもなるため、一度自動化に取り組んでみたらいかがでしょうか？？

お読みいただき、感謝！！！