Slackのメッセージの内容をGoogleスプレッドシートに書き込みたいと思ったことはないでしょうか?
無料版Slackは保存できるメッセージの容量や期間に制限があるので、過去のメッセージが利用できなくなります。
データのエクスポートをすればメッセージのバックアップを取ることが出来ますが、手作業でバックアップを行うのは面倒です。
そこでこの記事では、Slack AppとGoogle Apps Script(GAS)を使って、SlackのメッセージをGoogleスプレッドシートに書き込む方法について解説します。
- Slackのメッセージをスプシに書き込む方法を知りたい人
- Outgoing WebhookではなくSlack Appで連携したい人
- 無料版Slackのバックアップ方法を探している人
目次
事前準備
以下のアカウントを用意してください。
- Slack
GASのウェブアプリをデプロイする
まずは、最初にGASのウェブアプリを作成しデプロイします。
プロジェクトの作成・スプレッドシートへの書き込み処理を実装
Slackからのメッセージを書き込むスプレッドシートを開きます。
ツールバーの「拡張機能」− 「Apps Script」をクリックし、新規プロジェクトを作成します。
以下のスクリプトをコピーし、スクリプトエディタ領域にペーストしてください。
function doPost(eventObj) {
var params = JSON.parse(eventObj.postData.getDataAsString());
//https://api.slack.com/events/url_verification 対応。セキュリティのため検証後はコメントする。
if(params.type === 'url_verification') {
return ContentService.createTextOutput(params.challenge);
}
// スプレットシートへの書き込み
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = activeSpreadsheet.getSheetByName("対象シート");
var sheet = activeSpreadsheet.getSheetByName(tartgetSheet);
var sheetLastRow = sheet.getLastRow();
var time = new Date(params.event.ts * 1000);
sheet.getRange(sheetLastRow + 1, 1).setValue(time);
sheet.getRange(sheetLastRow + 1, 2).setValue(params.event.text);
}
上記のスクリプトの補足は以下になります。
- 2行目:Slackのメッセージ送信で受け取ったイベントオブエジェクトをJOSNに変換します。イベントオブジェクトの詳細は公式ドキュメントのmessage.channelsを参照してください。
- 5-7行目:登録されたエンドポイントが実装されていることを確認するURL Verificationのための処理です。手順の後半で削除します。
- 11行目:出力先を「対象シート」シートに設定します。
- 16-17行目:A列に日時、B列にメッセージ内容を出力するように設定します。
ウェブアプリのデプロイ
「デプロイ▼」-「新しいデプロイ」をクリックします。
「種類の選択」の歯車アイコンをクリックし、「ウェブアプリ」をクリックします。
アクセスできるユーザーを「全員」にして「デプロイ」をクリックします。
今回実装したスクリプトからGoogleスプレッドシートへのアクセスを許可を求められるので承認します。
ウェブアプリのURLはSlack Appの設定で使用するので、URLをコピーしておきます。
Slack Appの作成・インストール
次にSlack Appを使ってSlackのチャンネルに投稿されたメッセージを取得します。
以前まではOutgoing WebhookというアプリをSlackに追加すると簡単にSlackからのメッセージを取得できましたが、公式がOutgoing Webhookは非推奨とアナウンスしています。
将来的にOutgoing Webhookは使用できなくなる可能性があるので、この記事で紹介しているSlack Appを使う方法がおすすめです。
Slack Appの作成
https://api.slack.com/apps/ にアクセスして「Create an app」(または「Create New App」)をクリックします。
「From scratch」をクリックします。
以下の項目でアプリ名と対象のワークスペースを選択します。
- 「App Name」:アプリ名を設定してください。
- 「Pick a workspace to develop your app in:」:メッセージを取得するSlackワークスペースを選択してください。
設定ができたら「Create App」をクリックします。
Event Subscriptionsの設定
次に、Event Subscriptionsの設定をします。
- サイドメニューの「Event Subscriptions」をクリックします。
- 「On」に変更します。
- Request URLに「ウェブアプリのデプロイ」でコピーしたURLをペーストします。
ここでURL Verificationの確認が行われ、成功すると「Verified」と青字で表示されます。失敗した場合は、コピーしたURLが正しいか確認してください。 - Subscribe to bot eventsに「message.channels」を追加します。
ワークスペースにSlack Appをインストール
ワークスペースにSlack Appをインストールします。
- サイドメニューの「Basic Information」をクリック
- 「Install to Workspace」をクリック
アプリからワークスペースへのアクセス許可を求められるので「許可する」をクリックします。
「インストールするボットユーザーがありません」と出た場合
ワークスペースにアプリをインストールする際に、「インストールするボットユーザーがありません」という旨のエラーが発生した場合は、ボット名が設定されているか確認してください。
サイドメニューの「App Home」- App Display Nameの「Edit」をクリックし、「Display Name(Bot Name)」と「Default username」を設定してください。
Slack Appをチャンネルに追加
作成したSlack Appをチャンネルに追加し、メッセージがスプレッドシートに書き込まれることを確認します。
作成したSlack Appをチャンネルに追加する
Slackを起動して、メッセージを取得したいチャンネルを右クリックし、「チャンネル詳細を表示する」をクリックします。
「インテグレーション」-「アプリを追加する」をクリックします。
作成したアプリの「追加」をクリックします。
動作確認
動作確認をします。
アプリを追加したワークスペースでメッセージを送信します。
対象のスプレッドシートのシートに日時とメッセージが保存されていれば成功です。
ちなみに、上図の2行目のデータはアプリがチャンネルに参加した時のメッセージです。
チャンネル参加のメッセージのイベントオブジェクトは通常のメッセージと異なるようです。
GASの内容を修正
最後にGASの修正します。
5-7行目のverification処理はSlack App作成時しか実行されないので削除(ここでは差分がわかるようにコメント)します。
修正をした後は、再デプロイも忘れずに実行してください。
function doPost(eventObj) {
var params = JSON.parse(eventObj.postData.getDataAsString());
//https://api.slack.com/events/url_verification 対応。セキュリティのため検証後はコメントする。
//if(params.type === 'url_verification') {
// return ContentService.createTextOutput(params.challenge);
//}
// スプレットシートへの書き込み
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = activeSpreadsheet.getSheetByName("対象シート");
var sheet = activeSpreadsheet.getSheetByName(tartgetSheet);
var sheetLastRow = sheet.getLastRow();
var time = new Date(params.event.ts * 1000);
sheet.getRange(sheetLastRow + 1, 1).setValue(time);
sheet.getRange(sheetLastRow + 1, 2).setValue(params.event.text);
}
まとめ:無料版Slackのバックアップも手軽にできる
以上、SlackのメッセージをGoogleスプレッドシートに書き込む方法の解説でした。
今回は最低限の情報のみスプレッドシートに出力する方法を紹介しましたが、この方法を応用すれば、メッセージ送信者を出力したり書き出すシートを切り分けることも可能です。
ぜひお試しください。
おまけ
現在、フリーランスエンジニアとして数ヶ月働いて、数ヶ月の休みを取る生活をしています。
長期休暇がとれるフリーランスエンジニアになる方法を解説していますので、「まとまった休みがほしい」「自由な働き方をしたい」と思っている方はぜひ参考にしてください。
また、長期休暇の間は数ヶ月に渡る徒歩の旅をしています。
旅についての記事も公開していますので、興味がある方は読んでみてください。