GAS(Google Apps Script)とは軽量のアプリケーション開発のためのGoogleのワークスペースプラットフォームです。

これとGoogleスプレッドシートを使用すれば無料で小規模なアプリケーションを作成することができます。

本記事ではGASを使用して誕生日を通知するslackbotの作成手順を紹介させていただきます。

作成手順1. Slack側の設定

SlackのIncoming WebHooksにアクセスし、「Slackに追加」をクリックする

※追加したいワークスペースに切り替えて下さい

 

チャンネルを選択にSlackbotを導入したいチャンネル名を入力し「Incoming Webhookインテグレーションの追加」をクリック

 

 

「インテグレーションの設定」までスクロールします

Webhook URLはのちに使用するのでコピーします

必要に応じて名前(今回は誕生日通知botなど)、説明ラベル、アイコンを編集し「設定を保存」をクリック

 

これでSlack側の設定は終了です。

作成手順 2. スプレッドシートを作成する

スプレッドシートから「空白のスプレッドシートを作成」を選択します

作成したシートのA列に名前、B列にその人の誕生日(例:1/1)を記入します

※ここでは1行目に項目名を追加しているので、2行目から記入して下さい

また分かりやすいようにシート名をbirthdayと変更します

 

作成手順 3. GASを作成する

作成したスプレッドシートのメニューバーより拡張機能→Apps Scriptを選択

  1. <>(エディタ)を選択
  2. コード.gsを選択
  3. 下記コードをコピペして下さい(コピペする際、L65行目に作成手順1でコピーしたWebhook URLを書き換えることを忘れずに!)
  4. 保存ボタンをクリック

// 誕生日のトリガーを設定する関数
function setBirthdayPostTrigger() {
    const birthDayNameList = getBirthDayNameList();
    const triggerHour = 10; // 10時に設定

    const today = new Date();
    today.setHours(triggerHour, 0, 0, 0); // 指定時間に設定

    // 誕生日リストをループして、本日誕生日の人がいればトリガーをセットする
    for (const [slackName, birthDay] of birthDayNameList) {
      const birthDate = new Date(birthDay);
      const isTodayBirthday = isSameDay(today, birthDate);

      if (isTodayBirthday) {
        ScriptApp.newTrigger("triggeredPostSlack")
          .timeBased()
          .at(today)
          .create();
        break; // 一度トリガーを設定したらループ終了
      }
    }
  }

  // 二つの日付が同じ日かどうかを比較する関数
  function isSameDay(date1, date2) {
    return (
      date1.getDate() === date2.getDate() &&
      date1.getMonth() === date2.getMonth()
    );
  }

  // 誕生日トリガー実行時に呼ばれる関数
  function triggeredPostSlack() {
    const birthDayNameList = getBirthDayNameList();
    const today = new Date();

    // 誕生日リストをループして、本日誕生日の人がいればSlackにメッセージを送信する
    for (const [slackName, birthDay] of birthDayNameList) {
      const birthDate = new Date(birthDay);
      const isTodayBirthday = isSameDay(today, birthDate);

      if (isTodayBirthday) {
        postSlack(slackName);
      }
    }
  }

  // 誕生日リストを取得する関数
  function getBirthDayNameList() {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = ss.getSheetByName("birthday");
    const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues();

    return data
      .filter(([slackName]) => slackName) // 空でない名前のみ抽出
      .map(([slackName, birthDay]) => [slackName, new Date(birthDay)]);
  }

  // Slackにメッセージを送信する関数
  function postSlack(name) {
    const payload = {
      text: getMessage(name),
    };

    const url = ""; // ここにWebHook URLを入力
    const options = {
      method: "POST",
      headers: { "Content-type": "application/json" },
      payload: JSON.stringify(payload),
    };
    UrlFetchApp.fetch(url, options);
  }

  // ランダムなリアクションを取得する関数
  function getRandomReactions(reactions, count) {
    const shuffled = reactions.slice(); // シャッフル用に配列をコピー

    for (let i = shuffled.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
    }

    return shuffled.slice(0, count);
  }

  // メッセージを生成する関数
  function getMessage(name) {
    const reactions = [
      ':tada:', ':congratulations:', ':blush:', ':laughing:',
      ':wink:', ':おめでとう:', ':cake:', ':raised_hands:'
    ];

    const shuffledReactions = getRandomReactions(reactions, 7);
    const len = Math.min(6, shuffledReactions.length);
    const selectedReactions = shuffledReactions.slice(0, len);

    return `:confetti_ball::tada::confetti_ball::tada::confetti_ball::tada::confetti_ball::tada::confetti_ball::tada::confetti_ball::tada::confetti_ball::tada:
  今日は ${name} さんの誕生日です! :birthday:
  おめでとうございますー!!${selectedReactions.join('')} 
  この一年が素敵で楽しい日々になりますように:sparkles:`; 
  }

  1. 目覚ましマーク(トリガー)を選択
  2. 「トリガーを追加」をクリック

  1. 実行する関数を選択→setBirthdayPostTrigger
  2. 実行するデプロイを選択→Head
  3. イベントのソースを選択→時間主導型
  4. 時間ベースのトリガーのタイプを選択→日付ベースのタイマー
  5. 時刻を選択→午前8時〜9時
  6. 保存をクリック

※ここで選択する時刻は通知する時刻ではなくトリガーをセットする時刻です

なので通知する時刻よりも早い時刻にセットしておきましょう

通知時刻を変えたい場合はソースコードのL4を(分以降を変えたい場合はL7)を任意の値に修正して下さい

以上でアプリケーションは完成です

当日が誕生日リストに該当する時、10:00になると以下のような通知が選択したチャンネルに送られます(同じ誕生日が2人いる場合)

終わりに

いかがでしたか?この記事を参考に誕生日通知Slackbotを作成し、社内コミュニケーションを活発にしていただけたら幸いです。

GASを使えば誕生日通知以外にもさまざまなアプリケーションを作成することができます。

是非GASを活用して便利なbotをたくさん作ってみて下さい。