kintoneレコード保存時、複数人にslack_DM送信(kintone×JavaScript)
目次
※本ページ先頭に戻りたい場合は画面右下のボタンを押して下さい。
概要
kintoneのレコード保存時に、複数人グループを作成してSlack_DM送信を行う
プログラムを作成した理由
SlackのDMにて
「こちらのチャンネルで貴方宛にお送りしております。忘れずにご対応をお願いします」と
「担当者」「担当者上司」にアナウンスを行う必要が出てきた為。
背景
「●●の場合に、指定チャンネルにslack通知」を度々実装しているが、
チャンネル不参加者をメンションしても、不参加者には通知されない為、
「通知される可能性のあるメンバーを必ずチャンネルに参加させる」事が前提条件となっている。
ある案件にて、
「通知する可能性がある人」を全員参加させると
1000人規模のチャンネルになる事が懸念された為、
「大体のメンバーは参加されているかと思いますが、
不参加者がいる場合に備えて、DMでリンク先をお送りしております」
という流れにして
「チャンネル参加者の精査」という仕事を回避した。後から
「通知されていないメンバーの対応漏れがあったのですが、どう責任取ってくれるんですか?」
と言われるのも面倒ですし←
ソースコード
大まかに下記構成となっております。
- DMグループの作成
- DMグループのチャンネルIDを取得
- 取得したチャンネルIDにてslack通知
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | (function() { 'use strict'; // レコードが保存された場合 kintone.events.on(["app.record.create.submit.success","app.record.edit.submit.success"], function(event) { // botのID const SLACK_API_ID = "xoxb-から始まるID"; // ドメイン名 const DOMAIN_NAME = "hogehoge…" // アプリ名 const APP_NAME = "hogehoge…" // レコード情報 const record = event.record // 送信先のdm_id取得 let staff_slack_dm_id = record['担当者_slack_dm_id']['value']; let boss_slack_dm_id = record['上司_slack_dm_id']['value']; // DMを送りたいメンバー const MENTION_LIST = staff_slack_dm_id + "," + boss_slack_dm_id; // DMグループ let body = { 'users': MENTION_LIST, }; // slack書込み情報設定 let headers = { 'Content-Type': 'application/json', "Authorization": "Bearer " + SLACK_API_ID }; // DMグループの作成(既存グループがあれば開く) return kintone.proxy("https://slack.com/api/conversations.open", 'POST', headers, body).then(function(resp) { // 複数人のDMグループのチャンネルIDを取得 let result = JSON.parse(resp[0]) const CHANNEL_ID = result["channel"]["id"] // kintoneアプリに飛べるをリンク作成 let id = record.$id.value; let kintone_Url = "https://" + DOMAIN_NAME + ".cybozu.com/k/" + kintone.app.getId() + "/show#record=" + id; kintone_Url = "対象kintone:"+ " *<" + kintone_Url + "|リンク>* " // 通知先、文書設定 body = { 'channel': CHANNEL_ID, 'text': "TO:<@" + staff_slack_dm_id + ">" + "\n" + "CC:<@" + boss_slack_dm_id + ">" + "\n" +":keycap_star::keycap_star::keycap_star:【" + APP_NAME + "】アプリでレコードが保存されました:keycap_star::keycap_star::keycap_star:" + "\n" + kintone_Url + "\n" + "\n" + "対応ステータス:" + record['対応ステータス']['value'] + "\n" + "タスク_名称:" + record['タスク_名称']['value'] + "\n" + "タスク_詳細:" + record['タスク_詳細']['value'] }; // slack通知 kintone.proxy("https://slack.com/api/chat.postMessage", 'POST', headers, body) return event }); } ); })(); |
下記の解説
1、「DMグループの作成」
2、「DMグループのチャンネルIDを取得」
下記いずれかのパターンにてチャンネルIDを取得する必要があります。
- DM通知者達によるDMグループが作成済みの場合:
→既存DMグループのチャンネルIDを取得 - DM通知者達によるDMグループが存在していない場合:
→新たにDMグループを作成し、チャンネルIDを取得
「conversations.open」APIを用いる事で
上記いずれのパターンでも、DMグループのチャンネルIDを取得する事が出来ます。
※下記コード最終行の「result[“channel”][“id”]」にて取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // DMグループ let body = { 'users': MENTION_LIST, }; // slack書込み情報設定 let headers = { 'Content-Type': 'application/json', "Authorization": "Bearer " + SLACK_API_ID }; // DMグループの作成(既存グループがあれば開く) return kintone.proxy("https://slack.com/api/conversations.open", 'POST', headers, body).then(function(resp) { // 複数人のDMグループのチャンネルIDを取得 let result = JSON.parse(resp[0]) const CHANNEL_ID = result["channel"]["id"] }); |
3、「取得したチャンネルIDにてslack通知」の解説
下記コード内の「チャンネルID」「通知したい文章」を適宜変更し、
「chat_postMessage」APIを用いてslack通知します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // slack書込み情報設定 let headers = { 'Content-Type': 'application/json', "Authorization": "Bearer " + SLACK_API_ID }; // 通知先、文書設定 body = { 'channel': チャンネルID, 'text': "通知したい文章" }; // slack通知 kintone.proxy("https://slack.com/api/chat.postMessage", 'POST', headers, body) |
※DM送信時に「※詳細はスレッドにて」と連投したい場合は、下記記事を参照してください。
感想
GW中にslack_botを作成した際に
slack_apiに触れた経験が活きて、今回のDM送信処理を作成出来ました
様々な事が出来て便利な反面、
「slack_apiを用いた通知」は私しか作成ノウハウがない為、
いつかマニュアル化(記事化)した方が良さそうです…
編集履歴
2022/08/12 新規作成