🤖

Google Apps ScriptでSlackのDMを送信する

2025/01/20に公開

こんにちは、TRUSTDOCKのよもぎたです。

はじめに

弊社ではGoogle WorkspaceとSlackを利用しています。Google WorkspaceのSpreadsheetなどの内容をもとにSlackでDMを送信したいというニーズがあり、手順を調べたので共有します。

SlackからSDKが提供されていますが、GASで利用できないようだったので、APIを直接呼んでいます。

大まかな流れ

大まかな流れは、Slackアプリの準備とGASでのスクリプト作成の2ステップです。

Slackアプリの準備

  1. Slackアプリを作成します
  2. アプリに権限を付与します
  3. アプリをワークスペースにインストールします

スクリプトの処理

  1. ユーザーとのチャンネルをOpenする
  2. メッセージを送信する
  3. チャンネルをCloseする

メッセージ送信先のユーザーを特定するために、対象ユーザーのSlackメンバーIDが必要です。メンバーIDはSlackのユーザーのプロフィールから取得できます。

メンバーIDの取得

それでは、具体的な手順です。

Slackアプリの準備

Slackアプリの作成

Slackのデスクトップアプリでアプリを作成したいワークスペースのホームタブを開き、ワークスペース名をクリックします。プルダウンメニューからツールと設定アプリを管理するを選択します。

ワークスペースにインストールされているアプリの一覧が開きます。右上のビルドリンクをクリックします。

自分で作成しているアプリの一覧が開きます。右上のCreate New Appボタンをクリックします。

Create New Appボタンをクリック

Create an appというダイアログが開くので、下のFrom scratchをクリックします。

From scratchをクリック

アプリの名前を入力してワークスペースを選択し、Create Appボタンをクリックします。

アプリ名を入力してワークスペースを選択

これでアプリが作成されます。

アプリへの権限付与

作成したアプリのページが開くので、左側のメニューからOAuth & Permissionsを開きます。

OAuth & Permissionsを開きます

右のScopesAdd an OAuth Scopeボタンをクリッ)クし、chat:writeim:writeの2つの権限を付与します。

権限を付与します

ワークスペースへのインストール

同じページの上の方にReinstall to <ワークスペース名>というボタンがあるのでクリックします。
アプリが実行できる内容の確認ページに遷移します。

この時、チャンネルと会話でアクションを実行するというプルダウンメニューに次の二つのアクションが表示されるはずです。

  • <@アプリ名> としてメッセージを送信する
  • 他のメンバーとダイレクトメッセージを開始する

実行できるアクションの確認

確認したら緑の許可するボタンをクリックします。

元のページに遷移します。このページのOAuth TokensBot User OAuth TokenをGASで使うので、コピーしておきます。

Tokenをコピー

スクリプトの処理

変数と定数の宣言

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);

ここまでのコードで、メッセージが送信できるはずです。

Slackで受信したテストボットからのメッセージ

チャンネルを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);

一連の処理を実行するコードは以上です。

最後に

ボットのユーザー名やアイコン、メッセージの装飾などほかに出来ることはたくさんあるのですが、風呂敷を広げると畳める自信が無いので必要最低限をまとめています。

是非リファレンスなどをご覧になって調べてみてください。私も機会があれば、他のことについてもまとめようと思います。

最後までお読みいただきありがとうございました。

TRUSTDOCK テックブログ

Discussion