見出し画像

ChatGPTを使って、Slackで複数チャンネルに同時(一斉送信)にメッセージを送るBotを作った。【GAS】コードも添付しています。

こんにちは、子育てと仕事のダブルコミットをしています。KAENのArashiです。

本noteは売ることは目的にしていないので、内容は全て無料で読めます!
やり方とか良いからさっさとほしいって方もいらっしゃるかもしれませんので、販売しています。
ただし、Slack Botは各自で設定する必要あります。

あらを

ビジネスサイドでもテックにやっていこう!という心意気で色々なことを試しています。この記事では、Slackで複数チャンネルに同時にメッセージを送る方法を書いていきます。

こんな人にオススメ!

・クライアントとSlackコネクトでやり取りをしていて、同じメッセージをコピペで送ってる。
・社内を横断するポジション(部署)で定期的に周知が必要

弊社は、Slackコネクトが40チャンネルほどあり、コピペだる。。と思ってました。そんな方々も多いでしょう。しかし、これを読めば、できます!!プログラミングを3度挫折している僕でもできましたので、みんなできます。

参考コードも後半に記載しますが、ステップを知っておいた方がが変更したいときに変えるべき場所がわかるので流れはなんとなく知っておくと良いです。

※社内のエンジニアメンバーとChatGPTに助けてもらいました。

もりもりな内容に見えるんですが、思考背景を書いていたりするので多くなっています。基本的に画像付きで書いているので早い人は30分あれば、できると思います。

作るににあたっての思考ステップ

やり方だけ知りたい!って方は飛ばしてください👌

まず、どうやってやるんだ?とChatGPTに聞きました。
『Slackで複数チャンネルに同時にメッセージを送る方法』

そうすると、
1. マルチチャンネルメンションを使用する
2. Slackアプリまたはボットを使用する
3. Slackのワークフローを使用する
4. サードパーティの統合ツールを使用する

などと回答をしてくれました。
①は、調べても出てきませんでした。(詳しくGPTに聞いたけど、個人メンションと間違えてそうだった。)③は、できるなら公式だし良いなと思いましたが、毎回違うメッセージを送るには毎回ワークフローを作る必要がありそうだったので断念。

残るは、②or④なのですが④はイメージ湧かなかったので②を選択することにしました。(GPTに②について詳しく聞いていった)

  • Slack APIを活用する必要がある

  • 何らかサーバー等にコードを書く必要がある

どんなツールにコードを書けば良いのか全く見当もつかず、リッチに作りたいわけではなかったため、とりあえずGAS(Google Apps Script)にしました。(そもそもGASとは?って方は↓↓)

ということで、Slack APIの設定とGASでコードさえ書けばOKというところまで到達しました。

理想を言うと、Slack上で全て完結させたかった…

それでは、実際にやっていく!GOGO!

Slackの設定

  1. Slack Appを作成する

    • Slack APIのページにアクセスして、Slackアプリを作成する。

    • Appの設定画面で、OAuth & Permissionsセクションに移動し、chat:writechannels:joinのスコープを追加します。

    • 設定の変更後、変更を保存し、Appを再インストールします。

  2. Slack API Tokenを取得する

    • Slack Appの設定画面で、"OAuth & Permissions"セクションに移動し、"Bot User OAuth Token"をコピーします。

Slack Appってという方もいると思うので、↓↓↓こんなやつです!

詳しくやり方を書いていきます。

Slackアプリを作成

『Create New App』をクリックします。

『From scratch』を選択

「アプリの名前」と「どのワークスペースでアプリを使う?」を選択

Permissonsの設定

次にSlack Appに何をできるようにさせるかを決めます。
「OAuth & Permissons」を選択

Scopesの「Add an OAuth Scope」をクリック(OAuth & Permissonsを開いて、ちょっと下にスクロールしてください)

2つの権限を付与します。

  • calls:write

    • ワークスペースでの通話の開始と管理

  • channels:join

    • ワークスペースのパブリックチャンネルに参加する

次に、Slack Botをインストール

「Edit」をクリックします。

「Display Name(botの名前)」と「Default username(@xxで表示される名前)」を入力して、「Save」をクリックします。

次は、Slackアプリのアイコン設定

「Basic Information」をクリックします。

「Add App Icon」をクリックし、画像をアップロードします。

「Install App」をクリックして、「Install to Workspace」をクリックします。

アクセス権限リクエストされますので、許可します。

