🗳️

GASで作るシンプルなSlack多数決BOT

2024/03/03に公開

実行イメージ

マルバツでリアクションしてもらって、あとは目視で数えます。
複数投票できてしまうなど仕組みとしてはガバガバですがランチ会の日程調整などであれば十分なのではないかと思っています。

コード

const BOT_USER_OAUTH_TOKEN = "xoxb-NNNNNNNNNNNN-NNNNNNNNNNNNN-XXXXXXXXXXXXXXXXXXXXXX";

class SlackRequest {
  constructor(channelId) {
    this.cid = channelId;
    this.reqs = [];
  }
  setText(s) {
    const payload = {
      "token": BOT_USER_OAUTH_TOKEN,
      "channel": this.cid,
      "text": s
    };
    const req = {
      "url": "https://slack.com/api/chat.postMessage",
      "method": "POST",
      "payload": payload
    }
    this.reqs.push(req);
  }
  getReqs() {
    return this.reqs;
  }
}

const ack = (payload) => {
  if (typeof payload === "string") {
    return ContentService.createTextOutput(payload);
  }
  return ContentService.createTextOutput(JSON.stringify(payload));
}

function doPost(e) {
  const channelId = e.parameter.channel_id;
  const sreq = new SlackRequest(channelId);
  const initMsg = `<@${e.parameter.user_id}> さんが多数決を実施しました!\n選択肢::o: \`:o:\`  :x: \`:x:\``;
  sreq.setText(initMsg);
  e.parameter.text.replace(/\r/g, "").split("\n").filter(line => line.trim().length).forEach(line => {
    sreq.setText(line);
  });
  UrlFetchApp.fetchAll(sreq.getReqs());

  return ack("");
}

工夫ポイント

このコマンドはボットとして複数回メッセージを投稿します。
UrlFetchApp.fetch を何回も繰り替えすとSlackのタイムアウト制限に引っかかってエラーが表示されがち(投稿自体は問題なく行われる)なので、この回避のために UrlFetchApp.fetchAll を使っています。

ワークスペースへの導入方法

Google Apps Scriptのデプロイ

上記のコードを保存してデプロイします(初回はおそらく認証を求められるはず)。
アクセスできるユーザー は「全員」です。

デプロイのたびにURLが発行されるのでコピーして控えておきましょう。このURLに対してSlackからリクエストを投げることになります。

アプリケーションの導入

Display Information を設定してから、

スラッシュコマンドを登録します。先ほど控えていたURLはこの Request URL に指定します。

続いてアプリをインストールします。

そうするとBot User OAuth Tokenが発行されるので、このトークンをGASのコードに貼り付けます。

チャンネル(or グループDM)にボットを招待する

ボットとしてメッセージを投稿するためにはチャンネルに招待する必要があります。
グループDMでも同じ仕様なので、すでに9名でDMをしている場合はこのボットは使えません。

Discussion