LoginSignup
4
4

More than 5 years have passed since last update.

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

Posted at

概要

プロジェクトのスケジュールをスプレッドシートで管理しているのですが、それを見に行くのが億劫と言われたので、毎日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

スプレッドシートの値を読み込んで結果を通知させる処理

▼スプレッドシート
スクリーンショット 2018-12-04 16.34.41.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

GASからスクリプトを定期実行させる

時計のマークからトリガーを追加
スクリーンショット 2018-12-04 16.37.26.png
指定の関数が特定の時間で実行されるようにトリガーを新規作成
スクリーンショット 2018-12-04 16.37.57.png

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4