🎂

GASでお誕生日Bot作る

2022/07/17に公開

はじめに

やることは以下の記事でやったことを実践するだけです。二番煎じです。
https://zenn.dev/offers/articles/20220630-google-app-script-slack

GASって便利ですよね。スプレッドシートやSlackなどサービス同士を組み合わせることで業務の効率化に役立ちます。
実際業務で恩恵を感じることは多いんですが、誰かが作ったGASを使わせてもらってるだけで、自分で試したことはないです。
ちょっとは自分でも触っておこうと思ったのでこの記事参考にしてお誕生日お祝いbot作っていきます。

最終的にできるもの

誕生日の人の名前をslackのチャンネルに通知してくれるbotを作ります。

スプレッドシートの準備

名前と誕生日情報だけあればいんですが、一旦以下の項目で用意しました。

GASでは今日の日付けと誕生日のセルを比較して、一致する場合に名前を返すようにします。

Slackのチャンネルと連携

通知をSlackのチャンネルに通知するためにはIncomingWebhookの追加が必要な様です。

IncomingWebhookの追加とWebhookURLの取得

通知を送りたいslackのチャンネルにIncomingWebhookを追加します。
今回はgas-slack-testというチャンネルに追加します。
インテグレーションのAppから「アプリを追加する」を選択します。

検索窓に「Incoming Webhook」を入力し、Incoming Webhookをインストール。

「Slackに追加」を選択

チャンネルを選択のセレクトボックスで追加するチャンネル(今回はgas-slack-test)を選択して「Incoming Webhookインテグレーションの追加」を選択。

Webhook URLが表示されるのでコピーしておく

GASを使う

スプレッドシートのツールバーから 拡張機能->Apps Script を選択

コード.gs が表示されるのでここにスクリプトを書いていきます

GASのscript全文

const POST_URL = "WebhookURLをここに貼り付け"

function myFunction() {
  // シートの情報取得
  const sheetData = getSheetData()
  // 誕生日の人の名前リスト取得
  const birthdayMember = getBirthdayMember(sheetData)
  // slackに投稿するメッセージを生成
  const birthdayMessage = generateBirthdayMessage(birthdayMember)
  // slackへの通知
  notificationToSlack(birthdayMessage)
}
  
const getSheetData = () => {
  const book = SpreadsheetApp.getActiveSpreadsheet()
  // 「シート名」の部分には誕生日リストを記入しているシート名を入力
  const sheet = book.getSheetByName("シート名")
  const sheetDate = sheet.getDataRange().getValues()

  return sheetDate
}

const getBirthdayMember = (sheetData) => {
    const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'MM/dd')
    const header = sheetData[0]

    const birthDayMemberNames = sheetData.filter(data => {
      return data[header.indexOf('birthday')] !== '' && Utilities.formatDate(new Date(data[header.indexOf('birthday')]), 'Asia/Tokyo', 'MM/dd') === today
  }).map(data => {
    return `${data[header.indexOf('name')]}`
    })

    return birthDayMemberNames
}

const generateBirthdayMessage = (birthdayMember) => {
  // 誕生日の人がいない場合は早期リターン
  if(birthdayMember.length === 0){
    return  '誕生日の人はいません'
  }

  const message = []
  message.push(`:tada::tada::birthday:今日は ${birthdayMember.join('と')} のお誕生日です!:birthday::tada::tada:`)
  // メッセージを追加したい場合はここでmessage.pushで追加していく

  return message.join('\n')
}

const notificationToSlack = (message) => {
  const jsonData = { "text": message }
  const payload = JSON.stringify(jsonData)
  const options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  }
  UrlFetchApp.fetch(POST_URL, options)
}

試しに「実行」ボタンで実行してみるとslackに通知が届くはずです。

少しコードの解説

slackに通知するまでの処理をmyFunction内部で4つに分けました。

① スプレッドシートから名前や誕生日のリストを取得
② 今日の日付とリストの誕生日を比較、一致する場合は名前を取得
③ 投稿するメッセージの生成
④ slackへ通知

誕生日を検出することを変更したければ②を修正すれば良いですし、メッセージを編集したければ③を修正すれば良いです。
slackではなくdiscordやtwitterに通知したければ④の部分を修正することで拡張できます。

Bot化

このままでは「実行」ボタンを押さないと実行されません。
自動で毎日myFunction関数を実行するように設定します。

左側タブからトリガーを選択

トリガーを追加を選択

以下のように設定することで毎日9時〜10時にmyFunction関数を実行してくれます。

これでお誕生日botの完成です。

おわりに

本来はGASで何かの処理を実行した際の成功・失敗の通知をslackに送信します。
「何かの処理」の部分でどれだけ業務を効率化できるかが大事で、通知はその副産物にすぎません。
次は実用的なGASの使い方がしたいです。

Discussion