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

4 min read読了の目安(約3800字

新たに書き始めたら意外と量のあるものになったので3日に分けて書くことにしました。

前置き

特定の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に返す

今日は1~2について記載します。
SlackBotの追加、GASを公開する方法、SlackEvent SubscriptionsへのURL追加方法は以下のnoteに書いてあるのでこちらを参考にしてください(ステマ)

https://note.com/barusu/n/n0ac9b5345b25#sh8p9

1. Slackでemoji追加を検知

Event Subscriptions を設定する

  1. SlackBotを新規作成

  2. Event Subscriptions をOnにする

    ※RequestURLには後ほど作成するGASのURLを記載しておく。

  3. Subscribe to events on behalf of usersで[reaction_added]を追加

2. GASを作成

完成したソース

// SlackのOutgoingから来るメッセージ
function doPost(e) {
  // Event API Verification 時のコード
  try {
    var json = JSON.parse(e.postData.getDataAsString());
    if (json.type == "url_verification") {
      return ContentService.createTextOutput(json.challenge);        
    }
  }
  catch (ex) {
Logger.log(ex);
} 

try {
    var json = JSON.parse(e.postData.getDataAsString());
      var channel = json.event.item.channel;
      var ts = json.event.item.ts;
      var reaction = json.event.reaction;

if (reaction == "thinking_face") {

}
      }   
catch (e) {
Logger.log(e);

}

作成途中でハマった事象

Jsonから値が取れない

ハマったときのソース

// SlackのOutgoingから来るメッセージ
function doPost(e) {
  SpreadsheetApp.getActiveSheet().getRange(1, 1).setValue("ok");
  // Event API Verification 時のコード
  try {
    var json = JSON.parse(e.postData.getDataAsString());
    if (json.type == "url_verification") {
      return ContentService.createTextOutput(json.challenge);        
    }
  }
  catch (ex) {
Logger.log(ex);
} 
SpreadsheetApp.getActiveSheet().getRange(1, 2).setValue("hogehoge");

try {
    var json = JSON.parse(e.postData.getDataAsString());
      var channel = json.event.item.channel;
      var ts = json.item.ts;
			var reaction = json.reaction;
	    SpreadsheetApp.getActiveSheet().getRange(1, 3).setValue("チャンネルID:"+ channel);
	    SpreadsheetApp.getActiveSheet().getRange(1, 4).setValue("押されたスタンプ:"+ reaction);
if (reaction == "thumbsup") {

      }
      }   
catch (e) {
Logger.log(e);
SpreadsheetApp.getActiveSheet().getRange(2, 1).setValue("hogehoge");
}

}

スプレッドシートの出力結果

考えたこと🤔

Jsonからの値が取得できていないのでは

→ いやいや、Slackのリファレンス通りに定義してるけどな

→ 百聞は一見にしかずで一旦json変数を取得してみる

SpreadsheetApp.getActiveSheet().getRange(3, 2).setValue(json);

結果

{type=event_callback,
 event_context=1-reaction_added-TC8AAU5TR-C01JQSJFWCE,
 event_time=1.615635036E9,
 api_app_id=A01RJ6GGYUR,
 event=
 {item_user=UC75B2XXX,
 event_ts=1615635036.001500,
 reaction=eyes,
 user=UC75B2XXX,

 item={type=message,
 channel=C01JQSJXXXE,
 ts=1615635026.001400},
 type=reaction_added
 },
 team_id=TC8AAUXXX,
 is_ext_shared_channel=false,
 token=3BUlZ5ng0fmsrfmDSBY957pF,
 authorizations=[Ljava.lang.Object;@630401a0,
 event_id=Ev01QQQMK6HM
 }

違うやんw

変数定義を変更する

変更前

var json = JSON.parse(e.postData.getDataAsString());
      var channel = json.item.channel;
      var ts = json.item.ts;
      var reaction = json.reaction;

変更後

var json = JSON.parse(e.postData.getDataAsString());
      var channel = json.event.item.channel;
      var ts = json.event.item.ts;
      var reaction = json.event.reaction;

解決した

次回に続く