最後に【GAS】で使用するAPIトークンを取得します。(オレンジ塗りのやつ)いつでも見れますが、一時的にどこかに保存しておくとこれからの作業で楽です!

ここまででSlackの準備は終わりました

だい疲れましたよね。もうちょいです。今日って半月ですか?


スプレッドシートの準備

スプレッドシートを用意

スプレッドシートに「Sheet1」「channel ID」という2つのシートを用意します。(コードの内容にも関わります)

 Sheet1シートのイメージ

「Sheet 1」シートについて

  • 1列目

    • ラベル

  • 2列目

    • A2は、「channel ID」シートからIDを取得するセルです。

    • B2は、セルからメッセージを取得する場合は、メッセージを書きます。

      • Slack Block kit使う場合は、使いません。

    • C2は、ただのメモです。

これから記載する2つコードは、どちらとも「channel ID」をセルから取得しています。なぜかというと、コードにSlack ID書くのめんどくさいからです。あと、メッセージ内容に応じて送るチャンネル変わるためです。一斉送信したいチャンネルが限定的な方も関数固定にしちゃえばいいので、一緒で問題なしです。

A2セルには👇の関数を入れてください。
XXXXは、channel IDシートからID取得します。

=TEXTJOIN(", ", TRUE,XXXX)


「channel ID」シートについて

文字通り、channel IDを並べているシートです。

  • A列

    • チャンネル名

  • B列

    • チャンネルID

 channel IDシートのイメージ

Slackのchannel ID取得方法

channel IDってどこにあるの?って思った方もいらっしゃるでしょう。痒いところに手が届くnoteです。ご安心ください!

各channelを開いて、上部のチャンネル名をクリックすると👇のようなモーダルが表示されます。一番下にスクロールすると、channel IDが記載されています。(オレンジ枠部分)

