メンション付きのSlackBot(新規参加者通知用)を作る【GoogleAppsScript(GAS)】

技術

こんにちは。ざわかける!のざわ(@zw_kakeru)です。
Slackのワークスペースに新しい人がやってきたときに通知してくれるBotを、GoogleAppsScriptを使って作成します。
既存参加者への通知と同時に、その新規参加者にメンションを付けることでSlack初心者への案内の役割も担っています。

やりたいこと(仕様)

  • ワークスペースに新規参加者が現れると#generalにメッセージを自動投稿する
  • メッセージ内で新規参加者をメンションする

やったこと

GASとSlackAPIとの連携

このnoteにやり方が丁寧に書いてあったので、その通りにしました。
(SpreadSheetを使ってうんぬん、の部分は私のやりたい事と異なっていたのでカットしました。)
また、イベントトリガーはteam_joinに設定しました。

ユーザーIDを取得してメンションする

SlackAPIでは<@ユーザーID>の記述でその人にメンションを飛ばすことができるみたいです(試行錯誤の結果判明)。
ユーザーIDの取得方法はAPI公式ドキュメントのteam_joinイベントとuserオブジェクトを確認します。

使用例を見るに、GASでは次の記述で実現できそうです。

  var p = JSON.parse(e.postData.getDataAsString());
  var message = "<@" + p.event.user.id + ">さん、ようこそ!\n"

完成

新規参加をトリガーにGASにアクセスし、GASからSlackAPIにメッセージを投げる。
その際にその新規参加者のidを盛り込んでメンションする。
という特に難しい部分もない基本的なbotの作りですね。
最終的に出来上がったコードは次の通りです。

function doPost(e){
  var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');  
  var slackApp = SlackApp.create(token); //SlackApp インスタンスの取得
  var p = JSON.parse(e.postData.getDataAsString());

  var options = {
    channelId: "#general",
    message: "<@" + p.event.user.id + ">さん、ようこそ!\n"
           + "↑の名前が `(整理番号)_(名前のイニシャル).(姓)`になっていない場合は、「プロフィールを編集」ボタンから「表示名」の欄の変更をお願いします。\n"
           + "(例:10032_M.Misaka)",
    iconUrl: "https://slack.com/img/icons/app-57.png"
  };
 
  slackApp.postMessage(options.channelId, options.message, {username: options.userName});
  
  //バリデーション用
  var params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}
  
function doGet(e){
  doPost(e);
}

デプロイしてみると、無事に想定通りの挙動になりました。

終わりに

SlackBotの作り方、という記事は検索すればたくさん出てきたのですが、肝心なコードの書き方の記事は出てこなかったので書いておきます。
試行錯誤もあったので本当はもっと丁寧に記事を書くつもりでしたが、やる気が無くなったのでこの程度の記述にしておきます。許してください。
(多分完成したコード見れば何をしているのか簡単に分かると思うので…)

また、上記実装にたどり着くまでに色々試した際、ユーザー名検索のためにAPIを叩くメソッドを作成しました。
もう使わなくなったので、ここで供養しておきます。↓

function findDisplayName(user_id, token) {
  var url = 'https://slack.com/api/users.info?token=' + token + '&user='+ user_id + '&pretty=1';
  var res = UrlFetchApp.fetch(url);
  var json = JSON.parse(res.getContentText());
  return json['user']['profile']['display_name']
}

以上です。

タイトルとURLをコピーしました