🐴
GAS:Slackでemojiが押されたら対象のスレッドをスプレッドシートにコピーしてSlackに通知する-2/3
前回の続き。
前置き
特定のemojiを押したら反応するBotを作りたかった。
参考にするリファレンス
Event reference: reaction_added event
conversations.replies Slack API Method
処理の流れ
- Slackでemoji追加を検知
- GASを作成
- GASで値を処理し、スレッドの内容を取得
- スプレッドシートに転記
- Slackに返す
今日は3~4について記載します。
3. GASで値を処理し、スレッドの内容を取得
ソースコード全体
// SlackのOutgoingから来るメッセージ
function doPost(e) {
// Event API Verification 時のコード
try {
const json = JSON.parse(e.postData.getDataAsString());
if (json.type == "url_verification") {
return ContentService.createTextOutput(json.challenge);
}
}
catch (ex) {
Logger.log(ex);
}
try {
const json = JSON.parse(e.postData.getDataAsString());
const channel = json.event.item.channel;
const ts = json.event.item.ts;
const reaction = json.event.reaction;
if (reaction == "thinking_face") {
getMessage(ts,channel);
}
}
catch (e) {
Logger.log(e);
}
}
function getMessage(ts,channel){
const url = "https://slack.com/api/conversations.replies";
const slack_app_token = "your-token";
const limit =10;
const options = {
"method" : "get",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": slack_app_token,
"channel": channel,
"ts":ts
}
};
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response);
const text = json.messages[0].text
const date = new Date();
SpreadsheetApp.getActiveSheet().appendRow([date,text]);
}
ソース解説
reaction_added eventの処理
reaction_added eventのリファレンスを参考に、リクエストパラメータから必要なものを取得する。
リクエストパラメータ
{
"type": "reaction_added",
"user": "U024BE7LH",
"reaction": "thumbsup",
"item_user": "U0G9QF9C6",
"item": {
"type": "message",
"channel": "C0G9QF9GZ",
"ts": "1360782400.498405"
},
"event_ts": "1360782804.083113"
}
後続の処理で必要な値は以下の3つ。
- reaction : 押されたスタンプの名前
- item.channel:対象のチャンネルID
- item.ts:スレッドのID
なので処理はこうやって記載する。
const json = JSON.parse(e.postData.getDataAsString());
const channel = json.event.item.channel;
const ts = json.event.item.ts;
const reaction = json.event.reaction;
Slackのスレッドからテキストを取得する
conversations.replies APIを使う。
token,channel,ts の値が必須。
channel,tsはreaction_added eventで取得した値を使う。
tokenはuserTokenをSlackbot管理画面から取得する。
reaction_added event受付→値を変数に入れる→スレッドからテキストを取得する
の流れで処理するので、今後他で使う場面が出てくることも想定して
関数(function)として定義して呼び出す形式にする。
ソース:Slackのスレッドからテキストを取得する
function getMessage(ts,channel){
const url = "https://slack.com/api/conversations.replies";
const slack_app_token = "xoxp-416350957943-415181080691-1852517683493-310e19edf1d31e69437e6a1c104a0993";
const limit =10;
const options = {
"method" : "get",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": slack_app_token,
"channel": channel,
"ts":ts
}
};
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response);
const text = json.messages[0].text
const date = new Date();
}
4. スプレッドシートに転記
これだけ。
現在アクティブなシートの有効なデータ範囲に行を追加する。
SpreadsheetApp.getActiveSheet().appendRow([date,text]);
動作イメージ
:thinking_face:を押すとスプレッドシートに記載する。
Discussion