もしくは、チャンネル名を右クリックすると「コピー」と出てきますので「リンクをコピー」してください。ただし、httpsから始まるURLがコピーされるので、必要なのは、最後の/からあとだけです。(太字部分

https://slack.com/archives/AXX0000

※channel IDを取得するスクリプトも作ったんですが、管理者が自社のチャンネル以外は取得できませんでした。残念。
むしろ、全て自社で作っていれば解決するんですけどねー。。

あきらめないで。もう少しで未来が楽になる

GASの書き方

「拡張機能」→「Apps Script」をクリック

「コード.gs」というところにコードを書いていきます。

基本的には下記のコードをコピペすればOKですが、以下の2つだけは自分のものに書き換えてください。


  • APIトークン(Slackの設定で作ったtoken)

    • 「ここにSlack APIトークン入れます」って書いてます

  • スプレッドシートID

    • 「ここにスプレッドシートのIDを入れます」って書いてます

    • セルからメッセージ取得パターンのコードは、2箇所ID入れるところがあります。


スプレッドシートIDの確認方法

https://docs.google.com/spreadsheets/d/スプレッドシートID/edit#gid=シートID


コード構成の説明

メッセージをどこから取得するかによって少しコードの内容が変わってきます。最初は、セルから取得する方法でやっていましたが、テキストだけの表現には限界があります。そのため、分かりやすく表現したい場合は、Slack Block Kitを使うと良いです。それぞれ分けて記載しています。

  • メッセージをセルから取得して送る場合

    • 楽にやりたい方は、こっちがいいです。

  • Slack Block kitを使って送る場合

    • 見た目にもこだわりたい!

    • でも、ちょっと手間かかるよ。


  1. チャンネルIDの取得

    • Google SheetsからチャンネルIDを取得する関数を呼び出します。

  2. チャンネルIDの形式確認

    • 取得したチャンネルIDが単一の値であるかを確認し、配列に変換します。

  3. Slack APIトークンの設定

    • Slack APIトークンを設定します。

  4. ブロックキットの作成

    • メッセージに含めるブロックキットのデータを作成します。

  5. チャンネルごとのメッセージ送信

    • 取得した各チャンネルIDに対して、Slack APIを使用してメッセージを送信します。

    • メッセージの送信には、適切なヘッダーとペイロードが必要です。

  6. エラーハンドリングとログ

    • メッセージの送信が成功したかどうかを確認し、エラーが発生した場合は適切にハンドリングします。

    • ログに送信の成否や詳細なエラーメッセージを出力します。

⒋は、セルから取得する場合とSlack Block kitを使う場合で変わります。


メッセージをセルから取得して送る場合

メッセージのイメージは👇こんな感じになります。

絵文字など入れることができますが、基本的にテキストでのメッセージなります。メンション(@hereなど)をつけるのも一工夫必要です。
<このコードには@channelメンションがついています>

function sendMessageToSlack() {
  // CHANNEL_IDSを取得する関数を呼び出す
  var CHANNEL_IDS = getChannelIdsFromSheet();

  // セルの内容が単一の値である場合、それを配列に変換
  if (!Array.isArray(CHANNEL_IDS)) {
    CHANNEL_IDS = [CHANNEL_IDS];
  }

  // Slack API Token
  const SLACK_TOKEN = "ここにSlack APIトークン入れます";

  // セルからメッセージのテキストとメンションを取得
  const messageText = getMessageTextFromSheet();
  const mention = "<!channel>"; // ここでメンションの形式を指定

  // Slackにメッセージを送りたいチャンネルのID
  CHANNEL_IDS.forEach(channelId => {
    // Slackにメッセージを送信するAPIエンドポイント
    const slackApiEndpoint = "https://slack.com/api/chat.postMessage";

    // 送信するメッセージの設定
    const message = {
      token: SLACK_TOKEN,
      channel: channelId.trim(), // 各チャンネルIDの前後の余白をトリム
      text: messageText,  // セルから取得した文章を設定
    };

    // Slack APIへのリクエストヘッダー
    const headers = {
      "Authorization": "Bearer " + SLACK_TOKEN,
      "Content-Type": "application/json; charset=utf-8", // 文字セットを指定
    };

    // Slackにメッセージを送信
    const response = UrlFetchApp.fetch(slackApiEndpoint, {
      method: "post",
      headers: headers, // ヘッダーを設定
      contentType: "application/json", // この行は残しておく
      payload: JSON.stringify(message),
    });

    // レスポンスのログを出力
    Logger.log(response.getContentText());
  });
}

function getChannelIdsFromSheet() {
  // スプレッドシートのID
  var spreadsheetId = 'ここにスプレッドシートのIDを入れます';

  // シート名とセルの範囲
  var sheetName = 'Sheet1';
  var cellAddress = 'A2';

  // スプレッドシートを開く
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);

  // 指定したシートとセルの範囲を取得
  var range = spreadsheet.getSheetByName(sheetName).getRange(cellAddress);

  // セルの値を取得
  var cellValue = range.getValue();

  // カンマで区切られた文字列を配列に分割
  var CHANNEL_IDS = cellValue.split(',');

  // 取得したCHANNEL_IDSをログに出力
  Logger.log('CHANNEL_IDS: ' + CHANNEL_IDS);

  // 取得したCHANNEL_IDSを返す(必要に応じて使用)
  return CHANNEL_IDS;
}

function getMessageTextFromSheet() {
  // スプレッドシートのID
  var spreadsheetId = 'ここにスプレッドシートのIDを入れます';

  // シート名とセルの範囲
  var sheetName = 'Sheet1';
  var messageCellAddress = 'B2';

  // スプレッドシートを開く
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);

  // 指定したシートとセルの範囲を取得
  var messageRange = spreadsheet.getSheetByName(sheetName).getRange(messageCellAddress);

  // セルの値を取得
  var messageText = messageRange.getValue();

  // 取得したメッセージをログに出力
  Logger.log('Message Text: ' + messageText);

  // 取得したメッセージを返す(必要に応じて使用)
  return messageText;
}

上記に記載しましたが、セルからメッセージ送るには基本的にテキストでのメッセージなります。そのため、タイトルっぽいのは目立たせたい!と思った時に、囲みを集めたありがたいnoteがあったので、シェアします。


Slack Block kitを使ってメッセージを送る場合

メッセージのイメージは👇

かなり見やすいですよね!セルから取得するのではなく、コードに書かなければいけないので、ちょっと手間が増えますが見た目は良いです。

※Slack Block kitのコードは別に作成しなければいけません。最後に説明します。↓↓のコードでは、ブロックキットのデータはここに入れるよって書いてます。(コードのコピペに注意がありますので、下に書いています。)

