SlackのイベントAPIでスタンプをトリガーにする

以前にSlackのイベントAPIを使用する記事を投稿しましたが、今回はスタンプの押下をトリガーにしてそのメッセージをスプレッドシートに出力するという実装を試してみます。

スプレッドシートの用意

今回の想定としては、Slackの特定のパブリックチャンネル内で犬(dog)のスタンプを押した時に、そのメッセージの情報等をスプレッドシートに出力するという流れになります。
以下の内容のスプレッドシートを用意しました。

拡張機能 > Apps Script を開いて、以下の内容に変更します。

const SHEET_NAME = 'シート1';
const BOT_TOKEN = 'SLACK_BOT_TOKEN';

function doPost(e) {
  const data = JSON.parse(e.postData.contents);

  // SlackのURL検証用(初回のみ)
  if (data.type === 'url_verification') {
    return ContentService.createTextOutput(data.challenge);
  }

  const event = data.event;

  // リアクションのみを対象
  if (event.type !== 'reaction_added') {
    return ContentService.createTextOutput('no');
  }

  // 対象スタンプを限定
  const TARGET_REACTIONS = ['dog'];
  if (!TARGET_REACTIONS.includes(event.reaction)) {
    return ContentService.createTextOutput('no');
  }

  // 元メッセージ取得
  const message = fetchMessage(
    event.item.channel,
    event.item.ts
  );

  if (!message || !message.text) {
    return ContentService.createTextOutput('no message');
  }

  const sheet = SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName(SHEET_NAME);

  sheet.appendRow([
    event.item.channel,
    message.text,
    message.user || '',
    message.ts,
    JSON.stringify(message),
    event.reaction,
    event.user || '',
    event.event_ts,    
    JSON.stringify(event)
  ]);

  return ContentService.createTextOutput('ok');
}

function fetchMessage(channel, ts) {
  const url =
    'https://slack.com/api/conversations.history' +
    `?channel=${channel}&latest=${ts}&inclusive=true&limit=1`;

  const res = UrlFetchApp.fetch(url, {
    headers: {
      Authorization: `Bearer ${BOT_TOKEN}`
    }
  });

  const json = JSON.parse(res.getContentText());

  if (!json.ok || !json.messages || json.messages.length === 0) {
    return null;
  }

  return json.messages[0];
}

スタンプを押した際に取得できるデータにはメッセージの情報は含まれていないので、別途メッセージの情報をAPIを使って取得する形にしています。
2行目のSLACK_BOT_TOKENはSlackの設定後に取得できる値になるので、後ほど差し替えてください。

この状態でいったんデプロイを行います。
右上のデプロイ > 新しいデプロイ を選択します。

左上の 歯車アイコン > ウェブアプリ を選択します。

アクセスできるユーザーを全員に変更して、デプロイを行います。

デプロイ完了後、ウェブアプリのURLをコピーしておきます。

Slackの設定

Slackアプリの管理画面でCreate New Appをクリックします。

From scratchでアプリ名とワークスペースの選択を行い、Create Appをクリックします。

サイドメニューから Features > OAuth & Permissions を選択します。
Scopes の Bot Token Scopes で Add an OAuth Scope を選択します。

今回はリアクションの取得とメッセージの取得をしたいため、「reactions:read」「channels:history」の2つを追加します。

スコープを追加できました。

次にサイドメニューの Features > Event Subscriptions を選択して、Enable EventsをOnにします。

下に表示されるRequest URLに、先ほどのウェブアプリのURLを貼り付けます。
Verifiedが表示されたらOKです。

さらに下にあるSubscribe to Bot Events を選択して、Add Bot User Event をクリックします。

イベントの追加が行えるので、reaction_added を追加します。

reaction_added が追加できました。

サイドバーの Settings > Install App を選択して、ワークスペースへのインストールボタンをクリックします。

インストール完了後に表示される「Bot User OAuth Token」をコピーして、前述のGASコードの「SLACK_BOT_TOKEN」部分に差し替えてデプロイしなおします。

最後に、Slackでイベントを設定したいチャンネルに招待します。

/invite @XXXXXXXX

チャンネル内でdogのスタンプを押すと、スプレッドシートに出力が確認できました。

参考サイト

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2026年2月
1234567
891011121314
15161718192021
22232425262728