つれづれなるままに日々の色々なことを綴ります

【GAS】特定のChに特定のメッセージが送信されたらお返事を返す

GASを勉強しています。忘れないように学習メモを作っています。 そのままコピペして動くみたいな記事ではないのでお気をつけを。

やったこと

  • 特定のChに特定のメッセージが送信されたら、お返事を返す

コード全文

if ( json.event.type === 'message') {
    handleEvent(json.event);
    } 

function handleEvent(event) {
  const targetChannelID = "チャンネルID"
  // メッセージが特定のチャンネルで送信されたかどうかを確認
  if (event.channel === targetChannelID && event.text.includes('ワッショイ!')) {
    // メッセージが特定の条件を満たしている場合に返信
    sendReply(event.channel, createMessage());
  }
}
function createMessage() {
  return 'ご用件をどうぞ!';
}
function sendReply(channelID, message) {
  let token = "xoxb-HOGEHOGE"
  let url = "https://slack.com/api/chat.postMessage";
  let payload = {
    "channel" : channelID,
    "text" : message,
     };
  let options = {
    "method" : "post",
    "contentType" : "application/json",
    "headers": {"Authorization": "Bearer " + token},
    "payload" : JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options);
}
  • 送られてきたJsonのeventのtypeがmessageだったらhandleEventを呼び出しています。
  • messageイベントを受け取るためには、Event Subscriptionsでmessage.channelsを登録してあげる必要があります。
  • messageイベントで送られてくるリクエストには本文テキストが含まれているので、指定の文字が含まれているときにお返事を返すようにしてあげます。

つまづいたこと

  • 当初、Event Subscriptionsに頼らない形の実装を試みていました。
  • GASのトリガーにて、1分おきにチャンネルヒストリーを読み込み、指定の文字列があれば返事を出すというものです。しかし下記の点でつまづき、取りやめました。
    • 最大1分の遅延が発生する
    • 過去送信されたすべての指定の文字列に対して返事をしてしまう
      • こっちは対処法も考えてみましたが、うまく作動せず…

api.slack.com

まとめ

指定のメッセージが送信されたというのをどう感知するかが悩ましいポイントでした。