毎日スラックへ問題(タスク)を通知してくれるbot ~初めてのGAS SpreadSheet編~

## 毎日スラックへ問題を送信してくれるbotがついに完成！

どうしても、どうしても、スプレッドシートに貯めておいた問題リンクを、スラックへ送ってくれるbotが欲しかったので、GASのこと本当に何も知らない状態で記事など調べつつbot作成に取り掛かってみました。

結果、**撃沈**。:clap:

これじゃ一生できん！と思ったので、基礎知識を学んでから再挑戦しました。
(何も知らない状態だとちょっと苦手意識が芽生えてしまいなかなか進まなかったりもしたので、基礎を学ぶことはめちゃくちゃ大事だなと思いました！)

まだまだ修正できるところはたくさんありますが、完成したのがうれしかったので備忘録として残しておきます！

## 作成したもの

**毎日、スプレッドシートにためてある問題リンクをSlackへ送ってくれるbot**

<img width="1104" alt="Slack___drill_bot___ooo00ooo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/e76e05b8-6bbd-5e85-8295-c688c15ce026.png">

今回送信したのは、問題リンクですがタスクやスケジュールなどにも応用可能。

## 準備

作成するにあたり必要だったもの

```
①botの元となる問題リンクが載ったスプレッドシート
②botを送信するためのチャンネル
③Webhook URL
④スクリプト作成
⑤トリガーの設定
(⑥仲間への宣言)
```

### ①botの元となる問題リンクが載ったスプレッドシート

<img width="1011" alt="Rubyドリル_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/faa6a651-1786-87c0-4a46-9ce0665a8322.png">

A列には問題名、B列にはリンク、C列にはドリルを行う日程を入力。

### ②botを送信するためのチャンネル(Slackで作成する)
練習などでたくさん送るので誰もいないチャンネルを作成するのがおすすめです。

### ③Webhook URL
スラックとスプレッドシートをつなげるために必要です。
参考にした記事は[こちら](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)です。感謝です:bow_tone2:

### ④スクリプト作成

```javascript
// スラックに飛ばすための作業
function sendMessage() {
  //Webhook URLを以下に入力
  const postUrl = "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  const sendMessage = createMessage();
  const jsonData = {
    "text": sendMessage
  };
  const payload = JSON.stringify(jsonData);
  const options = {
    "method": "post",
    "contentType": "application/json",
    "payload": payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

// スプレッドシートでの作業
function createMessage() {
  // spreadsheetからscheduleのシートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName("シート1");

  // Dateオブジェクトを文字列に変換する
  // Utilities.formatDate(date, timeZone, format)
  const dataObject = new Date();
  const today = Utilities.formatDate(dataObject, "Asia/Tokyo", "yyyy/MM/dd");

  // カラムを取得するための準備(配列から取得するためのインデックス番号用意)
  // ドリルリンクの入力されているカラム(B列)
  const drillUrlColumn = 2;
  // 作業日が入力されているカラム(C列)
  const workDateColumn = 3;
  // ドリル名が入力されているカラム(A列)
  const drillNameColumn = 4;
  // データを取得するどの行からにするかの設定(今回は1行目から)
  const startRow = 1;


  const columnFVals = sheet.getRange('C:C').getValues(); // C列の値を配列で取得
  const lastRow = columnFVals.filter(String).length; // 文字が入力されている最終行を取得

  var toDayDrill = ""; // タスクリスト
  var output = ""; // createMessageからの最終的な出力

  // 最初の行から最後の行になるまで繰り返す
  for (row = startRow; row <= lastRow; row++) {
    // ドリルのリンクの取得
    var drillUrl = sheet.getRange(row, drillUrlColumn).getValue();
    // 作業予定日を取得
    var workDate = sheet.getRange(row, workDateColumn).getValue();
    // ドリル名を取得
    var drillName = sheet.getRange(row, drillNameColumn).getValue();

    //日付の整形し再代入
    workDate = Utilities.formatDate(workDate, "Asia/Tokyo", "yyyy/MM/dd");

    //今日の日付と作業予定日を比較、taskListの生成
    if (today == workDate) {
      toDayDrill = "■" + `${drillName}` + "\n" + `${drillUrl}` + "\n" + `${toDayDrill}`;
    }
  }

  output = `${today}のドリルです！ \`\`\`${toDayDrill}\`\`\``;
  return output;
}
```

参考記事は[こちら](https://qiita.com/yuzuru_xa/items/d9085318aee3e52fea2c)です。感謝です:bow_tone2:！

#### 応用する際のメモ
もし問題(タスクなど)がない日があった場合は下記で条件分岐をする。

```javascript
output = `${today}のドリルです！ \`\`\`${toDayDrill}\`\`\``;
return output;
```

### ⑤トリガーの設定

今回は大体○時から○時の間にbot送れば良かったので元々備わっているトリガーで設定しました。
参考記事は先ほど同じ[こちらの記事](https://qiita.com/yuzuru_xa/items/d9085318aee3e52fea2c#%E9%96%A2%E6%95%B0%E3%81%AE%E5%AE%9A%E6%9C%9F%E7%9A%84%E3%81%AA%E5%AE%9F%E8%A1%8C)です。感謝です:bow_tone2:！!!

### ⑥仲間への宣言
個人的に仲間に宣言できたことがすごく良かったなと思いました。
宣言することで作りたいものが明確になるので、必要な情報がだけが目につくようになった気がします！
結果作成までの時間が大幅に減りました！:clap:

紙などに、こういうの作りたい！いつまでに作るぞ！と宣言するのもすごく良いと思いました〜！

## もっとこうしたいな~メモ
- botのアイコンをかわいくする
- スラックに点数を送信すると○点以下だったら別日に再度ドリルの通知がくる
- 点数を送信すると褒めてくれる