🐍

Slackプロフィール管理を自動化!slack-utils-user をリリース🎉

に公開

はじめに

「新入社員が入るたびに、Slackプロフィールの部署や役職を手動で設定している...」
「異動が多くて、カスタムフィールドの更新が追いつかない...」

こんな悩みを抱えている企業の管理者の方は多いのではないでしょうか?

Slack のユーザープロフィール管理は、特に Enterprise Grid 環境や大規模ワークスペースでは手間のかかる作業です。管理者が一人ひとりのプロフィールを更新するのは現実的ではありません。

そこで今回、Slack ワークフローからユーザープロフィールとカスタムフィールドを更新できるアプリ「slack-utils-user」 をオープンソースで公開しました!

slack-utils-user とは

slack-utils-user は、Slack の次世代プラットフォーム(Deno SDK v2.x)を使用したワークフローアプリケーションです。

主な特徴

特徴 説明
プロフィール更新 表示名、役職、電話番号などの標準フィールドを更新
カスタムフィールド対応 部署、入社日、従業員番号など、ワークスペース固有のフィールドを動的に取得・更新
承認ワークフロー 一般ユーザーからの更新リクエストを Admin/Owner が承認
権限ベース制御 フィールドごとに編集権限を設定可能
多言語対応 日本語(デフォルト)/ 英語に対応

なぜ作ったのか

背景:Enterprise Grid 環境での課題

大規模な組織では、以下のような課題があります:

  1. ユーザー情報の一元管理: 人事システムと Slack の情報を同期させたい
  2. 権限の適切な分離: 全員に管理者権限は与えられないが、一部の情報は自分で更新させたい
  3. 承認プロセス: 重要なフィールド(役職、部署など)は承認を経て更新したい
  4. 一括処理の基盤: 将来的に大量のユーザー情報を一括更新したい

解決策:ワークフローベースのユーザー管理

主な機能

1. プロフィール更新ワークフロー

プロフィール更新モーダル
プロフィール更新モーダル:表示名、役職、電話番号などのフィールドを更新

ユーザーの標準プロフィールフィールドを更新できます。

更新可能なフィールド:

  • 表示名(display_name)
  • 役職(title)
  • 電話番号(phone)
  • 代名詞(pronouns)
// ワークフローの定義
export const UpdateProfileWorkflow = DefineWorkflow({
  callback_id: "update_profile_workflow",
  title: "プロフィール更新",
  description: "ユーザーのプロフィール情報を更新します",
  input_parameters: {
    properties: {
      interactivity: { type: Schema.slack.types.interactivity },
      user_id: { type: Schema.slack.types.user_id },
      channel_id: { type: Schema.slack.types.channel_id },
    },
    required: ["interactivity", "user_id", "channel_id"],
  },
});

2. カスタムフィールド更新ワークフロー

カスタムフィールド更新モーダル
カスタムフィールド更新モーダル:部署、入社日、従業員番号などを動的に取得・更新

ワークスペースに設定されたカスタムフィールドを動的に取得し、フォームを生成します。

対応フィールドタイプ:

  • テキスト(text)
  • 日付(date)
  • 選択リスト(options_list)

特徴:

  • モーダルを開くと現在の値が自動的に初期表示される
  • 非表示・保護フィールドは自動的にフィルタリング

3. 権限チェック機能

承認リクエストメッセージ
承認リクエストメッセージ:「承認」「却下」ボタンで対応

操作者の権限に基づいて、適切なアクションを決定します。

操作者 自分のプロフィール 他ユーザーのプロフィール
Primary Owner 直接実行 直接実行
Owner 直接実行 直接実行
Admin 直接実行 直接実行
一般ユーザー 許可フィールドのみ 承認リクエスト

セットアップ

前提条件

  • Deno 1.37+
  • Slack CLI
  • Git

インストール

# リポジトリをクローン
git clone https://github.com/leaveanest/slack-utils-user.git
cd slack-utils-user

# 環境変数を設定
cp .env.example .env

環境変数

# 必須: Admin User Token(他ユーザー更新用)
SLACK_ADMIN_USER_TOKEN=xoxp-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxx

