【GAS】【SLACK】スプレッドシートで作った予定をSLACKに送信する

#概要
プロジェクトのスケジュールをスプレッドシートで管理しているのですが、それを見に行くのが億劫と言われたので、毎日SLACKにリマインドさせることにしました

#slack通知用のwebhookをチャンネルに追加
「プロジェクトのメニュー　」 -> 「その他管理項目」 -> 「App管理」 -> 「カスタムインテグレーション」 -> 「Incoming Webhook」 -> 「設定の追加」
から、追加するチャンネルを選択して追加

#単純な通知機能を実装
```
function sendTest()
{
  var postUrl = "Webhook URL";
  var postChannel = "チャンネル名";
  var sendMessage = "test";
  sendHttpPost(sendMessage, postUrl, postChannel);
}

/**
 * slackへのリクエスト送信
 */
function sendHttpPost(message, postUrl, postChannel)
{
    var jsonData = {
        "channel" : postChannel,
        "text"    : message
    };
    var payload = JSON.stringify(jsonData);
    var options = {
        "method"      : "post",
        "contentType" : "application/json",
        "payload"     : payload
    };

    UrlFetchApp.fetch(postUrl, options);
}
```
▼通知結果
![スクリーンショット 2018-12-04 16.20.37.png](https://qiita-image-store.s3.amazonaws.com/0/298813/755f7228-15d6-2341-8dbd-9267a117515b.png)

# スプレッドシートの値を読み込んで結果を通知させる処理
▼スプレッドシート
<img width="701" alt="スクリーンショット 2018-12-04 16.34.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/298813/f781873d-3593-82b5-0b4d-0b4b85c13d48.png">

```
function scheduleReminder() {
  var postUrl = "Webhook URL";
  var postChannel = "チャンネル名";
  var sendMessage = "<!here>\n";
  var jpDateList = ['日', '月', '火', '水', '木', '金', '土'];
  var dateObject = new Date();

  if (dateObject.getHours() == 9) {
    datetime = Utilities.formatDate(dateObject, "Asia/Tokyo", "yyyy/MM/dd");
  } else {
    dateObject.setDate(dateObject.getDate() + 1);
    datetime = Utilities.formatDate(dateObject, "Asia/Tokyo", "yyyy/MM/dd");
  }
  sendMessage += "[" + datetime + " (" + jpDateList[dateObject.getDay()] + ")] の予定です。\n";

  sendMessage = sendMessage + getRemindMessage(datetime);

  // 送信
  sendHttpPost(sendMessage, postUrl, postChannel);
}

function getRemindMessage(date) {
  var message = "";
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var workingSheet = spreadsheet.getSheetByName("スケジュール");
  
  // ここで今日のrowを取得
  var dateColumn = 1; // 日付が入力されているカラム
  var contentRow = 2;
  var startRow = 2;
  var lastRow = workingSheet.getLastRow();
  var isFind = 0;
  for (var rowCount = startRow; rowCount <= lastRow; rowCount++) {
    var tmpValue = workingSheet.getRange(rowCount, dateColumn).getValue();
    if(typeof(tmpValue) == "string"){
      // 日付型じゃない
      continue;
    }
    
    if (date == Utilities.formatDate(tmpValue, "Asia/Tokyo", "yyyy/MM/dd")) {
      contentRow = rowCount;
      isFind = 1;
      break;
    }
  }
  
  if (isFind == 0) {
    return "見つかりませんでした。";
  }
  
  // 今日の予定が入っている部分を抜き出してメッセージに追加
  var titleRow = 1; // タイトルが入力されている行
  for (var titleColumn = 3; titleColumn < 7; titleColumn++) {
    var titleName = "◆ " + workingSheet.getRange(titleRow, titleColumn).getValue() + "\n";
    var content = workingSheet.getRange(contentRow, titleColumn).getValue();
    if (content == "") {
      // 予定がなければSKIP
      continue;
    }
    content = "```" + content + "```\n\n";
    message = message + titleName + content;
  }
  
  if (message == "") {
    return "何も予定はありません。";
  }
  
  return message;
}

function sendHttpPost(message, postUrl, postChannel) {
  var jsonData = {
    "channel" : postChannel,
    "text"    : message
  };
  var payload = JSON.stringify(jsonData);
  var options = {
    "method"      : "post",
    "contentType" : "application/json",
    "payload"     : payload
  };
  
  UrlFetchApp.fetch(postUrl, options);
}
```
▼通知結果
![スクリーンショット 2018-12-04 16.35.44.png](https://qiita-image-store.s3.amazonaws.com/0/298813/7e1afe83-7061-7fda-035c-61f99b6b7027.png)

#GASからスクリプトを定期実行させる
時計のマークからトリガーを追加
<img width="288" alt="スクリーンショット 2018-12-04 16.37.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/298813/898ed998-47f3-25c4-61b0-79a6ee30f9f1.png">
指定の関数が特定の時間で実行されるようにトリガーを新規作成
![スクリーンショット 2018-12-04 16.37.57.png](https://qiita-image-store.s3.amazonaws.com/0/298813/f618fcbf-888b-0de5-2d3c-f6d59a227e80.png)