スプレッドシートからSlackチャンネル/DM通知(GAS)
目次
※本ページ先頭に戻りたい場合は画面右下のボタンを押して下さい。
概要
スプレッドシートから下記情報を取得し、Slackチャンネル通知とDM通知を行う
- slack_id
- チャンネル送信内容
- DM送信内容
※下記「Slack通知後、スレッドに連投」記事のように、連投(返信)も可能
プログラムを作成した理由
下記「スプレッドシートからkintoneレコードにコメント」にて3回コメントされても、対応されていない方への最終手段として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 77 78 79 80 81 82 83 84 85 86 87 88 89 | // テスト用 function test_post_slack(){ // slack情報 const SLACK_API_TOKEN = "xoxb…" const SLACK_CHANNEL_ID = "channel_id" // slackリンク先_テンプレート const SLACK_CHANNEL_ID_TEMPLATE_LINK = "{slack_channel_id}" const SLACK_THREAD_TS_TEMPLATE_LINK = "{thread_ts}" const SLACK_TEMPLATE_LINK = "https://slack.com/archives/" + SLACK_CHANNEL_ID_TEMPLATE_LINK + "/" + SLACK_THREAD_TS_TEMPLATE_LINK // シートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //A列_空白を除いた最終行取得 const lastRow = sheet.getRange(sheet.getMaxRows(), 1). getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //項目名の下行(2行目)から最終行までループ処理 for(let target_rows = 2 ; target_rows <= lastRow; target_rows++){ // メンション設定 // ※<@slack_id>という形でslack_idを設定。 // ※複数指定したい場合は、<@●●●><@▲▲▲>のように繰り返し設定 let slack_dm_id = sheet.getRange(target_rows, 2).getValue(); send_names = "<@" + slack_dm_id + ">" // 1回目_slack通知文章 let slack_comment = sheet.getRange(target_rows, 3).getValue(); // 1回目_slack通知 var thread_ts = thread_post_slack("slackチャンネル通知_タイトル", SLACK_API_TOKEN, SLACK_CHANNEL_ID, send_names, slack_comment) // DMの通知先リンク用に、1番最初のslack通知タイムスタンプ取得 let dm_thread_ts = thread_ts // 2回目_slack通知文章 slack_comment = sheet.getRange(target_rows, 4).getValue(); // 2回目_slack通知 thread_post_slack("slackチャンネル通知_本文", SLACK_API_TOKEN, SLACK_CHANNEL_ID, send_names, slack_comment, thread_ts) // 整形前のslack通期先リンクを取得 let slack_link = SLACK_TEMPLATE_LINK // チャンネルIDを反映 slack_link = slack_link.replace(SLACK_CHANNEL_ID_TEMPLATE_LINK, SLACK_CHANNEL_ID) // 1回目通知タイムスタンプを反映 slack_link = slack_link.replace(SLACK_THREAD_TS_TEMPLATE_LINK, dm_thread_ts) // DM送信文章取得 slack_dm_contents = sheet.getRange(target_rows, 5).getValue(); // DM送信文章に完成したslackリンクを反映 slack_dm_contents = slack_dm_contents + "\n" + "\n" + "通知先チャンネルのURL:" + slack_link // DM通知 thread_post_slack("slackチャンネル通知_本文", SLACK_API_TOKEN, slack_dm_id, send_names, slack_dm_contents) } } // 概要:slack通知 ※スレッドタイムスタンプを指定すると、返信 // 第一引数:エラー発生時の「●●処理でエラーが発生致しました」と表示する内容 // 第二引数:「xoxb」から始まるIDを設定 // 第三引数:チャンネルID or メンバーID // 第四引数:通知先メンション // 第五引数:通知内容 // 第六引数:スレッド_タイムスタンプ(省略時:新規投稿。設定時:返信) function thread_post_slack(post_type_name, slack_api_token, channel_id, send_names, message, thread_ts=null) { const URL = "https://slack.com/api/chat.postMessage"; var payload = { "token" : slack_api_token, "channel" : channel_id, "text" : send_names + "\n" + message } if(thread_ts){ payload["thread_ts"] = thread_ts; } var params = { "method" : "post", "payload" : payload } try{ // Slack通知 const response = UrlFetchApp.fetch(URL, params); // Slack通知後のスレッドタイムスタンプ取得 var dates = JSON.parse(response.getContentText('utf-8')) }catch(e){ // 異常終了 console.log(post_type_name + "処理でエラーが発生しました。\\n 詳細:"+e) }finally{ // スレッドタイムスタンプが反映されていない場合は、投稿失敗 if(typeof dates['ts'] === "undefined"){ // 強制終了 console.log(post_type_name + "処理でエラーが発生しました。\\n 詳細:"+ "スレッド_タイムスタンプを取得出来ませんでした。") }else{ // スレッドのタイムスタンプを返却して処理終了 return dates['ts'] } } } |
「thread_post_slack」関数_引数の解説
- post_type_name:エラー発生時の「●●処理でエラーが発生致しました」と表示する内容
※エラー発生時に解析し易い文章でOK
- slack_api_token:「xoxb」から始まるIDを設定
※slack_botの作成方法は「SlackのAPI作成方法」を参照
※「Bot Token Scopes」に何を設定して良いか分からない…
という方は下記画像の権限全てを付与する事を推奨
- channel_id:
- チャンネルに送りたい場合:チャンネルIDを設定(左画像参照)
- メンバーにDMを送りたい場合:メンバーIDを設定(右画像参照)
- send_names:通知したいメンションを設定
※<@slack_id>という形でslack_idを設定
※複数指定したい場合は、<@●●●><@▲▲▲>のように繰り返し設定
- message:通知したい文章を設定
- thread_ts:
- 新規投稿したい場合:「1回目_slack通知」のように引数を省略する
- 返信したい場合:「1回目_slack通知」の返却値「thread_ts」を引数に指定
感想
「JavaScriptで下記の似たようなコードを書いているから転記するだけだし、楽勝!」
と思ってGASでも開発致しましたが、
外部アプリへアクセスするメソッドが異なる為、苦労致しました
※「UrlFetchApp.fetch」というGAS専用のメソッド?を使う必要がある
今回の開発にて、
JavaScript、GAS共にSlack送信が出来るようになったので、
今後は開発済みコードをコピペするだけで対応出来るようになったと思います
GAS開発はこれで5件目?と初心者なので、ドンドン開発していきたいところです
編集履歴
2022/08/20 新規作成