🤖

GASでSlackをもっと便利に!開発合宿で作った2つのBot

2025/02/17に公開

GASでSlackを便利にしよう!

松尾研究所のデータサイエンスチーム第1回開発合宿の成果物について紹介します。開発合宿については、以下記事参照ください。

https://zenn.dev/mkj/articles/ad49eb09403bd9

合宿では、各個人が作るものを決めて開発して、その日に作ったものを発表するという流れになっています。私は「あると嬉しいけどなかなか開発する時間がとれないちょっとした便利Slack bot」を作ることにしました。

Slack botといっても色々なものがあります。例えばLLMを使った高度なbotを作りたい場合は、PythonとBolt(Slackアプリに対応したフレームワーク)を使うことで実現できます(参考:Slackでチャットbotをつくる方法)。

ただ、この場合自前でサーバを用意してプログラムを動かし続ける必要があり、メンテ含めたコストが気になってしまいます。

そのため、今回はGoogle Apps Scriptを活用して、手軽に少し高度なSlack Botを作ってみることにしました。作ったものは以下2つです。

  • 話題のテーマを提供してくれるbot
  • Slackの新着チャンネルを教えてくれるbot

1つずつ説明していきます。

話題のテーマを提供してくれるbot

MTGなどでのアイスブレイクに活用できる、本日の話題を提供してくれるbotを作ってみました。

元ネタは、エムスリーさんの公開している魔法のスプレッドシートです。

https://www.m3tech.blog/entry/zatsudan-mahou-no-spreadsheet

Googleスプレッドシートに、魔法のスプレッドシートをコピペします。

GASからのSlackへの投稿のためには、Webhookを使います。Webhookに関しては、本記事では割愛します。以下リンク先など参照ください。

https://slack.com/marketplace/A0F7XDUAZ-incoming-webhooks

肝心のGASのプログラムは、自分があまり詳しくないのでLLM(ChatGPT)に助けてもらいながら作りました。冒頭のGoogleスプレッドシートのIDと最後のWebhookのURLの設定部分のxxxxxxは環境に合わせて修正して使ってください。

function doPost() {

  var sheet = SpreadsheetApp.openById("xxxxxx").getSheetByName('talk');
  var data = sheet.getDataRange().getValues();
  var pickedNum = Math.floor(Math.random() * Math.floor(data.length));

  var text = data[pickedNum][0] +'*\n';

  var options = {
    method: 'post',
    contentType: 'application/json',
    payload: '{"text":"'+text+'"}'
  };
 
  UrlFetchApp.fetch("https://hooks.slack.com/services/xxxxxx", options);
}

アイコンも、以下のようなプロンプトでChatGPTに作ってもらいました。

トークテーマを考えてくれるSlack Botのアイコンを作成してください。
ポップでミニマルな感じで

GASには、トリガーを以下のように設定して、1日1回朝にSlackの#talk_themeというオープンチャンネルに、毎日話題のテーマを提供するようにしました。

私は、Slackの自分のtimesチャンネルで、話題のテーマをもとに毎朝少し話題を提供したりしています。

Slackの新着チャンネルを教えてくれるbot

新しく出来たチャンネルを逃さずフォローするためのbotです。以下記事を参考にさせていただきました。

https://creators.bengo4.com/entry/2024/12/14/000000

アイコンは、以下のようなプロンプトでChatGPTで生成しました。

新しいチャンネルを通知するSlack Botのアイコンを作成してください。
ポップでミニマルな感じで

参考にした記事ほぼそのままなのですが、privateチャンネルを対象にすると、こっそりprivateチャンネルを作りたい人が嫌かもと思い、新着チャンネルの通知からprivateチャンネルを外しました。

コード変更は、LLMにお願いしました。以下のようなプロンプトを使っています。

以下の新着チャンネルを通知するGASスクリプト、privateチャンネルは対象外としてpublicチャンネルのみを対象にしたいです。
変更して、変更点を教えてください。

###
<ここにコードをコピペ>

生成されたコードは省略します。

会社Slackの#新着チャンネルお知らせというオープンチャンネルで運用しています。

まとめ

GASを作って、少し便利になるようなSlack botを作ってみました。使用状況はどうかというと、#talk_themeはチャンネルのフォロワーが10人、#新着チャンネルお知らせが6人。#talk_themeは、最近少しずつ自分以外の人にも使い出してもらっているという状況です。特に面白い話題だと、結構多くの人が反応してくれています。人に喜んで使ってもらえるものを作るのは、やっぱり楽しいなということを実感しました。GASに触れたのは初めてだったので、短期間で動くものまで作り上げるのは大変でしたが、LLMに大いに助けられました。

開発合宿では、他の人の開発した凄いものをみて刺激を貰えたり、メンバーの意外な一面を見れたりと、とても楽しかったです。合宿と通して、グッとチームの交流が深まった気がします。私は、会社でこういった開発合宿をするのは初めての経験だったのですが、とても楽しくよい経験になりました。

毎年開発合宿に行くことを、会社の文化として定着していきたいなと思いました。

参考リンク

https://qiita.com/hoshiume11/items/4d0e37b07bca5bbb3fb5

https://www.kamo-it.org/blog/slack-chatgpt-bot-1/

https://dev.classmethod.jp/articles/202001-workday-only-gas/

https://best-cloud.jp/google-apps-script-authentication/

https://ocomoji.co.jp/knowledge_01

https://zenn.dev/lclco/articles/712d482d07e18c

https://qiita.com/seratch/items/2158cb0abed5b8e12809

松尾研究所テックブログ

Discussion