Google Apps ScriptでSlackのDMを送信する
こんにちは、TRUSTDOCKのよもぎたです。
はじめに
弊社ではGoogle WorkspaceとSlackを利用しています。Google WorkspaceのSpreadsheetなどの内容をもとにSlackでDMを送信したいというニーズがあり、手順を調べたので共有します。
SlackからSDKが提供されていますが、GASで利用できないようだったので、APIを直接呼んでいます。
大まかな流れ
大まかな流れは、Slackアプリの準備とGASでのスクリプト作成の2ステップです。
Slackアプリの準備
- Slackアプリを作成します
- アプリに権限を付与します
- アプリをワークスペースにインストールします
スクリプトの処理
- ユーザーとのチャンネルをOpenする
- メッセージを送信する
- チャンネルをCloseする
メッセージ送信先のユーザーを特定するために、対象ユーザーのSlackメンバーIDが必要です。メンバーIDはSlackのユーザーのプロフィールから取得できます。
それでは、具体的な手順です。
Slackアプリの準備
Slackアプリの作成
Slackのデスクトップアプリでアプリを作成したいワークスペースのホームタブを開き、ワークスペース名をクリックします。プルダウンメニューからツールと設定
→アプリを管理する
を選択します。
ワークスペースにインストールされているアプリの一覧が開きます。右上のビルド
リンクをクリックします。
自分で作成しているアプリの一覧が開きます。右上のCreate New App
ボタンをクリックします。
Create an app
というダイアログが開くので、下のFrom scratch
をクリックします。
アプリの名前を入力してワークスペースを選択し、Create App
ボタンをクリックします。
これでアプリが作成されます。
アプリへの権限付与
作成したアプリのページが開くので、左側のメニューからOAuth & Permissions
を開きます。
右のScopes
のAdd an OAuth Scope
ボタンをクリッ)クし、chat:write
とim:write
の2つの権限を付与します。
ワークスペースへのインストール
同じページの上の方にReinstall to <ワークスペース名>
というボタンがあるのでクリックします。
アプリが実行できる内容の確認ページに遷移します。
この時、チャンネルと会話でアクションを実行する
というプルダウンメニューに次の二つのアクションが表示されるはずです。
- <@アプリ名> としてメッセージを送信する
- 他のメンバーとダイレクトメッセージを開始する
確認したら緑の許可する
ボタンをクリックします。
元のページに遷移します。このページのOAuth Tokens
のBot User OAuth Token
をGASで使うので、コピーしておきます。
スクリプトの処理
変数と定数の宣言
let slack_api_url // Slack APIのURLを代入します
let headers // HTTPヘッダを代入します
let options // URLFetchAppのOptionsを代入します
let response // URLFetchAppの戻り値を代入します
let response_json // responseをJSONにparseした値を代入します
let channel_id // ユーザーとのチャンネルIDを代入します
let message // ユーザーに送信するメッセージを代入します
let payload // POSTリクエストのBodyを代入します
const slack_oauth_token = 'xoxb-...'; // 先程コピーしたBot User OAuth Tokenを代入します
const slack_member_id = 'U.......'; // DMを送信するユーザーのメンバーIDを代入します
ユーザーとのチャンネルをOpenする
チャンネルをオープンするため、[conversations.open](https://api.slack.com/methods/conversations.open)
APIをメンバーIDを付けて呼び出します。
slack_api_url = 'https://slack.com/api/conversations.open?users=' + slack_member_id + '&pretty=1';
headers = {'Authorization': 'Bearer ' + slack_oauth_token};
options = {'headers': headers};
response = UrlFetchApp.fetch(slack_api_url, options);
response
をパースしてチャンネルIDを取得します
response_json = JSON.parse(response.getContentText());
channel_id = response_json.channel.id
メッセージを送信する
メッセージの送信はchat.postMessageAPIを使用します。
slack_api_url = 'https://slack.com/api/chat.postMessage';
ヘッダにはTokenとContent-Typesを指定します。
headers = {'Authorization': 'Bearer ' + slack_oauth_token,
'Content-types': 'application/json; charset=UTF-8'};
POSTリクエストのBODYにはチャンネルIDとメッセージを指定します。
message = 'こんにちは、テストボットです!';
payload = {'channel': channel_id, 'text': message}
URLFetchAppのOptionsにメソッドとヘッダとリクエストボディを指定します。
options = {'method': 'POST', 'headers': headers, 'payload': payload};
いざ、メッセージを送信します。
response = UrlFetchApp.fetch(slack_api_url, options);
ここまでのコードで、メッセージが送信できるはずです。
チャンネルをCloseする
メッセージを送信したら、conversations.closeAPIを利用してチャンネルをクローズします。
slack_api_url = 'https://slack.com/api/conversations.close?channel=' + channel_id + '&pretty=1';
headers = {'Authorization': 'Bearer ' + slack_oauth_token};
options = {'headers': headers};
response = UrlFetchApp.fetch(slack_api_url, options);
一連の処理を実行するコードは以上です。
最後に
ボットのユーザー名やアイコン、メッセージの装飾などほかに出来ることはたくさんあるのですが、風呂敷を広げると畳める自信が無いので必要最低限をまとめています。
是非リファレンスなどをご覧になって調べてみてください。私も機会があれば、他のことについてもまとめようと思います。
最後までお読みいただきありがとうございました。
Discussion