SlackユーザーグループのIDを返すライブラリ
自己紹介
この記事はN/S高等学校 Advent Calendar 2022 の24日目の記事です。
はじめまして。
学校法人角川ドワンゴ学園のnaoki_sakanoといいます。
プログラミングスクールN Code Laboの教室長を経て、今はコンテンツ制作の部署にいます。
今回の記事概要
昨年のアドベントカレンダーではGASでSlackAPIを使ってDM送信してみたという記事を書きました。
おかげさまで1812view(2022/12/10現在)の閲覧があり、楽しんで読んで頂けたようです。
ぼっち・ざ・ろっく!見ながら書いているのですが、1812viewsで喜んでたら死んでしまいそうになりました。
今回は、同じGASでSlackDMを送信するネタなのですが、GASさえ使うことができれば、誰でも簡単にSlack通知が出来るライブラリをつくりましたので、その話をしていこうと思います。
ということでタイトルコールはこちら(ここで OverSoul/林原めぐみ を流す)
SlackユーザーグループのIDを返すライブラリ
ということで概要はこちら
- Slackユーザーグループとは?
- 個人メンションとユーザーグループメンションの違い
- SlackAPIの権限
- 作ったもの
- デプロイ
- マニュアルも作ったよ
Slackユーザーグループとは?
ユーザーグループはSlackの機能の一つで、メーリングリストのようなグループです。
普段10人にメンションをつけたい場合、@taro_tanaka @hanako_yamada… とメンションを付け続けていく必要があります。
これを@n_teachers のようなまとまりにしてあげることで、1メンションで複数人にメンションを飛ばすことができます。
詳しくはSlackの説明をご覧ください。
ユーザーグループの何がよいかって、個人に紐付くのではなくグループに紐付くので、人事異動とかでメンバーが変わったら(ユーザーグループがメンテされていれば)旧メンバーには通知がいかず、新メンバーには通知が行くようになることです。
Nラボでは「特定の教室のスタッフに通知したいとき」に利用しています。
特定の教室のスタッフに通知したいときとは、例えば
- 新宿教室に入会があったとき
- 横浜教室に暴風警報が発令されたとき
- 秋葉原教室で生徒のメールアドレス変更の依頼があったとき
なんかがありますね。(上は一例なので必ずしも運用しているとは限りません)
個人メンションとユーザーグループメンションの違い
GASでメンションをつけるテキストを書くときは大体以下のようになります。
const text = "<@id>さん、こんにちは"
上記は個人にメンションをつけるときになります。
同じようにユーザーグループでもメンションをつければいけるんじゃないか、と思うじゃないですか。
できないんですよ。
ちなみにユーザーグループIDは以下のやり方で出来ます。
本記事のライブラリをSlackで公開したところ、以下のような利用者の声が届きまして、そこではじめて正規の取得方法を知りました
(以下原文まま)
今までWEB版Slackで、メンバーディレクトリとユーザー>ユーザーグループ開いた時のURLの後ろを取ってきていたので、開く手間が省けます:ピカピカ:
マジかよ。。。
さて、では仮にユーザーグループのIDを取得したとして、どうやってメンションをつけるのか。
実は個人メンションとユーザーグループメンションとで、記法が異なっているのです。
個人メンション | ユーザーグループメンション |
---|---|
<@id> | <!subteam^id> |
なので、ユーザーグループでメンションを飛ばしたい場合
- ユーザーグループのIDの取得が面倒
- 記法が違うので注意が必要
と2つの面倒事が絡んできます。
もう一度言います。
面倒です
なので、みんなが欲しいものは以下ですよね?
ユーザーグループ名さえ指定すれば勝手にidを返して、しかもメンションもつけてくれるようにして欲しい
はい。これを作りました。
SlackAPIの権限
今回作ったものはincoming Webhook以外にSlackAPIの権限が必要になります。
事前にSlackAppを作って、usergroups.listが使える権限を作っておきます。
詳しくは以下の記事が詳しいので、こちらを参考にしてください。
SlackAPIを使うために必要な準備
作ったもの
ということでさっくり本題のソースコードです。
TOKENだけはおのおので設定してくれれば使えます。
function getGroupIdByIdSubName(groupName) {
const TOKEN = PropertiesService.getScriptProperties().getProperty("TOKEN");
const url = "https://slack.com/api/usergroups.list";
const options = {
"method": "POST",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": TOKEN
}
};
const response = UrlFetchApp.fetch(url, options);
const res = JSON.parse(response);
for(i in res['usergroups']){
if(groupName == res['usergroups'][i]['handle']){
return "<!subteam^" + res['usergroups'][i]['id'] + ">";
}
}
return 'error';
}
function getGroupIdByNameSubName(groupName) {
const TOKEN = PropertiesService.getScriptProperties().getProperty("TOKEN");
const url = "https://slack.com/api/usergroups.list";
const options = {
"method": "POST",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": TOKEN
}
};
const response = UrlFetchApp.fetch(url, options);
const res = JSON.parse(response);
for(i in res['usergroups']){
if(groupName == res['usergroups'][i]['name']){
return "<!subteam^" + res['usergroups'][i]['id'] + ">";
}
}
return 'error';
}
デプロイ
上記ソースコードをデプロイすれば、誰でも使うことができます。
ただし、ワークスペースにSlackAppをインストールしている都合上、ワークスペース内でしか使えないので、外部公開するメリットは何もありません。
デプロイはライブラリにして、色々設定をすればいけます。
使用例
デプロイするとライブラリとしていろんなGASで使うことが出来るようになります。
今回は、slackGroups
という名称のライブラリにしました。
使用感はほぼAPIと同じなので、以下のような使い方になります。
仮に経理(keiri)というユーザーグループがあったとして、経理ユーザーグループにメンションをつけるものとして紹介します。
groupId = slackgroups.getGroupIdByIdSubName("keiri")
console.log(groupId + "のみなさんこんにちは")
groupName = slackgroups.getGroupIdByNameSubName("経理")
console.log(groupName + "のみなさんこんにちは")
↓実行結果
<!subteam^取得したid>のみなさんこんにちは
<!subteam^取得したid>のみなさんこんにちは
マニュアルも作ったよ
さて、これを公開したのですが、ライブラリの使い方をみなさんがわかってるとは思わないです。
マニュアルを作るときは自分がわかっていることをわかっていない人が読むものです。
よって、ユーザーグループとは何か、どう使えば良いのか、みたいなマニュアルを作成しました。
当たり障りのない部分をお見せするとこんな感じ。
最後に宣伝
N Code Laboの紹介
N Code Laboは小〜高校生向けのプログラミングスクールで、多分子供向けプログラミングスクールでは珍しいオブジェクト指向も"しっかり"学ぶことができるプログラミングスクールです。
通学する教室では無料体験授業を、ネットコースでは水曜と土曜に説明会を実施していますので、よかったら一度覗いてみてください。
N Code Labo採用の紹介
N Code Laboでは生徒に授業をしてくれる講師、教室長など各種職員の採用を行っております。
コチラも募集していますので、興味があればぜひご応募ください。