2022/08/13に更新

【GASで保全】Slackのデータをリアルタイムでスプレッドシートにバックアップする

SlackAPIスプレッドシート

Slackに投稿したメッセージをほぼリアルタイムにGoogle スプレッドシートにバックアップするGoogle Apps Scriptです。無償版Slackはデータの保存期間が90日に短縮されるので作ってみました。

こんな悩みを解決します


  • 無償版のSlackを使っているけど90日でメッセージが消えてしまう・・どうして・・・
  • Slackの障害に備えてメッセージのバックアップを取得したい。リアルタイムで。

用意するもの


特にありません。スプレッドシートがあればOKです。

このスクリプトで出来ること


  • Slackの特定チャンネルに投稿されたすべてのメッセージを、スプレッドシートに記録することができます。
  • メッセージログは月ごとに別のシートに記録します。

使い方


1.GAS側の準備

このスクリプトは設置に少々手間がかかります。
まずはスプレッドシートを1つ作成して、スクリプトエディタを開いてコードをコピペしてください。
一番上の「事前設定エリア」に作成したスプレッドシートのファイルURLをセットしてください。

Webアプリケーションとして動かすため、右上の「デプロイ」から「新しいデプロイ」を押します。

歯車アイコンから「ウェブアプリ」を選択します。

ウェブアプリの設定画面が開きます。
説明文は適当に、実行ユーザーは自分、アクセスできるユーザーは全員とします。
すべての入力、選択が終わったら「デプロイ」を押しましょう。
権限の承認画面が出たら内容を確認した上で承認してください。

デプロイIDとウェブアプリのURLが発行されました。
ウェブアプリのURLはSlack側の設定で使いますのでコピーしておいてください。

2.Slack側の設定(Outgoing Webhook)

さて、次はSlack側の設定です。
Outgoing Webhookという機能を使って、メッセージの投稿をトリガーに外部サービス(今回は自作のGAS Webアプリケーション)に接続します。
Slackアプリの左上にあるワークスペース名をクリックして、「設定と管理」から「ワークスペースの設定」に移動します。

画面が切り替わったら「App管理」をクリックします。

上に検索窓がありますので「Outgoing webhook」と検索し、ヒットしたものをクリックします。

「Slackに追加」をクリックします。

あともう少しです。
「Outgoing webhook インテグレーションの追加」を押します。

メッセージを転送したいチャンネルを選択します。
「すべてのチャンネル」も選択可能なのですが、そうしてしまうと特定キーワードが含まれる場合にしかOutgoing Webhookが発火してくれないようです。
特定チャンネルであればすべてのメッセージをトリガーに発火してくれます。

「引き金となる言葉」は空欄、「URL」にはGAS側の準備でコピーしておいたウェブアプリのURLを入力しましょう。
お疲れさまです!これで準備完了です。

3.動作確認

Outgoing Webhookで指定したチャンネルに移動して、適当にメッセージを送ってみます。

スプレッドシートを見てみると・・・
年、月のシートが作成されてメッセージが書き込まれています!

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00130/index.html
 */

function doPost(json) {

  // ########## 事前設定エリア ここから ##########

  const ss_url = 'https://docs.google.com/spreadsheets/d/******************';

  // ########## 事前設定エリア ここまで ##########


  // Slackから受け取ったJSONから、必要なデータを拾う
  const username = String(json['parameters']['user_name']); // Slackの投稿者名 
  const workspace = String(json['parameters']['team_domain']); // ワークスペース名
  const channel = String(json['parameters']['channel_name']); // 投稿先チャンネル名
  const datetime = Utilities.formatDate(new Date(json['parameters']['timestamp'] * 1000), 'JST', 'yyyy/MM/dd HH:mm:ss'); // 投稿日時(整形する)
  const message = String(json['parameters']['text']); // メッセージ本文

  // ログを書き込むスプレッドシートのオブジェクトを取得
  const ss = SpreadsheetApp.openByUrl(ss_url);

  // ログは現在の年月(YYYYMM)のシート名に書き込むため、シートが存在するかどうかをチェックし、無ければ作成する
  // スプレッドシートに存在するすべてのシートを取得する
  const sheets = ss.getSheets();

  // ログの書き込み先シート名を定義。
  const name_log_sheet = Utilities.formatDate(new Date(), 'JST', 'yyyyMM');

  // 存在するシートの名前を格納する配列を準備
  const sheets_name = [];

  // 存在するシートの数だけループ
  for (let i = 0; i < sheets.length; i++) {

    // シート名を配列に追加していく
    sheets_name.push(sheets[i].getName());

  }

  // ログ書き込み先のシートオブジェクト用の変数
  let log_sheet;

  // 既存シートの名前に今月のシート名(例:202208)があるかどうかチェック、無ければ
  if (sheets_name.indexOf(name_log_sheet) == -1) {

    // シートが存在しないので作成する
    log_sheet = ss.insertSheet().setName(name_log_sheet);

    // 1行目に項目名も追加する
    log_sheet.appendRow(['日時', 'ワークスペース', '投稿先チャンネル', 'ユーザー名', 'メッセージ'])

  }

  // ログ書き込み先シートのオブジェクトを取得
  log_sheet = ss.getSheetByName(name_log_sheet);

  // ログを書き込む
  log_sheet.appendRow([datetime, workspace, channel, username, message]);

}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp