Slack のステータスで通知を自動切り替えする Chrome 拡張機能を作ってみた

Slack のステータスで通知を自動切り替えする Chrome 拡張機能を作ってみた

KING OF TIME の打刻に連動して Slack の通知を自動で切り替える Chrome 拡張機能を作った。その仕組みと実装のポイント、セットアップ方法をまとめました。
2026.10.14

作った経緯

Slack の通知スケジュール機能(曜日・時間帯の固定設定)だけでは、日によって変わる勤務時間に対応しきれないと感じていました。

勤怠管理システム KING OF TIME(以下 KOT)の Slack 連携機能により、出退勤の打刻と連動して Slack のステータスが自動で切り替わる設定にしています。そこで、KOT の打刻 → Slack ステータスが変わる → 通知のオン/オフも自動で切り替わるという流れを作れれば、手動で操作しなくても「業務中だけ通知を受け取る」状態にできると考えました。

作ったもの

Slack のステータス絵文字を定期的に確認し、おやすみモード(DND: Do Not Disturb)の設定・解除を自動で切り替える Chrome 拡張機能です。

  • 出勤ステータス → 通知許可(おやすみモード解除)
  • 退勤ステータス → 通知停止(おやすみモード設定)

どの絵文字が「許可」でどの絵文字が「停止」かは拡張機能のポップアップから自由に設定できます。ステータス変化から通知切り替えまでは最大 5 分のタイムラグがあります(ブラウザが起動している場合)。おやすみモードはワークスペースのユーザー単位で設定されるため、同じワークスペースにログインしているスマートフォンの Slack アプリにも自動で反映されることも利点です。

設定ポップアップの全体像

仕組み

Slack のおやすみモードは DND API で制御できます。必要なのはユーザートークン(xoxp-)のみで、サーバーや Bot ユーザーは不要です。ただし、ユーザートークンを発行するために Slack App の作成は必要です。

Chrome 拡張機能(5 分ごとにアラーム)
  → users.profile.get でステータス絵文字を取得
  → 設定リストと照合
  → 退勤ステータスの場合: dnd.setSnooze でスヌーズを再設定(期限切れ防止)
  → 出勤ステータスの場合: dnd.info でスヌーズ中か確認し、スヌーズ中なら dnd.endSnooze で解除

バックグラウンド処理は chrome.alarms で実装しました。Manifest V3 の Service Worker はアイドル時に停止しますが、chrome.alarms で登録したアラームは Service Worker の停止後も保持され、発火時に Service Worker が再起動されます。ブラウザの再起動時にアラームが消える場合があるため、Service Worker の起動時にアラームの存在を確認して再登録する処理を入れています。

なお、dnd.setSnooze はスヌーズ時間(num_minutes)の指定が必須で、無期限には設定できません。本拡張機能では 4,320 分(72 時間)を指定しており、退勤ステータスが続く間は 5 分ごとのチェックのたびにスヌーズを再設定します。最後にチェックした時点から 72 時間は通知が止まり続けます。そのため、通常の週末(金曜の退勤から月曜の出勤まで)であれば、PC をシャットダウンしていても問題ありません。ただし、72 時間を超えて PC を起動しない状態が続くとスヌーズが切れるため、長期休暇中は Slack の通知スケジュール設定との併用をおすすめします。

また、dnd.endSnooze が解除するのはスヌーズのみで、Slack 側で設定した通知スケジュールによるおやすみモードは解除されない点にご注意ください。

なぜ Chrome 拡張機能にしたか

最初は Python アプリ(ローカル実行)→ Google Apps Script(GAS)の順に検討しましたが、最終的に Chrome 拡張機能にしました。

方式 メリット デメリット
Python アプリ 実装の自由度が高い 常駐プロセスとして起動・管理する仕組み(自動起動設定など)が別途必要
Google Apps Script(GAS) サーバー不要で常時動作する 設定 UI を Web アプリとして別途作る必要があり、トークンの安全な管理にも手間がかかる
Chrome 拡張機能 ブラウザ起動中は自動で動く・設定 UI を作りやすい ブラウザを閉じると動かない

セットアップ手順

  1. https://api.slack.com/apps で Slack App を作成します(「From scratch」を選択)

  2. User Token Scopes に users.profile:read / dnd:read / dnd:write を追加します

  3. ワークスペースにインストールしてユーザートークン(User OAuth Token: xoxp-...)を取得します

  4. chrome://extensions で「デベロッパー モード」をオンにし、「パッケージ化されていない拡張機能を読み込む」からフォルダを選択します

  5. 拡張機能のポップアップでユーザートークンを入力し、絵文字を登録します(トークンは chrome.storage.sync に保存されます。Google アカウントで同期している場合は他端末にも共有される点にご注意ください)

manifest.json の主要部分は以下のとおりです(抜粋)。storage は設定の保存、alarms は定期チェックに使用します。

{
  "manifest_version": 3,
  "permissions": ["alarms", "storage"],
  "host_permissions": ["https://slack.com/api/*"],
  "background": { "service_worker": "background.js" }
}

ユーザートークンと絵文字を登録した状態

ハマりどころ

  • Bot トークンではなくユーザートークンが必要: dnd.setSnooze は Bot トークンでは呼び出せず、ユーザートークンが必要です
  • Manifest V3 の制約: インラインスクリプトが使えないため、popup.js を外部ファイルに分離する必要があります
  • ステータス絵文字の形式: Slack API は :emoji_name: のようにコロン付きで返します。ポップアップでコロンなし(例: office)で入力した場合でも一致するよう、入力値の前後にコロンを補完する正規化処理を入れました

注意事項

  • ブラウザを閉じると動作しない: ブラウザが起動していない間(PC シャットダウン・スリープ中を含む)は通知の切り替えとスヌーズの再設定が行われません。72 時間を超えて PC を起動しない場合は、Slack の通知スケジュール設定を併用してください
  • 出勤ステータス中の手動スヌーズは自動解除される: 出勤ステータスの間は 5 分ごとに dnd.info でスヌーズ状態を確認し、スヌーズ中であれば dnd.endSnooze で解除します。そのため、会議中などに手動でスヌーズを設定しても 5 分以内に自動解除されます。一時的に通知を止めたい場合は、ステータス絵文字を変更するなどの運用で対応してください
  • 本拡張機能は Chrome ウェブストアには公開しておらず、個人利用を目的として作成したものです

参考リンク

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイトをぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました。

この記事をシェアする

関連記事