はじめに
最近の社内のチャットツールとしてSlackがよく使われていると思います。Slackには便利なデフォルト機能に加え、さまざまなアプリや拡張機能が用意されています。
今回は、SlackアプリとGoogle Apps Script (GAS) を活用し、特定のチャンネルに投稿された内容を自動的にGoogleスプレッドシートに記録するシステムを構築するハンズオンを行います。
今回のハンズオンを体験すれば、単に投稿内容を記録するだけでなく、さまざまな応用ができると思います。
Slackアプリ作成手順
1. Slack APIページでアプリ作成
1. Slack APIページにアクセスします。
2. Create an Appボタンをクリックして、新しいアプリを作成します。
3. From scratchを選択します
4. アプリ名とワークスペースを指定します。
2. Appの設定
1. 作成したアプリのダッシュボードに移動し、 OAuth & Permissionsをクリックします。
2. Scopes セクションで必要な権限を選択します(下記一例)
-
chat:write
:メッセージを送信するための権限 -
channels:read
:チャンネルの情報を取得するための権限 -
groups:read
:プライベートチャンネルの情報を取得するための権限 -
channels:history
:パブリックチャンネル内の過去のメッセージを読み取る権限
を設定しました。
Scope権限一覧
3. App HomeからDisplay Nameを設定
※これを設定しないとワークスペースにインストールすることができません
3. Appのインストール
1. Install Appセクションに移動し、Install to Workspaceボタンをクリックします。
Scopeを変更すると再度ワークスペースにインストールしないといけません
2. チャンネルにアプリをインストールする
追加したいチャンネルに移動し、上部の太文字のチャンネル名をクリックするとモーダルが開く、その中でインテグレーションというタブがあるので開く。
アプリを追加するというボタンがあるのでそこから先ほどワークスペースに追加したアプリを追加する
ここまでできたら、slackでの設定は終了です。次はGASの設定に移りましょう
4. GAS (Google Apps Script) の設定
1. スプレッドシートにアクセスしてApps Scriptを開く
- 対象のスプレッドシートを開きます
- 拡張機能メニューをクリックし、App Scriptを選択してGoogle Apps Scriptのエディターを開きます。
2. プロジェクトの設定から環境変数を設定する(何をGASでしたいのかで変わるので必要な環境変数を確認してください)
3. エディタの方でコードを記述する(下記は一例です)
// Slackからのメッセージ取得
function fetchSlackMessages() {
const url = "https://slack.com/api/conversations.history";
const options = {
method: "get",
headers: {
Authorization: "Bearer " + PropertiesService.getScriptProperties().getProperty("SLACK_API_TOKEN"),
},
muteHttpExceptions: true,
};
const channelId = PropertiesService.getScriptProperties().getProperty("CHANNEL_ID");
const response = UrlFetchApp.fetch(`${url}?channel=${channelId}`, options);
const data = JSON.parse(response.getContentText());
if (!data.ok) {
throw new Error("Slack API call failed: " + data.error);
}
return data.messages;
}
// メッセージをスプレッドシートに書き込む
function logMessagesToSheet() {
const sheet = SpreadsheetApp.openById(PropertiesService.getScriptProperties().getProperty("SPREADSHEET_ID"))
.getSheetByName(PropertiesService.getScriptProperties().getProperty("SHEET_NAME"));
const messages = fetchSlackMessages();
messages.forEach(message => {
sheet.appendRow([new Date(), message.user, message.text]);
});
}
// トリガー設定
function setTrigger() {
ScriptApp.newTrigger("logMessagesToSheet")
.timeBased()
.everyMinutes(10)
.create();
}
4. デプロイ
コードが完成したら、デプロイします
アクセスできるユーザーは全員や自分のみが選択できるのですが、どちらでも大丈夫です。
自分のみの方がセキュリティ上は安全です。
これで完成です。あとはslackで投稿されれば自動で書き込みをしてくれます。
まとめ
結構簡単に作ることできるね