Slackの自分へのDMを、Google SpreadSheetに送信する

技術的な小ネタ

Slackで自分宛に来たDMを、Google SpreadSheet に送信する方法です。

結構情報あふれていると思ったのですが、以外と見つからなかったので備忘録しておきます。

やりたいこと

以下の感じです。

SlackDMが来たことを通知(Slack Event API)GASSpreadSheetDMの内容を出力

ポイントとしては、Slackから他アプリへ通知するというところですね。
よくあるユースケースでは、他アプリからSlackへDMを送信するというのはあるっぽいのですが、今回は逆です。

キーワード

  • Slack側
    • Slack Events API(注意:Incoming Webhook ではないです!
  • SpreadSheet 側
    • GAS にて API エンドポイントを作成(アプリとして公開)

概要手順

大まかな流れとしては以下の感じで実現します。

  1. Slack アプリの作成
  2. Slack アプリに権限を設定
  3. GAS にて API エンドポイントを作成する
  4. Slack アプリにて外部通知できるように設定(Slack Events API)
  5. 最終設定

詳細手順

1. Slack アプリの作成

どうやら、Slackの仕様として、Slackと何かしら連携する場合は、その連携用の「アプリ」というのを作成する必要があるみたいです。
アプリと言っていますが、イメージは Slack を外部へつなぐためのラッパーみたいな感じですかね。
どうやらワークスペースごとにアプリを作成する必要があるようです。(DMの場合、ワークスペースという概念がないという認識なのですが・・・。この場合は、人にのワークスペースでいいのかも?)

  • https://api.slack.com/apps にアクセスします。
  • 「Create an App」をクリックします。
  • 「From scratch」か「From an app manifest」かを聞かれた場合は、とりあえず「From scratch」を選択します
  • 「AppName」に任意の名前を入力し、「warkspace」はとりあえず任意のものを選択します(ここではDMを対象とするので、たぶん何でもいい)。
    そして、「Create App」を押します。

これで Slack アプリのガワが作成されました。

2. Slack アプリの権限設定

  • メニューより「OAuth & Permissions」を選択します。
  • 下の方へスクロールし、「Scopes」にて「Add an OAuth Scope」を選択します。
    そこで im:history というのを選択します。

    • 今回はダイレクトメッセージを対象とするのでこの権限を設定していますが、用途に合わせて設定する権限を変える必要があります

いったんSlackアプリからの作業からは離れますが、また後で戻ってくるのでブラウザのタブはそのままにしておきます。

参考サイト様

slack event api の設定 - SO Technologies 開発者ブログ
こんにちは、こんばんは医師崎です。 業務でslack event apiを使ったのでその時に設定した事などをまとめます。 slack event api とは EventAPIは、Slack内で起きたイベントをトリガーに、発生した内容をApp指定のURLに送る仕組みです。インターネット経由でコールバックを受ける仕組みで...

3. GAS にて API エンドポイントを作成する

  • ブラウザの別タブにて、Google SpreadSheet を開きます
    • 適当に名前を付けます
  • 上部メニューから「拡張機能」→「Apps Script」を選択します
  • コードエディタのタブが開くので、以下のようにPostを受け付けるコードを書きます
    • ここでは、動作テスト用に、受け取ったボディをそのままセルに吐き出す処理をしています
    • doPost という関数名が重要なようです
function doPost(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  var body = JSON.parse(e.postData.contents);

  // A1に送られてきたデータを書き込む(テスト的な動作)
  sheet.getRange("A1").setValue(JSON.stringify(body));

  // Slack アプリの仕様で、送られてきた「challenge」の値を返す必要があるので、レスポンスデータを作成する
  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(JSON.stringify(body.challenge));

  return output;
}
  • ctrl + s で保存し、画面上部の「デプロイ」→「新しいデプロイ」を選択します
    • コードを書き換えた際は、再度この手順でデプロイをしないといけない仕様のようです
  • 以下のように歯車から「ウェブアプリ」を選択します
  • 「説明」には任意の文字列を入れて、「ウェブアプリ」と「アクセスできるユーザー」は下記のように設定します。アクセスできるユーザーを「全員」にするところが重要です
  • 「デプロイ」を選択します。この後、以下のような画面が出たら、以下のように許可をします


  • うまくいくと、デプロイが完了します。下記の「ウェブアプリ」のURLをコピーしておきます

ここまでで、GASとしては、APIエンドポイントとして登録された状態になります。

参考サイト様

優秀な開発者になりたい。
最近Djangoいじりはじめた
https://eguweb.jp/gas/57266/
Google Apps ScriptのdoPostでJSONなパラメータのPOSTリクエストを受ける - Qiita
Google Apps Script(GAS)は HTTPSリクエストを受け取り処理を行うというサーバレスなAPIサーバを導入することができる。(参考: Web Apps  |  Apps Scri…

4. Slack アプリにて外部通知できるように設定(Slack Events API)

再び Slack アプリ側の設定に戻ります。

  • メニューより「Event Subscription」を選択する
  • 「Enable Events」のトグルを ON にして、「Request URL」に、先ほどGASでデプロイしたウェブアプリのURLをペーストします
  • 問題なければ以下のように「Veryfied✔」という表示がされます
  • 「Subscribe to events on behalf of users」にて「Add Workspace Event」を押して message.im を追加します
    • 上述した通り、今回はダイレクトメッセージをトリガーとするためこの設定としていますが、用途に応じて変更する必要があります
  • 最後に「Save Changes」を押すのを忘れないように

5. 最終設定

  • メニューより「Basic Information」を選択し、「Install your app」にてインストールを実行します
    • 以下画像では既にインストールしてしまっているので「Reinstall to Workspace」となっていますが、これに該当するボタンを押します

動作確認

いったんここまでで、一通りの設定が完了しました。

Slackでダイレクトメッセージを送ってみると(例えば自分から自分へ)、SpreadSheetに内容が出力されるはずです。

コメント

タイトルとURLをコピーしました