15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

社内でコミュニケーションの促進のため、誕生日の当日にSlackに通知するbotを作ってみた

Last updated at Posted at 2019-02-10

#事前準備

  • SlackのIncoming WebHooksを有効化する。
    1.「Add Configuration」をクリック
    スクリーンショット 2019-02-10 21.17.31.png
    2.「Post to Channel」に投稿したいチャンネルを選択して「Add Incoming WebHooks integration」をクリック
    スクリーンショット 2019-02-10 21.17.19.png
    3.「WebHook URL」の発行を確認する (後で使用します)
    スクリーンショット 2019-02-10 21.30.56.png.png

  • GoogleSpreadSheetに誕生日リストを書き出します。

    1. Googleにログインし、GoogleSpreadSheetにアクセスします。
    2. 誕生日リストを準備します。名前と誕生日(年齢を算出しないため月と日のみ)をシートに記載します。シート名は「birthday」としました。
    スクリーンショット 2019-02-10 19.00.03.png

#GoogleActionScriptにSlackに通知する処理を記載します。

  • 処理の説明

    1. 誕生日リストをGoogleSpreadSheetから取得
    2. 実行する日付と一致している誕生日の人をフィルタ
    3. メッセージを作成
    4. Slackに投稿
  • 後述するGoogle Action Scriptのコードを以下の手順で保存します。
    1.Tool → Script editorを選択し、スクリプトエディタを表示します。
             スクリーンショット 2019-02-10 21.58.37.png
            スクリーンショット 2019-02-10 18.47.12.png
    2.code.gsと書かれた画面に以下のスクリプトを上書き貼り付けます。
    スクリーンショット 2019-02-10 22.01.26.png
    3.function postSlack(name)関数に事前準備の3で取得したWebHook URLを編集します。 スクリーンショット 2019-02-10 22.03.11.png

  • Google Action Script

function birthdayPostSlack()
{
  var birthDayNameList = getBirthDayNameList();
  for (var i = 0; i < birthDayNameList.length; i++) {
    var name = birthDayNameList[i][0];
    var birthDay = birthDayNameList[i][1];
    var nowDate = Utilities.formatDate(new Date(), 'Asia/Tokyo','MM/dd');
    if(nowDate == Utilities.formatDate(new Date(birthDay), 'Asia/Tokyo','MM/dd')) {
      postSlack(name);
    }
  }
}

function getBirthDayNameList() 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("birthday"); // 誕生日リストを取得するシート名
  var last_row = sheet.getRange("A:A").getLastRow();
  var start_row = 2; // 開始行
  var birthDayNameList = [];
  for (var i = start_row; i < last_row; i++) {
    var slack_name = sheet.getRange(i, 1).getValue();
    var birthDay = sheet.getRange(i, 2).getValue();
    if (slack_name != "") {
      birthDayNameList.push([slack_name, birthDay]);    
    }
  }
  return birthDayNameList;
}

function postSlack(name)
{
  var payload = {
    text: getMessage(name)
  };
 
  var url = "https://hooks.slack.com/services/T0GAF04H2/BG40PNXT8/XXXXXXXXX"; // 事前準備の3で取得したWebHook URL
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload": JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options); 
}

function getMessage(name)
{
  var reactions = [];
  for (var i = 0; i < 4; i++) {
    reactions.push(':tada:');
    reactions.push(':congratulations:');
    reactions.push(':blush:');
  }
  reactions = reaction_shuffle(reactions);
  var len = Math.floor(Math.random() * Math.floor(6));
  var reactions = reactions.slice(1, len + 2);  
  var reaction = "";
  for (var i = 0; i < reactions.length; i++) {
    reaction = reaction + reactions[i];
  }
  return '今日は' + name + 'さんの誕生日です!' + ' :birthday:' + '\r\n' + 'おめでとうございますー!!' + reaction; 
}
  • 通知されるかどうかテストします。

    1.Run → Run function → birthdayPostSlackをクリック
    スクリーンショット 2019-02-10 22.08.35.png
    2.Slackに通知されているか確認
    スクリーンショット 2019-02-10 22.10.05.png

#Slack通知の自動化

  • トリガーの設定

    1.「時計アイコン」をクリック

スクリーンショット 2019-02-10 22.20.59.png 2.「トリガーを追加」をクリック スクリーンショット 2019-02-10 22.22.46.png 3.「時間主導型」をクリックして、「日付ベースのタイマー」、「午前10~11時」を選択して保存 スクリーンショット 2019-02-10 22.24.47.png 4.保存後の画面 スクリーンショット 2019-02-10 22.26.28.png
15
9
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
15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?