slackの視認性向上のために「アイコン画像設定」を一括で促す


Slackにおけるアイコンの意義

入っているチャンネルの数が増えると、
すべての投稿に目を通すだけでも相当な労力になります。
アイコン画像は、発言の重要性・緊急性を認識する「視認性」を構成する重要な要素となります。

デフォルトアイコンの弊害

  • 発言に対して「重み付け」ができずに投稿を精査する労力が発生する
  • 似たようなアイコンなので、発言者を取り違える
  • 仕様でデフォルトアイコン自体が大きく変更されることがある

アイコン設定への心理的障害

そもそも、なぜアイコン設定しない人がいるのでしょうか?
視認性を下げてやる!という考えでアイコンを未設定にする人はいないと思います。
大半は下記の理由だと思います。

  • ビジネスツールでどんな画像をアイコンとして使っていいか分からない
  • かといって自撮りをupするのは恥ずかしい

特にチームにjoinしたばかりだと、
「アイコン画像なんか設定してふざけてる」と思われるのでは?と考える人もいるでしょう。

アイコン設定を促してあげる

「slackアイコン設定お願いします」と一言メンションを飛ばしてあげると万事解決です。
しかし、メンバーが増えるたびにメンションを送っているのではキリがありません。
「アイコン画像未設定ユーザー一覧」を取得する方法は無いのでしょうか?

slackAPI の Users.list を使う

Users.list でユーザーに関する情報を取得できます。
アイコンを設定しているユーザーは profile 内に is_custom_image というプロパティを持つようになります。

つまり
1. users.list で全ユーザーの情報取得
2. botやゲストユーザーを除外
3. is_custom_image が無いユーザーのIDを抽出
4. 抽出したユーザー達にメンションをつけてメッセージを投稿する。

という流れで解決することが出来ます。


※これより下は具体的なコードの話になります。
※使用するコードの全文はgithubに公開しております。
※実行環境としてGoogleAppsScriptを使用します。
GASの詳細な説明は省きますので、ライブラリやスクリプトの設定手順などは別の記事を参照してください。

実装方法

1. 一覧取得

    var token = PropertiesService.getScriptProperties().getProperty('OAuth_token');
    var slackapp = SlackApp.create(token);
    var membersList = slackapp.usersList().members;

先程も紹介した Users.list を使うだけです。

2. botやゲストの除外

    membersList.forEach(function(m) {
        // is_restricted 以外にすることで multi-channel guest を除外
        // is_ultra_restricted 以外にすることで single channel guest を除外
        // 詳細は https://api.slack.com/types/user を参照
        if (!m.deleted && !m.is_bot && m.id !== "USLACKBOT" && !m.profile.is_custom_image 
            && !m.is_restricted && !m.is_ultra_restricted) {
                defaultIconUsers.push(m.id)
            };
        })

コメントでも記載していますが、 is_restricted 及び is_ultra_restricted を参照することでゲストユーザーを除外することが出来ます。
このあたりの判定条件は実情に応じて適宜変更してください。

3. 投稿メッセージの作成

    var message = ""
    if (defaultIconUsers.length > 0) {
        message = "視認性向上のためアイコン画像の設定をお願いします\n"
        defaultIconUsers.forEach(function(d) {
            message += "<@" + d + ">"
    })} else {
        message = "アイコン画像を設定していないユーザーは居ません"
    }
    slackapp.postMessage(channelId, message);

判定結果に応じて条件分岐した後に、メッセージを作成して投稿という流れです。

  • デフォルトアイコンユーザーあり

  • なし

実装手順は以上となります。


おまけ

slack上で外部のお客様(関連会社)とのやりとりが多い会社では、
アイコン画像の設定が非常に重要で、設定するまで注意喚起され続けるというところもあるようです。

数ヶ月に1回このスクリプトを定期実行するだけでも、slackの視認性が向上してくれるのではと考えております。

ご精読ありがとうございました。