7
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

事前準備

  • 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
7
Help us understand the problem. What are the problem?