スプレッドシートで管理しているタスクをSlackにリマインドする方法

# 概要
<img width="1237" alt="Wantedly（ウォンテッドリー）はたらくを面白くするビジネスSNS.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/420bf597-ec1d-7cf6-dd67-989eeef3f4e1.png">

**https://www.wantedly.com/companies/zyyx/post_articles/119174**
↑の記事で紹介した内容の詳細です。

**:confounded: これ（公開スケジュールA列と担当B列）をもとに**
<img width="1436" alt="Wantedly_feedネタリスト_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/3fb23c97-78ea-fcc1-df02-77e185fc897c.png">

**:smile: こうする（Slackにリマインド）**
<img width="1001" alt="Slack_-_ZYYX2.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/f4c7df24-0e21-d6a0-06b2-a85914a13603.png">



# 手順
## STEP1 Slack管理画面より《Incoming WebHooks》を登録
**https://{対象ドメイン}.slack.com/apps/manage/custom-integrations**
にアクセスします。

*1*
<img width="1242" alt="Configure_Apps___ZYYX_Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/7571c1d8-e583-a30b-4b00-1df0b970c3b2.png">

*2*
<img width="1234" alt="Incoming_WebHooks2___Slack_App_Directory.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/b5f3cff8-5645-9b2a-4bfb-d378227413a6.png">

*3*
<img width="1234" alt="Incoming_WebHooks___ZYYX_Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/ce4f25e4-1893-8bbc-b8ad-b1c9cd3379ac.png">

*4*
<img width="1235" alt="Incoming_WebHooks___Slack_App_Directory.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/40669d38-ec66-70f9-e2ce-bb81b440a4b8.png">

*5*
<img width="1235" alt="Incoming_WebHooks3___Slack_App_Directory.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/944dee85-1f14-1239-7e38-a769322769c2.png">

**《Incoming WebHooks》の登録完了！**

### 補足
2018/06/08時点で外部サービスからSlackを連携する方法は以下の４つ存在します。
- 《API》
- 《Incoming WebHooks》
- 《Outgoing WebHooks》
- 《Bot》

内、Slackにメッセージ投稿する方法は《API》,《Incoming Webhooks》,《Bot》の３つです。
今回は安全面も考慮して、特定のチャンネルにしか投稿できない《Incoming Webhooks》を選択しました。

## STEP2 《GAS》にリマインドするロジックを登録
*1*
<img width="1239" alt="Wantedly_feedネタリスト2_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/23b8116e-f8b9-2fab-c45f-5bd0a29f5807.png">

*2*
<img width="1240" alt="Wantedly_feedネタリスト3_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/bb3b716c-f3fa-f572-6048-20762d709633.png">

**サンプルコード**

```javascript:remind.gs
// リマインドのメイン処理
function remind() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('記事一覧');
  var data = sheet.getDataRange().getValues(); // 処理効率上「記事一覧」シートの値を一括取得
  
  // 公開日の列番号
  var publishedAtColumunIndex = 0;
  // 担当者の列番号
  var assigneeColumunIndex = 1;
  
  // 現在日
  var currentDate = new Date();
  
  for (var i = 1; i < data.length; i++) {
    // 公開日
    var publishedAt = new Date(data[i][publishedAtColumunIndex]);
    // 担当者
    var assignee = data[i][assigneeColumunIndex];
    
    // 下書き開始リマインド日 ＝ 公開1週間前
    var writingRemindDay = new Date(publishedAt.getYear(), publishedAt.getMonth(), publishedAt.getDate() - 7);
    // 下書きチェックリマインド日 ＝ 公開3日前
    var checkingRemindDay = new Date(publishedAt.getYear(), publishedAt.getMonth(), publishedAt.getDate() - 3);
    
    // リマインド日の判定
    if (isSameDate(currentDate, writingRemindDay)) {
      post2Slack(assignee + ' Wantedly記事公開まで1週間です。下書きを初めていますか？');
    } else if (isSameDate(currentDate, checkingRemindDay)) {
      post2Slack(assignee + ' Wantedly記事公開まであと3日です。下書きは順調ですか？');
    } else if (isSameDate(currentDate, publishedAt)) {
      post2Slack(assignee + ' Wantedly記事公開日です。時間になったら公開をお願いします！');
    }
  }
}

// 同じ日付かどうか
function isSameDate(date1, date2) {
  return date1.getYear() === date2.getYear()
      && date1.getMonth() === date2.getMonth()
      && date1.getDate() === date2.getDate();
}

// Slackにメッセージ投稿
function post2Slack(message) {
  // "#対象チャンネル" -> 《Incoimg WebHooks》で指定したチャンネルに変更
  var jsonData =
  {
    "channel" : "#対象チャンネル",
    "text" : message,
    "link_names": true
  };
  var payload = JSON.stringify(jsonData);
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  // 'https://hooks.slack.com/...' -> 《Incoimg WebHooks》を登録した際の Webhook URL
  UrlFetchApp.fetch('https://hooks.slack.com/...', options);
}
```

*3*
<img width="1240" alt="Wantedly_feedネタリスト4_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/9dd79227-2417-7d93-ee50-196c23f712e8.png">

**《GAS》の登録完了！**

## STEP3 動作確認
※サンプルコードの場合、スプレッドシートのA列の日付を確認して、
1週間前/3日前/当日の3パターンのどれかに一致するとリマインドする仕組みです。
動作確認用に適宜A列の日付を変更して下さい。

*1*
<img width="1239" alt="Wantedly_feedネタリスト5_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/fd86c254-e6ee-2c9b-3944-2ddd2b51a665.png">

*2*
<img width="1240" alt="Wantedly_feedネタリスト6_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/65e63f79-bc19-34d9-b9ec-3d6e09c3ea79.png">

*3*
<img width="1001" alt="Slack_-_ZYYX2.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/a345b097-c987-ce26-bd70-9cb0051ca133.png">
<img width="1008" alt="Slack_-_ZYYX.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/8a3c5747-db2e-2ff1-9f0b-24209801783e.png">

**Slackにメッセージ投稿できていれば、動作確認完了！**

## STEP4 《GAS》にトリガーを登録する
*1*
<img width="1239" alt="Wantedly_feedネタリスト7_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/df990eb2-60ba-7859-83e8-9eb7c6b95999.png">

*2*
<img width="1239" alt="Wantedly_feedネタリスト8_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/03244a03-0581-7f00-6670-4235f9f52720.png">

*3*
<img width="1237" alt="Wantedly_feedネタリスト9_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/121942/acafacf7-b136-5244-92fd-80c58154295d.png">

**トリガーの登録も完了！**

---

**:blush: :two_hearts: :robot:**
**これでスプレッドの日付をもとに、自動でリマインドしてくれるようになります！
Botで無駄な仕事無くしたい（切実）**