Google スプレッドシートとDiscord webhookで誕生日お祝いBotを作ろう

みなさんこんにちは、あまみです。
今回はdiscordのWebhook(ウェブフック)機能を使った、『条件(日付)が一致した際にDiscordにメッセージを送信する機能を作っていきたいと思います。』

用意するもの

  • Google スプレッドシート(以下、Google SS)

  • Discord アカウント

  • 誕生日やイベント情報をまとめたもの(Google SSで作成)

『Idol』というシートに作りました。

今回は誕生日で作るのでこんな感じで(表のBirthdayの部分)
使用ファイル

参照元 シャイニーカラーズ>IDOLタブ

1.概要

今回の大まかな流れを説明します。
今回はGoogle SSからdiscordのwebhookへ一方通行にデータを送りBotとしてメッセージを送信します。

Google SS -> Google Apps Script -> Webhook -> Discord「今日は〇〇の誕生日!」


2.Discord でWebhookの設定を

Discordで「ウェブフックの管理」って権限がいるので注意。
サーバー設定 > 連携サービス > ウェブフック で新しいWebhookを追加できる。urlは後で使う。
(Discordの設定画面は頻繁に変わるから正しいことは公式で)

『ウェブフックURLをコピー』してメモしておいてください。



3.Google Apps Script

さて、情報が揃ったので次にコードの時間を
今回はGoogle Apps Scriptを使用します

// WebhookのURLリスト
const Birthday_Notice_Webhook_List = [
  "##DiscordのWebhookのURLをここに貼る##"
];

// botメッセージの設定
const Birthday_Notice_Webhook_Payload = {
  "username""誕生日bot"// メッセージの送信者名
  "content""今日%sは%sの誕生日です!" // メッセージ本文
};


// この関数を毎日0-1時(JST)に起動
function main_everyday({
  checkBirthday();
}


function checkBirthday({
  // 検索対象の列番号(10列目=J列)
  const Day_Column = 10;

  // "Google SSのシート名"
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("##シート名##");

  // 今日の日付
  today = Utilities.formatDate(new Date(), "JST""MM/dd");
  Logger.log(`today: ${today}`);

  // 日付を検索
  var textFinder = sheet.createTextFinder(today);
  textFinder.matchEntireCell(true// 全体一致
  var ranges = textFinder.findAll();
  Logger.log(`検索結果: ${ranges.length}件`);

  // 該当セルをひとつづつ
  for (var i = 0; i < ranges.length; i++) {
    if (ranges[i].getColumn() == Day_Column) {
      var webhook_payload = Object.assign({}, Birthday_Notice_Webhook_Payload); // オブジェクトの参照渡しを回避
      // メッセージに日付と名前を埋め込み
      webhook_payload["content"] = Utilities.formatString(
        Birthday_Notice_Webhook_Payload["content"],
        today, ranges[i].offset(0, ##誕生日から名前までの距離##).getValue() 
// "-8"は今いるところから左に8ということ。(-1は左に1つ隣のデータ)
      );
      // メッセージを送信
      postWebhook(Birthday_Notice_Webhook_List, webhook_payload);
    }
  }
}

function postWebhook(url_list, payload{
  var options = {
    "method""POST",
    'contentType''application/json', 
    "payload"JSON.stringify(payload)
  };
  Logger.log(`Payload for webhook: ${options["payload"]}`);
  for (var i = 0; i < url_list.length; i++) {
    // HTTPリクエストを送る
    var r = UrlFetchApp.fetch(url_list[i], options);
    Logger.log(`Response from webhook: (${r.getResponseCode()})${r.getContentText("UTF-8")}`);
  }
}

こんな感じ〜##  ##で3箇所囲っているところは人によって違ったりするので調節を。


完成!

Google SSの下の方にテストデータ(誕生日が今日)とかいれて実行するときちんと動くと思います。

こんな感じに


例えば誕生日のところをイベント開催日にしたり、タスク管理表と組み合わせたり使い方は人それぞれです。また今回は日付が変わった頃に実行しましたがこういった『タイミングを決めて自動で実行するBot』というのはDiscord用にDiscord.pyなどのBotをいちいち作る必要がなくかなり楽です。

もし満足いただけたらサポートの方、お願いします! いただいたサポートは今後の活動を支える重要な資産になります!