以前に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のスタンプを押すと、スプレッドシートに出力が確認できました。

















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