1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ハンズオン】Slack AppとGASでSlackチャンネル投稿内容をスプレッドシートに記述する

Posted at

はじめに

最近の社内のチャットツールとしてSlackがよく使われていると思います。Slackには便利なデフォルト機能に加え、さまざまなアプリや拡張機能が用意されています。

今回は、SlackアプリとGoogle Apps Script (GAS) を活用し、特定のチャンネルに投稿された内容を自動的にGoogleスプレッドシートに記録するシステムを構築するハンズオンを行います。

今回のハンズオンを体験すれば、単に投稿内容を記録するだけでなく、さまざまな応用ができると思います。

Slackアプリ作成手順

1. Slack APIページでアプリ作成

1. Slack APIページにアクセスします。

URL: https://api.slack.com/

2. Create an Appボタンをクリックして、新しいアプリを作成します。

スクリーンショット 2024-09-19 2.29.50.png

3. From scratchを選択します

スクリーンショット 2024-09-19 2.29.55.png

4. アプリ名とワークスペースを指定します。

スクリーンショット 2024-09-19 2.30.10.png

2. Appの設定

1. 作成したアプリのダッシュボードに移動し、 OAuth & Permissionsをクリックします。

hide.png

2. Scopes セクションで必要な権限を選択します(下記一例)

  • chat:write:メッセージを送信するための権限

  • channels:read:チャンネルの情報を取得するための権限

  • groups:read:プライベートチャンネルの情報を取得するための権限

  • channels:join:チャンネルに参加するための権限(必要な場合)
    スクリーンショット 2024-09-19 23.51.09.png
    今回は

  • channels:history:パブリックチャンネル内の過去のメッセージを読み取る権限
    を設定しました。
    Scope権限一覧

3. App HomeからDisplay Nameを設定

※これを設定しないとワークスペースにインストールすることができません
スクリーンショット 2024-09-19 23.53.30.png

3. Appのインストール

1. Install Appセクションに移動し、Install to Workspaceボタンをクリックします。

スクリーンショット 2024-09-19 10.32.19.png

Scopeを変更すると再度ワークスペースにインストールしないといけません

2. チャンネルにアプリをインストールする

追加したいチャンネルに移動し、上部の太文字のチャンネル名をクリックするとモーダルが開く、その中でインテグレーションというタブがあるので開く。
アプリを追加するというボタンがあるのでそこから先ほどワークスペースに追加したアプリを追加する
スクリーンショット 2024-09-20 0.02.14.png

ここまでできたら、slackでの設定は終了です。次はGASの設定に移りましょう

4. GAS (Google Apps Script) の設定

1. スプレッドシートにアクセスしてApps Scriptを開く

  1. 対象のスプレッドシートを開きます
  2. 拡張機能メニューをクリックし、App Scriptを選択してGoogle Apps Scriptのエディターを開きます。

2. プロジェクトの設定から環境変数を設定する(何をGASでしたいのかで変わるので必要な環境変数を確認してください)

環境変数に以下の情報を設定します
スクリーンショット 2024-09-20 0.10.00.png

  • CHANNEL_ID:Slackのアプリを追加したチャンネルのチャンネルID
    スクリーンショット 2024-09-20 0.13.27.png

  • SHEET_NAME:シートの名前 今回の場合だとsheet
    スクリーンショット 2024-09-20 0.15.50.png

  • SLACK_API_TOKEN:作成したアプリのToken
    スクリーンショット 2024-09-20 0.18.46.png

  • SPREADSHEET_ID:スプレッドシートのID URLのd/と/edit の間の英数字の羅列です
    スクリーンショット 2024-09-20 0.20.05.png

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. デプロイ

スクリーンショット 2024-09-20 0.27.07.png
コードが完成したら、デプロイします
アクセスできるユーザーは全員自分のみが選択できるのですが、どちらでも大丈夫です。
自分のみの方がセキュリティ上は安全です。

これで完成です。あとはslackで投稿されれば自動で書き込みをしてくれます。

まとめ

結構簡単に作ることできるね

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?