# オプション: 承認リクエスト送信先チャンネル
SLACK_APPROVAL_CHANNEL_ID=C0123456789

デプロイ

# ローカル開発
slack run

# 本番環境へデプロイ
slack deploy

利用可能なワークフロー

ワークフロー callback_id 説明
プロフィール更新 update_profile_workflow 標準プロフィールフィールドの更新
カスタムフィールド更新 update_custom_fields_workflow カスタムフィールドの更新

プロジェクト構成

slack-utils-user/
├── functions/              # Slack Functions
│   ├── check_user_permissions/    # 権限チェック
│   ├── get_authorized_approvers/  # 承認者取得
│   ├── get_custom_field_definitions/ # カスタムフィールド定義取得
│   ├── show_custom_fields_form/   # カスタムフィールドフォーム表示
│   ├── show_profile_update_form/  # プロフィール更新フォーム表示
│   ├── update_custom_fields/      # カスタムフィールド更新
│   └── update_user_profile/       # ユーザープロフィール更新
├── workflows/              # Slack Workflows
├── triggers/               # Slack Triggers
├── lib/                    # 共通ライブラリ
│   ├── i18n/              # 多言語対応
│   ├── types/             # 型定義
│   └── validation/        # Zodスキーマ
├── locales/               # 翻訳ファイル(en/ja)
└── manifest.ts            # Slackアプリマニフェスト

技術的なポイント

1. 他ユーザーのプロフィール更新

Slack の Bot Token では他ユーザーのプロフィールを更新できません。そのため、Admin User Tokenxoxp-)を使用しています。

// Admin User Token を使用した API 呼び出し
const adminClient = SlackAPI(env.SLACK_ADMIN_USER_TOKEN);
await adminClient.users.profile.set({
  user: targetUserId,
  profile: { display_name: newDisplayName },
});

2. カスタムフィールドの動的取得

team.profile.get API を使用して、ワークスペースのカスタムフィールド定義を取得します。

const response = await client.team.profile.get();
const fields = response.profile?.fields ?? [];

// フィルタリング:非表示・保護フィールドを除外
const editableFields = fields.filter(
  (f) => !f.is_hidden && !f.options?.is_protected
);

3. 現在値の自動取得

モーダルを開く際に、users.profile.get API で現在の値を取得し、初期値として表示します。

const userProfile = await client.users.profile.get({ user: userId });
const currentValues = userProfile.profile?.fields ?? {};

// フォームに現在値を設定
blocks.push(createFieldInput(field, currentValues[field.id]?.value));

4. 多言語対応(i18n)

locales/ ディレクトリに翻訳ファイルを配置し、t() 関数で動的に取得します。

import { t } from "../../lib/i18n/mod.ts";

throw new Error(t("errors.user_not_found", { userId }));
// 日本語: "ユーザーが見つかりません: U12345"
// 英語: "User not found: U12345"

GitHub Actions で自動翻訳も設定済みです。

今後の展開

slack-utils シリーズとして、以下のツールを公開予定です:

ツール 説明 ステータス
slack-utils-channel チャンネル管理 公開済み
slack-utils-user ユーザー管理 今回リリース
slack-utils-group ユーザーグループ管理 計画中

カスタマイズの可能性

このアプリはユーザー管理アプリのテンプレートとして設計されています。

例えば:

  • 人事システムとの連携による一括更新
  • 新入社員オンボーディングの自動化
  • 異動時のプロフィール一括更新
  • 定期的なプロフィール監査

企業の要件に合わせてカスタマイズすることで、社員数が多い企業向けのユーザー管理ソリューションとして活用できます。

まとめ

  • slack-utils-user は Slack ワークフローからユーザープロフィールを更新できる OSS アプリ
  • 承認ワークフローで安全にプロフィール変更を管理
  • カスタムフィールドも動的に取得・更新可能
  • 多言語対応(日本語/英語)
  • 大規模組織向けのユーザー管理基盤として拡張可能

ぜひ試してみてください!

参考リンク

リバナレテックブログ

Discussion