🐴

GAS:Slackでemojiが押されたら対象のスレッドをスプレッドシートにコピーしてSlackに通知する-2/3

2021/03/14に公開

https://zenn.dev/barusu/articles/35cfe61d6e846f
前回の続き。

前置き

特定のemojiを押したら反応するBotを作りたかった。

参考にするリファレンス

Using the Slack Events API

Event reference: reaction_added event

conversations.replies Slack API Method

処理の流れ

  1. Slackでemoji追加を検知
  2. GASを作成
  3. GASで値を処理し、スレッドの内容を取得
  4. スプレッドシートに転記
  5. 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を使う。
https://api.slack.com/methods/conversations.replies#arg_channel

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