function sendMessageToSlack() {
  // CHANNEL_IDSを取得する関数を呼び出す
  var CHANNEL_IDS = getChannelIdsFromSheet();

  // セルの内容が単一の値である場合、それを配列に変換
  if (!Array.isArray(CHANNEL_IDS)) {
    CHANNEL_IDS = [CHANNEL_IDS];
  }

  // Slack API Token
  const SLACK_TOKEN = "ここにSlack APIトークン入れます";

  // ブロックキットのデータを作成
  const blocks = [ ブロックキットのデータはここに入れるよ ];

  // Slackにメッセージを送りたいチャンネルのID
  CHANNEL_IDS.forEach(channelId => {
    // Slackにメッセージを送信するAPIエンドポイント
    const slackApiEndpoint = "https://slack.com/api/chat.postMessage";

    // 送信するメッセージの設定
    const message = {
      token: SLACK_TOKEN,
      channel: channelId.trim(),
      blocks: blocks  // ブロックキットのデータを指定
    };

    // Slack APIへのリクエストヘッダー
    const headers = {
      "Authorization": "Bearer " + SLACK_TOKEN,
      "Content-Type": "application/json; charset=utf-8"
    };

    // Slackにメッセージを送信
    const response = UrlFetchApp.fetch(slackApiEndpoint, {
      method: "post",
      headers: headers,
      contentType: "application/json",
      payload: JSON.stringify(message),
    });

    // レスポンスのログを出力
    Logger.log(response.getContentText());
  });
}

function getChannelIdsFromSheet() {
  // スプレッドシートのID
  var spreadsheetId = 'ここにスプレッドシートのIDを入れます';

  // シート名とセルの範囲
  var sheetName = 'Sheet1';
  var cellAddress = 'A2';

  // スプレッドシートを開く
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);

  // 指定したシートとセルの範囲を取得
  var range = spreadsheet.getSheetByName(sheetName).getRange(cellAddress);

  // セルの値を取得
  var cellValue = range.getValue();

  // カンマで区切られた文字列を配列に分割
  var CHANNEL_IDS = cellValue.split(',');

  // 取得したCHANNEL_IDSをログに出力
  Logger.log('CHANNEL_IDS: ' + CHANNEL_IDS);

  // 取得したCHANNEL_IDSを返す(必要に応じて使用)
  return CHANNEL_IDS;
}

Slack Block kitの使い方は、次に書いているのですが、Block kitを作成した後にGASにコピペする範囲に注意が必要です。

例えば、👇を作ったとすると、全部をコピペすると被りが出てきます。

{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "お知らせ",
				"emoji": true
			}
		}
	]
}

実際のコードがこちら👇なので、これらを考えると

  // ブロックキットのデータを作成
  const blocks = [ ブロックキットのデータはここに入れるよ ]

コピペするのは、この部分なります。

{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "お知らせ",
				"emoji": true
			}
		}

ちょっとわかりにくそうなので、ここから→→・←←ここまでって書いてます。

{
	"blocks": [
ここから→→{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "お知らせ",
				"emoji": true
			}
		}←←ここまで
	]
}


送信する

どちらのコードの場合も「実行」をクリックして送信しているんですが、違う方法もあります。もっと便利にできるんでしょうけど、まあいいかーって思っています。笑

Slack Block kitの使い方

Block Kit とは、Slackがリリースしたデスクトップ・モバイル両方に最適な形で対応した UI を簡単に組み立てることができるツールです。

ブラウザだけで、Block Kit の表示を確認したり、簡単にプロトタイピングすることができます。Block Kit Builder

左側に色々並んでいるんですが、ぽちぽち押してみるとブロックが追加されます。要らないものは、マウスホバーで削除もできますし、ドラッグ&ドロップで並び替えもできます。

こちらの記事がわかりやすいので、みて見てください👇

注意

一斉送信は、プライベートチャンネルには投稿されませんので、ご注意を!

ニュージーランドのマウントクックで登山してみたい。

作るのめんどくさいけど、ほしいって方へ(販売します)

⚠️Slack Botの設定は各自で行う必要があります。

価格迷ったんですが、700円にしました。スタバのコーヒー代くらい☕️

お送りするものは、シートへの関数やスクリプトが記載されたスプレッドシートになります。有料部分にGoogle formのリンクを貼っていますので、お名前とメールアドレスを記載いただければ、メールアドレス宛にURLお送りします。

有料部分に誰でも見れるリンクにしようと思ったんですが、何らかでURLが公開された時にご購入者にの方に申し訳ないので、Google formにしました。


この記事が気に入ったらサポートをしてみませんか?