めっちゃ歩く
フリーランスITエンジニアの
山旅系雑記ブログ
IT PR

【Slack・GAS】Slack Appを使ってSlackのメッセージをスプレッドシートに書き込む方法

<商品表示法に基づく表記>記事内にアフィリエイト広告が含まれている場合があります。

Slackのメッセージの内容をGoogleスプレッドシートに書き込みたいと思ったことはないでしょうか?

無料版Slackは保存できるメッセージの容量や期間に制限があるので、過去のメッセージが利用できなくなります。

データのエクスポートをすればメッセージのバックアップを取ることが出来ますが、手作業でバックアップを行うのは面倒です。

そこでこの記事では、Slack AppとGoogle Apps Script(GAS)を使って、SlackのメッセージをGoogleスプレッドシートに書き込む方法について解説します。

この記事がおすすめな人
  • Slackのメッセージをスプシに書き込む方法を知りたい人
  • Outgoing WebhookではなくSlack Appで連携したい人
  • 無料版Slackのバックアップ方法を探している人

事前準備

以下のアカウントを用意してください。

  • Slack
  • Google

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の設定をします。

  1. サイドメニューの「Event Subscriptions」をクリックします。
  2. 「On」に変更します。
  3. Request URLに「ウェブアプリのデプロイ」でコピーしたURLをペーストします。
    ここでURL Verificationの確認が行われ、成功すると「Verified」と青字で表示されます。失敗した場合は、コピーしたURLが正しいか確認してください。
  4. Subscribe to bot eventsに「message.channels」を追加します。

ワークスペースにSlack Appをインストール

ワークスペースにSlack Appをインストールします。

  1. サイドメニューの「Basic Information」をクリック
  2. 「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スプレッドシートに書き込む方法の解説でした。

今回は最低限の情報のみスプレッドシートに出力する方法を紹介しましたが、この方法を応用すれば、メッセージ送信者を出力したり書き出すシートを切り分けることも可能です。

ぜひお試しください。

created by Rinker
¥2,860 (2024/07/27 22:37:30時点 楽天市場調べ-詳細)

おまけ

現在、フリーランスエンジニアとして数ヶ月働いて、数ヶ月の休みを取る生活をしています。

長期休暇がとれるフリーランスエンジニアになる方法を解説していますので、「まとまった休みがほしい」「自由な働き方をしたい」と思っている方はぜひ参考にしてください。

また、長期休暇の間は数ヶ月に渡る徒歩の旅をしています。
旅についての記事も公開していますので、興味がある方は読んでみてください。