【2023年最新版】便利機能からサービス連携までSlack活用術総まとめ

この記事は[Nuco Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nuco)の11日目の記事です。

# はじめに
業務で当たり前のように使っているSlackですが、長年使っているうちに様々な便利機能の存在や連携できる外部サービスの幅広さなどに気付いたので、この機会に一度活用術としてまとめてみることにしました。
Slackをこれから使う初心者の方は全体像の外観と学習に、スラッシュコマンドやbotをバリバリ自作しているベテランSlackerの方は理解度の確認などにお役立てください。

**主なトピック**
* [Slackの概要と最新動向](#そもそもslackとは)
* [基本の便利機能（表記方法、ショートカット、スラッシュコマンド）](#基本の便利機能)
* [Slackと外部サービスの連携（Incoming Webhook、GitHubなど）](#slackと外部サービスの連携)
* [おすすめのSlackアプリ](#おすすめのslackアプリ)
* [Slackアプリの自作(スラッシュコマンド、Bot）](#slackアプリの自作)
:::note info
細かい仕様や繰り返しの説明などは一部割愛しています。
まとめと使用方法・手順の簡単な紹介がメインテーマです。
:::


# そもそもSlackとは？

https://slack.com

リモートワークが浸透した昨今において、社内外でコミュニケーションを取るためのチャットツールはもはや必需品と言えるでしょう。
Slackは普及率の高い代表的なチャットツールの一つであり、2013年にアメリカで公開されました。
デスクトップ版、ブラウザ版（Web版）、スマートフォン版があるので場所を選ばず使用でき、数あるチャットツールと比較すると、メインのチャット機能だけでなく様々な業務効率化の機能を備えているという点が特徴的です。
無料版と有料版がありますが、無料版でも十分に業務に使用可能で、実際にSlackユーザーの9割は無料ユーザーと言われています。

## 最新動向
### 普及率
Slackのデイリーアクティブユーザーは今や1200万人を超えるまでになりました。
2021年時点の調査では、国内企業の4割超でビジネスチャットが導入されている中、Microsoft Teamsに次ぐ2位の普及率です。

米国では最も信頼されているビジネスコミュニケーションツールの一つで、Fortune 100社のうちの65社でSlackが使用されていて、全米で見ても実に7％以上の企業で使用されています。

世界的にみても、150か国、60万以上の教育機関、組織、中小企業などの組織で使用されています。

:::note info
ちなみにSlackの運営元だったSlack Technology社は2021年7月にSalesforceに買収されています。
:::


### 最近のアップデート
継続的にアップデートされ続けており、今年4月にドキュメンテーション機能のCanvasを追加した他、8月にはUIが大きく刷新されています。
UIの更新は約1年ぶりとなる大きな更新で、改修点を端的に言うと、Slackの機能群が左端のメニューバーにまとまって利便性が向上しました。

* ワークスペースが1ボタンに収まった
* ブックマークが「後で」のボタンに変わった
* 自分へのメンションやリアクションが「アクティビティ」にまとまった
* DMの一覧が見れる専用ビューができた
* 「その他」ボタンからcanvas、ワークフロー、アプリなどのツールへアクセス

旧UIのサイドバー|新UIのサイドバー
---|---
<img width=86 alt="スクリーンショット 2023-11-23 10.43.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/e6aac5be-fd55-d3a5-2c2c-71b506412e5c.png">|<img width=100 alt="スクリーンショット 2023-11-23 10.44.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/09ec3e8c-6d45-5767-ec57-c64dc1a06df3.png">

### 今後のアップデート
今年5月に「Slack GPT」が発表されたのに続き、生成AIを利用したチャンネルやスレッドのサマリや、自然文での質問応答を行う「Slack AI」が発表され、SlackにもAI技術が組み込まれる方針となっています。

その他にも、作業／タスクをリスト管理してコラボレーションを支援する「Slack Lists」や、従来のワークフロービルダー機能を強化する「Slack Automation」も発表されています。

いずれも今冬からパイロット版の提供が開始され、2024年には一般提供が開始される予定です。


# 基本の便利機能
ここからは早速活用術の紹介に入っていきます。
Slackを使う上では基本となる、表記方法、ショートカット、スラッシュコマンドについてまとめています。

## 表記方法
### メンション
`
@ユーザー名orグループ名
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/c82916e4-3b3a-f079-76e1-e1506529f968.png">
メンション＝メッセージを送る相手の指定です。
相手側で通知設定がオフになっていなければ、ポップアップで相手に通知が飛びます。
なお、クリックすればそのユーザーの簡易プロフィールを表示することもできます。

### チャンネルリンク
`
#チャンネル名
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/b00b7cac-8326-b17a-f6ac-d6eb15261e8c.png">
特定のSlackチャンネルへのリンクになります。

### 引用表現
`> 文章 （※間に半角スペースを入れる）`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/87f084f5-7270-d360-5c88-1a0f71de28ba.png">
先頭に｜が付いたインデントになります。
他のユーザーの発言を引用して一つずつ答える際などに便利です。

### インライン引用表現
``　`文章`　``
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/357304af-3ad5-067b-42db-27eead1e4d68.png">
文章がボーターで囲まれる＋文字色と背景色が変わって強調表示されます。
（ライトモードの時は文字色赤＋背景色グレー
ダークモードの時は文字色オレンジ＋背景色やや薄い黒）
ファイルパスなどを強調表示する時に便利です。

### ボーダー付き引用段落表現
`
```文章```
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/1cdffc21-1713-68ac-ff7b-51291c8e3cae.png">
文章が行単位にボーターで囲まれる＋背景色がグレーに変わって引用表示されます。
コードの共有に使われることが多いです。

### イタリック
`
_文章_
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/7c02e7a1-3041-4370-d068-f9a96a6ac77d.png">
イタリック体になります。

### ボールド
`
*文章*
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/b0a49683-4a89-c75a-a798-59f0441d3bde.png">
太字になります。

### ストライク（取り消し線）
`
~文章~
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/91afad99-25cb-b1cf-1ec5-ed823380e483.png">
文字に取り消し線をひけます。

### 絵文字
`
:絵文字名:
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/74cc5691-851e-52ff-a45b-76efc4112cf5.png">
絵文字を打てます。（上記は`:ok_hand:`と打った場合）

ただ絵文字名は普通覚えてないので、絵文字ボタンを使う方が楽かもしれません。
一応先頭に:を打ってから単語を打てば、予測変換は可能です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/07df8ad6-59bc-9a0d-41ba-c504fe5657a6.png">

### リアクション追加
`
+:絵文字名:
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/392902e1-08fa-43d0-73e3-90af52808a17.gif">
絵文字表記の先頭に+をつければ、直前のメッセージに絵文字でリアクションすることができます。

### リアクション削除
`
-:絵文字名:
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/214a2444-f5b7-48dc-0772-a8f7172800bb.gif">
絵文字表記の先頭に-をつければ、直前のメッセージに自分で付けた同じ絵文字リアクションを削除することができます。

### リスト
`- 文章`または`* 文章 （※どちらも間に半角スペースを入れる）`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/35395d19-5723-5ff0-1c92-3301a6de8080.png">
先頭に・が付いたリスト表記になります。
リスト化した行から改行すると、自動的に次の行もリスト表記になります。

### No.リスト
`1. 文章 （※間に半角スペースを入れる）`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/32eea69e-472a-cfd9-03ed-1920e3496f1c.png">
先頭にナンバーが付いたリスト表記になります。
ナンバーリスト化した行から改行すると、自動的に次のナンバーでのリスト表記になります。

### 色見本
`
#カラーコード
`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/3ee36a9b-cfd3-41fc-42cc-1a347c9eebf0.png">
カラーコードの色見本が末尾に付きます。
ただしインラインでは色見本は表示されません。

## ショートカット
### `cmd + K` （ チャンネル、DM、ワークスペースの切り替え ）
チャンネル、DM、ワークスペースの切り替えが簡単にできる、言わずと知れたショートカットです。
チャンネル数やメンバーが増えてくると探すのが大変なので必須機能と言えます。
なお、`create チャンネル名`でチャンネル作成も可能です。

---
### `cmd + G` or `cmd + F` （ 検索 ）
実行したチャンネル内でキーワードに一致するメッセージを検索できます。

---
### `テキスト入力中 + cmd + ↑` （ メッセージ編集 ）
実行したチャンネル内の直近の自分のメッセージを編集できます。
間に他のユーザーのメッセージがあっても大丈夫です。

---
### `テキスト入力中 + cmd + Z` （ メッセージ送信取り消し ）
実行したチャンネル内の直近の自分のメッセージを送信取り消しできます。
ただし有効なのは以下の状況に当てはまる場合だけなので、ちょっと条件が厳しめ。
* メッセージを送信してから 15 秒以内
* 会話の画面から移動していない
* メッセージ入力が空の状態

送信先のチャンネルを間違えた時にすぐ消したりするのに使えます。
なお、取り消しできない場合は削除して対応するしかありません。

---
### `shift + cmd + D` （ サイドバーの表示/非表示を切り替え ）
サイドバーの表示/非表示を切り替えられます。
狭い画面でスレッドの会話を追う時などに便利です。

---
### `shift + cmd + J` （ ダウンロードしたファイルの一覧表示 ）
ワークスペース内でこれまでにダウンロードしたファイルの一覧が表示できます。
履歴管理に使うもので、ダウンロード先ディレクトリの表示と履歴の削除ができます。
ただしダウンロード元のメッセージに飛ぶことはできません。

なお、ダウンロードしていない共有されたファイルなどを全てみたい場合は、ファイルビューを見る必要があります。
`cmd + K`で`ファイル`と入力して移動するか、新UIのサイドバーから`その他 → 自分のオーガナイゼーション → ファイル`で移動できます。
ファイルの詳細の共有情報から元のスレッドなどにも飛べます。

---
### `shift + cmd + U` （ リンク挿入 ）
リンクを挿入できます。
文字列を選択した状態で打てばリンクに変換することもできます。

---
### `shift cmd + C` （ インラインコード挿入 ）
インラインコードを挿入できます。
文字列を選択した状態で打てばインライン引用表現に変換することもできます。

---
### `shift + cmd + H` （ ハドルの開始/終了 ）
実行したチャンネル内でハドルミーティングの開始/終了ができます。

なお、ハドルミーティングとは、必要な時に短時間(10分〜30分)だけ集まって行う会議のことで、Slackではワークスペースのメンバー同士での音声会話機能のことを指します。

---
### `shift + cmd + space` （ ミュートON/OFF切り替え ）
ハドル中にミュートON/OFFの切り替えができます。

## スラッシュコマンド
スラッシュコマンドはSlackの特徴的な機能の一つで、リマインダや画面表示変更、ステータス操作など様々な機能をメッセージ投稿フォームにコマンドを打つことで実行できます。
メッセージ投稿フォームをSlack専用のターミナルやコマンドプロンプトだと考えれば分かりやすいでしょう。

その名の通りスラッシュ（`/`）でコマンドが始まります。
スラッシュを打つだけでもコマンド一覧が表示されるので、汎用的なものは覚えなくても使えます。
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/86620af2-b57b-caeb-8501-a20f49e1341b.png">

---
### `/remind` （ リマインド ）
```
/remind {宛先} {メッセージ} {リマインド時間}
```
スラッシュコマンドの定番、リマインドを設定できるコマンドです。
自分や特定のユーザー、チャンネルに向けて、細かい時間指定や定期でのリマインドが可能です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/c0020088-dead-b157-e908-3901d47f24e6.png">

設定したリマインドは`/remind list`コマンドを打つか、「後で」ボタン（旧ブックマーク）から確認や変更、完了ができます。

注意点として、宛先とリマインド時間の指定は下記のルールに従う必要があります。
特にリマインド時間については、`in`や`at`を忘れたり、英語表記をただの数字にすると無効になるので、練習してから使うか、使いながら慣れていく必要があります。

| 宛先 | 書き方 |
| ---- | ---- |
| 自分 | `me`|
| ユーザー | `@ユーザー名` |
| チャンネル | `#チャンネル名` |

| リマインド時間 | 書き方 |
| ---- | ---- |
| 今から〜後 | `in {数字} {単位}` <br> （`in 1 s`（1秒後） `in 5 m`（5分後） `in 12 h`（12時間後） など） |
| 当日〜時に | `at {時間}` <br> （時間： 8:00, 21:00, 5:00pm など） |
| 〜日〜時に | `{mm/dd}` or `{mm/dd hh:mm}` or `on {英語表記日付}` <br> （11/23, 12/4 14:35, on December 5 など）|

&#13;&#10;

:::note
**一部の項目は省略可能**
* `/remind`だけ打った場合
    自分向けのリマインドになり、表示されるリマインド設定ダイアログで詳細設定ができます。
ただしこの場合は「何分後」などの相対指定ができません。
    <img width=250 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/ef2e6f20-8f77-1286-a741-44eef921c16f.png">

* `/remind {メッセージ}`だけ打った場合
    自分向けのリマインドになり、Slackbotからのプルダウン付きメッセージでリマインド時間の設定をします。
    ただしこの場合は規定の数種類からしか時間設定ができないので、指定したい時間がない場合はコマンドなどで設定する必要があります。
    <img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/514cde3d-dd9c-7847-33c4-d0cd3dc4f02c.png">
:::

---
### `/topic` （ トピック設定 ）
```
/topic {トピック内容}
```
チャンネル名の横に表示されるトピックを設定できるコマンドです。
プロジェクトの概要やちょっとした補足情報を記載したり、チケットリンクを貼ったりするのに便利です。

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/3acc8023-eed5-aa13-2951-609518b2c6af.png">

---
### `/who` （ ユーザー一覧 ）
実行したチャンネルの参加ユーザー一覧を確認できるコマンドです。
ただし下記参考画像のように、アイコン無しの`@ユーザー名`だけの表示なのでちょっと見にくいです。
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/ea63d03e-b7cb-e851-eb4d-bb4a2b29bf0a.png">

---
### `/collapse`, `/expand` （ 画像・動画の折りたたみ、展開 ）
チャンネル内で表示されているファイルやリンクの画像などをすべて折りたたむ/展開するコマンドです。
`/collapse`で折りたたみ、`/expand`で展開されます。
大量に画像投稿されていたり、リンクを頻繁に貼っていてサムネイルが目立つチャンネルなどで使うとチャンネルがスッキリします。
なお、リンクの場合はサムネイルだけ折りたたまれ、タイトルや説明文は折りたたまれません。

---
### `/active`, `/away`, `/status` （ ログイン状態、ステータス変更 ）
ログイン状態やステータスを変更するコマンドです。
`/active`でログイン状態をアクティブに変更、
`/away`でログイン状態を離席中に変更できます。
`/status`で表示されるステータス変更ダイアログからステータスを変更できます。
（`/status ステータス名`でステータス名の設定も可能です。）

---
### `/shrug` （ おまけ ： あるアスキーアートの挿入 ）

```
/shrug [メッセージ]
```
メッセージの最後に `¯\_(ツ)_/¯` の絵文字を挿入するコマンドです。

:::note
何のために存在するのかは謎ですが、slack と shrug (肩をすくめる) をかけたジョークだと言われています。
「知らんがな」って時に使いましょう。`¯\_(ツ)_/¯`
:::


# Slackと外部サービスの連携
Slackは様々な外部サービスと連携して、メッセージの送受信、通知などができるようになっています。
下記では代表的な幾つかの外部サービスとの連携方法について、簡単な実装手順などと合わせて紹介します。

## Incoming Webhook
任意のSlackチャンネルに外部ソースからデータを送信できる機能です。
システムのエラー発生時や、更新時などの通知先にSlackを使用する時に便利です。

ざっくりした実装イメージとしては、Webhook URLの発行 → スクリプトなどでpayloadに通知メッセージを入れてPOST、の流れになります。

:::note warn
**旧方式のIncoming Webhook**
2019~2020年頃から新方式が推奨になり、既存の方式は非推奨＆廃止予定です。

概要だけ紹介しておきます。
参加しているワークスペースから公式のアプリ画面にアクセスし、Webhookアプリからカスタムインテグレーションというものを設定することでWebhook URLを発行して使用します。

<img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/5acfdba4-e3de-fc42-1592-59432ce4da3d.png">

旧方式では通知先のチャンネルを設定してもpayload側の設定でチャンネルを切り替え可能で、Webhook URLとチャンネルの紐付けが曖昧になることが問題とされていたようです。
:::

### Webhook URLの取得手順
（※すでに自前のSlack Appを作成している場合は手順4.からになります）
  1. 公式の「[slack app directory](https://slack.com/intl/ja-jp/apps)」のページに、参加しているワークスペースでログイン
  1. 「ビルド」→「Your apps」でアプリマイページに移動
  1. 「Create an App」→「From scratch」→ アプリ名を入力＆ワークスペースを選択して自前のSlack Appを作成
  2. 「Add features and functionality」→「Incoming Webhooks」を選択
  2. Incoming WebhookのOn/OffのラジオボタンをOnにする
  2. ページ下部に出てくるWebhook URL作成ページで「Add New Webhook to Workspace」を押す
  2. 作成したアプリからワークスペースへのアクセス権限付与の許可を求められるので、通知先のチャンネルを選択して許可する
  2. 6.のページにWebhook URLが追加される
  2. 同ページ内に動作確認用のcurlコマンドサンプルが用意されているので、Copyしてターミナルなどで実行
  2. 通知先に設定したチャンネルに「Hello, World!」の通知が来れば完了
<img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/648fe060-f21f-6471-6140-40eeb1ca9387.png">

:::note
**通知メッセージの装飾**
通知メッセージはWebhook URLに渡すpayloadのattachmentsという属性を使ってある程度の装飾が可能です。
装飾可能なのは色やレイアウト、画像の挿入などで、結構リッチにできます。

<img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/f28ad4c2-c7be-ad97-80b2-4eb3188e0939.png">

利用方法の説明は本筋からはずれるため、今回は割愛します。
詳細は下記の公式資料を参照してください。

payloadの要素：https://api.slack.com/reference/messaging/payload
装飾指定の方法と例：https://api.slack.com/reference/messaging/attachments
:::


### 活用例：Lambda失敗時のエラー通知
Incoming Webhookの活用例として、AWS Lambdaでエラーが起きた時にSlackに通知する実装例を紹介します。言語はPythonです。
1. Incoming Webhookの作成
[先ほどの手順](#webhook-urlの取得手順)でWebhook URLを作成
1. Lambdaの作成
新規にLambdaを作成し、エラーをcatchしたらエラーメッセージをペイロードに入れてWebhook URLにPOSTする処理を書いてデプロイ

    **（ コードサンプル ）**
    ```python
    import json
    import urllib.request
    
    
    def post_to_slack(message):
        # Webhook URL
        incoming_webhook = "{Webhook URL}"
    
        # メッセージをjson形式に変換
        send_data = {
            "text": message,
        }
        send_text = json.dumps(send_data)
    
        # ヘッダーの設定
        headers = {"Content-Type": "application/json"}
    
        # リクエスト
        request = urllib.request.Request(
            incoming_webhook,
            data=send_text.encode("utf-8"),
            headers=headers,
            method="POST",
        )
        with urllib.request.urlopen(request) as response:
            _ = response.read().decode('utf-8')
    
    
    def lambda_handler(event, context):
        try:
            raise Exception("（Lambda）エラー通知テストメッセージ")
        except Exception as e:
            # Slack通知
            post_to_slack(str(e))
    
    ```
    &#13;&#10;

1. 動作確認
下記のように自前アプリから指定のチャンネルに通知が来れば完了
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/9043428d-59a0-55d8-b0b6-5f01684b6680.png">


## GitHub
バージョン管理の定番であるGitHubもSlackと連携可能です。
PR作成時や特定ブランチへのpush時などに通知するようにすれば、チーム間での円滑なレビューなどに役立ちます。
なお、GitHubアカウントがあることを前提とします。

### GitHubアプリの追加・連携
1. 公式の「[slack app directory](https://slack.com/intl/ja-jp/apps)」のページに参加しているワークスペースでログイン
1. GitHubアプリを検索し、「Slackに追加」ボタンを押す
1. GitHubアプリとワークスペース間でのアクセス許可を求められるので、許可するボタンを押してSlackにアプリを追加する
1. GitHubアプリのチャンネルに初期登録メッセージが来ているので、「Connect GitHub account」ボタンを押す
    <img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/97ea0cb8-1af0-485e-9f93-316be83396a2.png">
1. GitHubアカウントとSlack間での連携を確認する画面になるので、「Connect GitHub account」ボタンを押す
1. 認証コードが表示されるので、先ほどのSlackメッセージの「Enter Code」ボタンを押して認証コードを入れる
    <img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/c3215844-677a-7c46-3523-aa4b7e66daec.png">
1. 連携されたSlackとGitHubのアカウント名でログイン成功のメッセージが届く
    <img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/6131910d-bf0d-b026-e43f-0caa135501fc.png">
1. `/github subscribe owner/repo`コマンド（`owner`と`repo`には自分のアカウント名とリポジトリ名を入れる）を実行するとGitHub側にSlackのアプリがインストールされていないというメッセージが出るので、「Install GitHub App」のボタンを押す
    <img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/297d7d3b-15e6-6f6f-a502-133d56f77677.png">
1. ブラウザでGitHub App側のSlackアプリインストール画面になるので、Slack連携を有効にしたいインストール先のアカウントやリポジトリを選択してインストール
    <img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/5bd5109c-406f-bb39-0b51-1629205b8674.png">
1. 再度`/github subscribe owner/repo`コマンド（`owner`と`repo`には自分のアカウント名とリポジトリ名を入れる）を実行し、入力したアカウント/リポジトリでSubscribedの表示が出たら連携完了
    <img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/09ab1acd-6652-c110-f46f-a163393c1d98.png">

### 通知設定のカスタマイズ
デフォルトでは以下の場合に通知が飛ぶように設定されています。
* issues
* pulls
* commits
* releases
* deployments

デフォルトでは下記の場合に通知が飛ばないので、通知を飛ばしたい場合は`/github subscribe owner/repo {機能名}`コマンドで追加します。
* reviews
* comments
* branches
* discussions
* workflows
* commits:*（全てのコミット）
* +label:"your label"（プルリクやコメントに設定したラベル）

:::note info
下記の機能については、通知対象などをコマンドに足すことで指定可能です。
指定方法の詳細は[公式ドキュメント](https://github.com/integrations/slack#subscribe-to-an-organization-or-a-repository)を参照してください。
* commits
* discussions
* workflows
* +label:"your label"
:::

逆に特定の機能の通知を無効にしたい場合は、`/github unsubscribe owner/repo {機能名}`のコマンドで無効にできます。

なお、現在の購読設定は`/github subscribe list features`コマンドで確認することができます。

通知が来た場合は、下記のような形式でGitHubアプリからメッセージが届きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/fe256871-8b13-ce0a-1d45-b8d945b97e2b.png">


## ZapierやIFTTTを使った連携
ZapierやIFTTTといったサービスを利用している場合は、Slackと外部サービス間の仲介役として使用することでも連携可能です。
なお、いずれの場合もアカウント登録などは完了していることを前提とします。

### Zapier活用例：Gmailとの連携

https://zapier.com/

Zapierとは、ノーコードでワークフローの自動化を実現するWEBアプリケーションサービスです。
5,000以上の様々な外部サービスを連携可能で、自分の業務に合わせた自動化ワークフロー（ZAP）を、プログラミング知識不要で作成できます。

今回はZapierを使ってGmailとSlackを連携させ、指定の文字列を含むメールが来たら通知を送るように設定してみます。

**1. ZAP作成（Trigger - Gmailの連携）**
<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/8cabfe42-97c0-3a27-02f3-b73f7657db45.png">
1. Zapierにログインし、「Create Zap」でzap作成に入る
1. 「Trigger」を選択してAppからGmailを検索し、Eventに「New Email Matching Search」を選択
1. 「Sign in」ボタンを押すとZapierとGmail間のアクセスについての許可を求められるので許可する
1. 「Search String」に条件となる文字列を入れる
1. 「Test trigger」ボタンを押すと、実際にその時点で条件に合うメールの検索結果が表示される（テストはskipしても良い）

**2. ZAP作成（Action - Slackの連携）**
<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/040abab5-5075-2078-9141-b5526ad0601b.png">
1. Trigger作成に続けて「Action」を選択してAppからSlackを検索し、Eventに「Send Channel Message」を選択
1. 「Sign in」ボタンを押すとZapierとSlack間のアクセスについての許可を求められるので許可する
1. Actionの詳細設定画面になるので、下記を設定
    * 通知対象のチャンネル
    * メッセージの構成（日付、件名、送信者、メールURLなどから自由に組み合わせる）
    * その他の項目（botや添付ファイルなどの設定）は任意
1. 「Test step」を押すと、実際にSlackにテスト通知が送られる（テストはskipしても良い）
1. 「Publish」ボタンを押して、ZAP登録を完了する

**3. 動作確認**
1.の4.で設定した文字列を件名や本文に含むメールを送り、指定のSlackチャンネルに通知が来れば完了
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/43ec4adc-2c13-ee60-9414-4922dcdf5de4.png">


### IFTTT活用例：YouTubeとの連携

https://ifttt.com/

IFTTTとは、Zapierと同様に様々なサービスをノーコードで自動ワークフロー化することができるWEBアプリケーションサービスです。
Zapierとは連携できるサービスの数や種類が異なるようです。

:::note
Twitterと連携した自動化などで有名でしたが、現在ではTwitterと連携するためにはProプランへの移行が必須となっているようです。
連携したいサービスの使用にProプランへの移行が必要かどうかは、事前に確認しておいた方がいいでしょう。
:::

今回はYouTubeで指定の登録チャンネルに新しい動画が投稿されたら、Slackに通知を送るように設定してみます。

**1. アプレット作成（If - YouTubeとの連携）**
<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/d0011f1a-9479-1a84-5ee5-40c509abf508.png">

1. IFTTTにログインし、「create」ボタンからアプレットの作成に入る
1. 「If」の「Add」ボタンからアプリ検索画面でYouTubeを検索し、「New public video from subscriptions」を選択
1. 「Connect」ボタンを押すと、IFTTTとYouTube間のアクセスについての許可を求められるので許可する
1. アカウントと対象のチャンネルを選択し、「Create trigger」で登録

**2. アプレット作成（Then That - Slackとの連携）**
<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/dd02e5fa-15ee-2e70-fb33-fedc0a53d87b.png">

1. 「Then That」のAddボタンからアプリ検索画面でSlackを検索し、「Post to channel」を選択
1. 「Connect」ボタンを押すとIFTTTとYouTube間のアクセスについての許可を求められるので許可する
1. アカウントと対象のチャンネルの選択、およびメッセージフォーマットなどを設定して「Create acion」で登録
1. 「Continue」 → 「Finish」でアプレットの登録を完了する

**3. 動作確認**
登録したチャンネルに新しい動画が投稿された際に、指定のSlackチャンネルに通知が来れば完了

:::note info
上記で紹介した通り、ZapierもIFTTTもワークフローエディタがかなりシンプルで直感的にサービス連携が可能です。
連携できるサービス数も豊富で、海外でしかリリースされていないサービスなども多いため、自分だけが使っているツールをSlackと連携させることで、間接的にチームメンバーも使えるようにするなんてこともできるでしょう。

IFTTTはどちらかというとIoT系統に強いサービスと言われており、Zapierはサービス同士の選択肢が豊富で取得する情報を細かく設定可能など、それぞれに特徴があります。
一方でどちらも今年からAIによるサービスをリリースしているので、さらに幅広い役割を持ったワークフローを構築することができそうです。
:::


## おすすめのSlackアプリ
ここからは数多くの種類があるSlack Appの中から、おすすめのものをいくつかピックアップしてご紹介します。
主にファイル共有、タスク管理、コミュニケーションの活性化などに役立つアプリです。

### [Googleドライブ](https://slack.com/help/articles/205875058-Google-Drive-for-Slack)
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/fe2a7452-1cf6-38e1-4d47-15994622150f.png">

GoogleドライブとSlackの連携が簡単にできるアプリです。
普段からGoogleドライブなどでファイル共有をしている場合はおすすめです。
スラッシュコマンドを使って、主に下記4つの操作が可能です。
* ドキュメントを作成する
* スプレッドシートを作成する
* プレゼンテーションを作成する
* Googleドライブから追加

特にGoogleドライブのファイルを共有する際に、逐一ブラウザに切り替える手間が省けます。
仮にチャンネル内の共有相手に権限がない場合でも、アプリから権限がない人がいることが自動的に通知され、メッセージの案内に従ってそのまま権限変更などができるので、誰に権限があるか悩むこともありません。

また、ファイルが編集された際に通知を送るようにも設定できるので、修正内容のコンフリクトなどを防ぐこともできます。

:::note warn
やや使いにくい点として、ファイル共有時のファイル選択ダイアログのUIがやや見にくいと感じます。
また、Slackからドキュメントなどを作成する際は、ドライブ内のどこに作成するかパス指定できず、トップディレクトリにしか作成することができない点は注意が必要です。
:::


### [Polly](https://www.polly.ai/slack-poll?utm_source=slack&utm_campaign=install&utm_medium=app_directory)
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/c8cacfb0-5815-c2fb-57bd-ca975d2e1ccc.png">

手軽にアンケートを作成できるアプリです。
YES/NOの2択はもちろん、自由選択式や5段階評価など、様々な形式でのアンケートを作成可能で、複数回答や集計結果の表示/非表示、期限の設定なども細かく指定可能です。

<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/7ff04aa5-8b64-cc7a-5ce9-adc0c1d5fc0d.png">
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/e3299ea0-f606-dee0-d10c-a08e862f143b.png">

よく出席確認や作業完了したかどうかなどをリアクションで集計して確認したりすると思いますが、誤ってリアクションを消してしまったり、リアクションが必要なメッセージかどうか分かりにくく、リアクションを忘れたりすることがあります。
Pollyを使うことで、出席確認や作業完了確認などにも活用できるでしょう。


### [Trello](https://trello.com/platforms/slack)
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/f0d34b10-7392-8cb1-19c6-062260f01776.png">

タスク管理ツールの代表的なツールであるTrelloもSlackと連携可能です。
連携するとSlack上からタスクの追加や削除も可能で、無論Trelloでの操作をSlackに通知することもできます。

<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/dcb8bcc3-5df8-965d-ed01-86f3ef1d0481.png">

普段からタスク管理にTrelloを使っているなら、Trello通知用のチャンネルを作っておいて、プロジェクトメンバー間でタスクの状況を逐次共有したり、カードのコメント内でのメンションをSlackに通知させて抜けがないようにもできます。


### [Colla](https://colla.jp/)
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/4990120d-db20-b3e8-09f4-8f1150049326.png">

Collaは毎日社員インタビューをしてくれるアプリです。
「◯○さんに質問です！」とCollaアプリさんからDMで質問が飛んできて、回答するとインタビューした内容（回答）を指定したチャンネルでメンバーに共有してくれます。
インタビューの結果をきっかけに、メンバー間のコミュニケーションの活性化に役立ちます。
インタビューテーマは日々更新されるので、内容に飽きることもありません。

<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/6fdb2759-0a92-4be7-b8c9-829a4d073dbd.png">
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/93975ac9-ea74-7098-552b-b1231c166070.png">

特に新しい社員が入社したときなどは、メンバー紹介や打ち解けるのに便利です。
無論、既存の社員について改めて知りたいときに利用することもおすすめです。

専用ページでこれまでのインタビュー結果を閲覧することも可能です。
また有料ですが、感謝の気持ちを送るキャンディというユニークな機能などもあります。


### [Stock](https://www.stock-app.info/slacktostock.html)
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/e727ac66-8984-3aa4-b5b2-e5415b50a07e.png">

Slackなどのチャットツールでよく起きるのが、「コミュニケーションのスピードの早さや量の多さによって、大事な情報がいつの間にか流れていってしまい、後で探す時に苦労する」という問題です。
DropboxやGoogleドライブを使って管理してもよいですが、保存したいのがファイルではなく会話の内容自体だったりすると、逐一ドキュメントに転記してから保存するという手間がかかります。

Stockはシンプルな情報共有ツールで、参加メンバーを個別に設定できるフォルダを設定し、ノートという単位でテキストや画像を保存・共有できます。
事前登録は必要ですが、他の共有ツールと比べても機能やUIがシンプルなので、ツールに慣れていない人でも扱いやすいのがメリットです。

<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/dd6241a6-ec27-25d0-241f-a509502385b7.png">
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/c69a2f72-d3c9-546e-0324-f69f4977c9a0.png">

ストックする方法も簡単で、対象のメッセージのショートカットから「Stock this message」を選択し、保存先のフォルダとタイトル・本文を設定するだけです。
保存すると同チャンネルでStockへのリンクが表示されるので、そこからStockに保存されたノートを確認しに行くこともできます。

:::note warn
他のSlack Appと違い、Slackと連携する時はStockアプリ側からの連携設定が必要になります。（Stockアプリ側から設定すると、自動的にSlack Appも有効になります）
:::


# Slackアプリの自作
ここまで見てきた通り、Slackには様々な機能があり、外部サービスとの連携も容易で、組み合わせ次第で様々な応用が可能です。
そしてSlackアプリは自作することも可能なので、欲しい機能が見つからない場合は自分で作ってしまうのもありです。
以下では、スラッシュコマンドとBotの自作方法について、記事などを参考にしながら簡単に紹介します。

## スラッシュコマンドの自作
[便利機能のところで紹介した](#スラッシュコマンド)通り、メッセージ投稿フォームにスラッシュ（`/`）で始まるコマンドを入力することで、Slackの様々な機能を利用することができます。
スラッシュコマンドの自作から処理の流れは、ざっくり下記のようになります。

    1. Slackからアクセスされるwebサーバー（何らかの処理をする部分）を用意
    2. Slack Appを用意し、スラッシュコマンドとアクセス先のURLを設定
    3. 2.のSlack Appをワークスペースにインストール
    4. スラッシュコマンドを実行すると、設定したURLに対してメッセージがPOSTされる
    5. リクエスト先で受け取ったメッセージに応じて自動処理などを行う
    6. レスポンスで応答メッセージなどを投稿する

上記の通り、Slackからのメッセージを受け取れるようにするためには、webサーバーなどを用意する必要があります。
ただし、GoogleのGASやAWSのLambdaなどを使用すれば、サーバー構築不要で比較的簡単に実装できます。サーバレス様様ですね。

:::note warn
**自作する場合はセキュリティ対策に注意**
webサーバーやBotの機能が不正に使用されないように、セキュリティ対策も必要になります。
Slack側のIPは非公開でIP制限による不正アクセス防止はできないようなので、Slackから提供されているHTTPリクエストを検証する機能などの使用が公式に推奨されています。
この点については[こちらの記事](https://qiita.com/namutaka/items/20951da3dddd1750af4a)に分かりやすく詳しく書かれていたので、参考にしてください。
:::

以下では、勤怠記録用のGoogleスプレッドシートに勤怠を記録するスラッシュコマンドの自作方法を活用例として紹介します。


### 活用例：Googleスプレッドシートに勤怠を記録するスラッシュコマンド

勤怠管理表のスプレッドシートは下記のような形式であらかじめ準備できているとします。
シートは月単位で分かれていて、日付単位の行に勤務時間の入力欄があります。
出勤と退勤の時間が別々に記録できるようになっているので、それぞれ記録すれば勤務時間の合計は関数で自動集計されるようになっています。

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/55c57193-a03a-5c11-7276-12f19c569956.png">

下記表の通り、`/attendance`のスラッシュコマンドを`in`（出勤）と`out`（退勤）のメッセージと合わせて実行することで、出勤と退勤の時間がスプレッドシートに記録されるようにします。

 スラッシュコマンド|機能
---|---
`/attendance in`|出勤の打刻
`/attendance out`|退勤の打刻
<br>

#### 作成手順

1. Slack Appの作成
スラッシュコマンドの作成にあたり認証トークンが必要なので、まずはSlack Appを作成します。
Slack Appの作成手順については、[Webhook URLの取得手順](#webhook-urlの取得手順)1.~3.を確認してください。
Slack Appが作成できたら、アプリの管理画面に移動し、「Basic Information」 → 「App Credentials」を確認します。
「Verification Token」に表示されているランダムな文字列が認証用のトークンになるので、次の手順で使用するためにメモしておきます。

    <img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/ff4957f9-b57d-711c-e436-eeb8df279fe4.png">

    <br>
    <br>

2. GASの作成
        GASでスクリプトを作成していきます。
    今回の要件では、認証に使用するトークンとメッセージ内容が取得できれば十分そうなので、payloadから`token`と`text`の値を取得するようにします。
    （スラッシュコマンド実行時にPOSTされるpayloadの内容は[公式の資料](https://api.slack.com/interactivity/slash-commands#app_command_handling:~:text=your%20app%27s%20commands.-,2.%20Preparing%20your%20app%20to%20receive%20Commands,-When%20a%20slash)を参照してください。）
    なお、先ほど取得したSlack Appの認証トークンはセキュリティ情報なので、GASのスクリプトプロパティに登録して使用することにします。

    スクリプト全体の処理内容は下記のようになります。
    ```
    1. doPost関数でPOSTリクエストを受け取る
    2. 現在時間を取得
    3. payloadからtokenを取得して認証
    4. payloadからtextを取得し、出勤か退勤か判定
    5. 時刻情報から記録先のシートと行番号を判定
    6. 出勤or退勤の適当な方のセルに時間を入力
    7. 打刻完了のメッセージと日時情報をレスポンスで返す
    ```
    
    下記が完成したコードです。
    
    ```javascript
    // Slackスラッシュコマンドからのデータを処理する関数（POSTリクエストなので必ずdoPostを用意する）
    function doPost(e) {
      // 打刻時間を先に取得しておく
      var date = new Date();
    
      // トークンで認証
      var verificationToken = e.parameter.token;
      var tokenCheckValue = PropertiesService.getScriptProperties().getProperty('VERIFICATION_TOKEN')
      if (verificationToken != tokenCheckValue) { 
        throw new Error('Invalid token');
      }
    
      const allowValues = ['in', 'out']
      var responseMessage = 'empty message'
    
      // Slackからのメッセージを取得
      var text = e.parameter.text;// in（出勤） or out（退勤）
    
      // 出勤か退勤か判定
      if (!allowValues.includes(text)) {
        // in, out以外のメッセージの場合は使用可能な値を教えるメッセージを返す
        responseMessage = '出勤の場合は in 、退勤の場合は out を指定してください。';
      }
      if (text == 'in') {
        // Googleスプレッドシートに出勤記録
        responseMessage = clockInAppendToSpreadsheet(date);
      }
      if (text == 'out') {
        // Googleスプレッドシートに退勤記録
        responseMessage = clockOutAppendToSpreadsheet(date);
      }
    
      // Slackに打刻完了メッセージをレスポンスで返す
      let response = { text: responseMessage };
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    }
    
    // Googleスプレッドシートに出勤の打刻
    function clockInAppendToSpreadsheet(date) {
      // Dateオブジェクトから打刻時間などを取得
      var clockInTime = Utilities.formatDate(date, 'JST', 'HH:mm');
      var timestamp = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd HH:mm:ss');
      var dayString = date.getDate() + '日';
      
      // スプレッドシートを取得
      var spreadsheetId = PropertiesService.getScriptProperties().getProperty('SPREAD_SHEET_ID');
      var sheetName = Utilities.formatDate(date, 'JST', 'yyyy_MM');
      var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
    
      // 打刻する行を特定
      var row = get_row(dayString, 'D', sheet);
    
      // メッセージの書き込み
      sheet.getRange('F' + row).setValue(clockInTime);
    
      // レスポンスメッセージを生成
      var message = '出勤の打刻をしました。打刻時間： ' + timestamp
    
      return message
    }
    
    // Googleスプレッドシートに退勤の打刻
    function clockOutAppendToSpreadsheet(date) {
      // Dateオブジェクトから打刻時間などを取得
      var clockInTime = Utilities.formatDate(date, 'JST', 'HH:mm');
      var timestamp = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd HH:mm:ss');
      var dayString = date.getDate() + '日';
      
      // スプレッドシートを取得
      var spreadsheetId = PropertiesService.getScriptProperties().getProperty('SPREAD_SHEET_ID');
      var sheetName = Utilities.formatDate(date, 'JST', 'yyyy_MM');
      var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
    
      // 打刻する行を特定
      var row = get_row(dayString, 'D', sheet);
    
      // メッセージの書き込み
      sheet.getRange('H' + row).setValue(clockInTime);
    
      // レスポンスメッセージを生成
      var message = '退勤の打刻をしました。打刻時間： ' + timestamp
    
      return message
    }
    
    // col列で特定の値と一致する行数を返す
    function get_row(key, col, sh){
     var array = get_array(sh, col);
     var row = array.indexOf(key) + 1;
     return row;
    }
    
    // col列の最終行を取得して1から最終行までの数字を配列で返す
    function get_array(sh, col) {
      var last_row = sh.getLastRow();
      var range = sh.getRange(col + "1:" + col + last_row)
      var values = range.getValues();
      var array = [];
      for(var i = 0; i < values.length; i++){
        array.push(values[i][0]);
      }
      return array;
    }
    ```
    スクリプトが完成したら、ウェブアプリとしてデプロイし、発行されたURLをメモしておきます。
    <br>
1. Slack Appにスラッシュコマンドを登録
    1.で作成したSlack Appの管理画面に戻り、「Basic Information」 → 「Add features and functionality」 → 「Slash Commands」 → 「Create New Command」でスラッシュコマンドの作成画面に移動します。
    
    <img width=350 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/36f2efe2-e6f5-da45-f667-5f1d0fe5c5a9.png">

    `/`で始まるコマンドと、2.で取得したスクリプトのURLを設定します。
    Short Descriptionはスラッシュコマンドの説明文として予測候補に表示されるので、設定しておいた方が分かりやすいでしょう。
    設定したら「Save」ボタンを押して保存します。
    <br>
    
1. 作成したAppのインストール
    作成したSlack Appは他のアプリと同様に自分のワークスペースにインストールする必要があります。
    アプリの管理画面で「Basic Information」 → 「Install your app」 → 「Install to Workspace」ボタンを押します。
    アプリが投稿可能なチャンネルの指定と許可の画面が出るので、チャンネルを指定して許可し、インストールします。
    インストールに成功すると、ページ内のヘッダー下部に緑色のバーで「Success!」と表示されます。
    <br>

1. 動作確認
スラッシュコマンドを実行してみます。
メッセージ投稿フォームで`/`を入力してみると、作成したスラッシュコマンド（`/attendance`）が予測候補に出てきました。

    <img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/2ef6501d-b1be-deff-916a-575fa2b9cf2c.png">
    
    `in`（出勤）と`out`（退勤）を付けてコマンドを打ってみると、打刻完了のメッセージと時刻が表示され、スプレッドシートにもちゃんと時刻が記録されています。
    
    <img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/21ba669e-d70a-650d-ac89-285bb5fc13db.png">
    <img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/df944f01-5e70-3e32-4b14-56809d74d774.png">

<br>
このように、スラッシュコマンドの仕組み自体はシンプルで、実装も簡単な上に自由度も高いです。
工夫次第で業務のちょっとした効率化などに活用できるのではないでしょうか。


## Botの自作
今度はSlack Botを自作してみます。
スラッシュコマンドと同様に自由度は高いですが、権限周りの設定が必要な分、実装難易度が少し高くなります。

処理内容によりますが、下記がSlack Botの自作から処理までの流れの一例になります。

    1. Slackからアクセスされるwebサーバー（何らかの処理をする部分）を用意
    2. Slack Appを用意し、Botの表示名、権限、サブスクリプション、アクセス先のURLなどを設定
    3. 2.のSlack Appをワークスペースにインストール
    4. Botを実行すると、設定したURLに対してメッセージなどがPOSTされる
    5. リクエスト先で受け取ったメッセージに対して自動処理などを行う
    6. レスポンスで応答メッセージなどを返す

こうしてみるとスラッシュコマンドの自作方法と流れは同じです。
無論、webサーバーが無くても、先ほどと同様にGASやLambdaなどを使ってサーバレスでも作成できます。
また、Bot用の署名や認証の仕組みもしっかり用意してあるので、セキュアな仕組み作りが可能です。

今回は「[ChatGPTと会話するSlack botを最速で実装する](https://qiita.com/Yuki_Oshima/items/112e69df63df9958709f)」という素敵な記事を見つけたので、これを参考にしてSlack Botの自作にチャレンジしてみます。

### 活用例：ChatGPTと会話するBot

#### 完成イメージ

参考記事に記載されているのものと同じく、Botに対するメンション付きで質問を投げると、ChatGPTからの返答がメッセージで返ってくるようにします。

#### 作成手順

:::note warn
細かい手順やコード詳細などについては、参考元の記事を確認してください。
:::

1. OpenAI APIの用意
    ChatGPTを使うので、OpenAI APIの使用登録をします。
    詳しい登録方法などはここでは割愛しますが、現在初期登録で5ドル分までは無料で使用可能なようです。
    後でAPIキーの設定が必要になるので、メモしておきます。
    <br>

1. Slack Appの作成
    Botを設定するSlack Appを作成します。
    Slack Appの作成手順については、[Webhook URLの取得手順](#webhook-urlの取得手順)1.~3.を確認してください。
    Slack Appが作成できたら、アプリの管理画面に移動し、「OAuth & Permissions」 → 「Scopes」の「Bot Token Scopes」で下記の権限を追加します。
    * app_mentions:read（アプリへのメンションの読み取り）
    * channels:history（チャンネル内の会話履歴の読み取り）
    * chat:write（チャットの書き込み）
    
    同じページ内の「OAuth Tokens for Your Workspace」の「Bot User OAuth Token」がアプリの認証トークンになるので、こちらも後で使うためにメモしておきます。
    また、「Basic Information」 → 「App Credentials」の「Signing Secret」が署名用のキーになり、こちらも使うのでメモしておきます。
    <br>

1. Lambdaの実装
    実装はLambdaで行います。
    こちらも詳しい実装やコードは参考にさせていただいた記事の通りなので割愛しますが、関数のHTTPエンドポイントをBotに設定するので、Lambda作成時に詳細設定からエンドポイントを作成して、忘れずにメモしておきましょう。
    また、コード内で使用するため、1.のOpenAI APIのAPIキーと、2.のBot User OAuth TokenとSigning Secretを忘れずにLambdaの環境変数に設定しておきます。
    <br>

1. Slack Botのイベントサブスクリプションを設定
    Botを実行した時に処理を送るエンドポイントが取得できたので、イベントサブスクリプションを設定します。（Bot実行のトリガーのようなものです）
    アプリ管理画面で「Event Subscriptions」 → 「Enable Events」の「Request URL」にLambdaのエンドポイントを入力します。
    URLが検証され、問題なければ緑色の文字で「Verified」と表示されます。
    
    次に、ページ下部の「Subscribe to bot events」を開き、購読するイベントを設定します。
    「Add Bot User Event」から「app_mention」のイベントを設定したら、「Save Changes」で設定を保存します。
    <br>

1. 動作確認
    作成したBotにメンション付きで質問して動作確認してみます。
    質問すると「system 処理中......」と表示され、少し待つとChatGPTからの返答が返ってきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847081/5f564dd9-9e18-6304-68e9-923654c386d2.png">

<br>
<br>
Slack Botも仕組み自体はシンプルです。実装に応じた権限設定がやや手間ですが、Botなら普通のユーザーと同じSlack上の操作が可能なので、組み合わせ次第で何でも作れそうですね。


# まとめ
SlackにはスラッシュコマンドやSlackアプリなどの様々な便利機能や活用方法があります。
使い方次第で、業務の効率化したり、メンバー間のコミュニケーションの幅を広げたりすることが可能です。

Incoming Webhookや、Zapierなどのワークフロー化アプリなどを活用することで、外部サービスとの連携も簡単にできます。
スラッシュコマンドやSlack Botは自作もできるので、Slackをチームに合わせて自由にカスタマイズできるのも魅力的です。

チャットツールとして世界中の様々な企業や団体で使われているSlackは、来年にはAI関連機能のリリースも予定しています。
今後も高い需要が見込まれるため、技術スタックの一環として色々な活用術を習得しておきましょう。
<br>

::: note
弊社Nucoでは、他にも様々なお役立ち記事を公開しています。よかったら、Organizationのページも覗いてみてください。
また、Nucoでは一緒に働く仲間も募集しています！興味をお持ちいただける方は、[こちら](https://www.recruit.nuco.co.jp/?qiita_item_id=4a1eba977fd64e6e9716)まで。
:::
https://www.recruit.nuco.co.jp/?qiita_item_id=4a1eba977fd64e6e9716


# 参考資料
**Qiita**
slack でのいろんな表記方法
https://qiita.com/sheercat/items/186c71af92c9494ab26f

Slackであまり知られていない便利機能一覧
https://qiita.com/kozyty@github/items/cbe58a72a715b540c60f

slackのIncoming webhookが新しくなっていたのでまとめてみた
https://qiita.com/kshibata101/items/0e13c420080a993c5d16

Slackが楽しくなるbot「Colla」の紹介と、導入のためにやったこと
https://qiita.com/acnaman/items/2eb395282384e6481b96

Slackのスラッシュコマンドを作成する
https://qiita.com/ytamu2/items/f81f9bc0023ef8758377

Slack Botの種類と大まかな作り方
https://qiita.com/namutaka/items/233a83100c94af033575
<br>

**Slack公式**
新しくなった Slack のデザインで、仕事にさらに集中
https://slack.com/intl/ja-jp/blog/productivity/a-redesigned-slack-built-for-focus

Slackの使い方 - メッセージの編集または削除
https://slack.com/intl/ja-jp/help/articles/202395258-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E7%B7%A8%E9%9B%86%E3%81%BE%E3%81%9F%E3%81%AF%E5%89%8A%E9%99%A4

Enabling interactivity with Slash Commands
https://api.slack.com/interactivity/slash-commands#app_command_handling
<br>

**その他**
企業のビジネスチャット利用実態調査2021
https://www.bizclip.ntt-west.co.jp/articles/bcl00014-027.html

Slack Statistics to Annoy Your Colleagues With
https://kommandotech.com/statistics/slack-statistics/

Slack says that while its user numbers still lag Microsoft's, what really matters is that users love its app a lot
https://www.businessinsider.com/slack-daily-active-users-microsoft-teams-2019-10

20年のトップ＃2023スラック統計とトレンド
https://www.websiterating.com/ja/research/slack-statistics-trends/

「Slack AI」2023年冬にパイロット版をリリースへ　チャンネルやスレッドの要約に対応
https://enterprisezine.jp/news/detail/18376

Slack隠しコマンド26選｜作業効率が圧倒的に変わる魔法のコマンド集
https://ishikawa-blog.com/slack-hidden-command-selection/

【画像付き】Slackのリマインダー機能の設定方法と4つの便利な使い方
https://www.icraft.jp/useful/slack-reminder/

Zapier連携：Gmailの受信メール (特定ラベル) をSlackに通知
https://notepm.jp/blog/5863

IFTTTでSlackとyoutubeを連携させる
https://note.com/nogaill/n/n7bfc53239242

TrelloとSlackの連携手順を解説！タスク管理を省力化
https://autoro.io/blogs/trello-slack/