みなさまこんにちは、コーポレートエンジニアリングチームの和田です。

私たちコーポレートエンジニアリングチームは、社内ネットワークの管理やシステムの導入など日々社内インフラの管理を行っておりますが、日頃業務を行う上でちょっとした不便さの解消や効率をアップするようなツールの作成も業務の1つです。

今回はその中で最近作ったツールをご紹介したいと思います。

Slackのマルチチャンネルゲストをパブリックチャンネルに自由に招待できない問題

ご覧いただいている皆様の中にも、企業でSlackを利用している方はたくさんいらっしゃると思います。 Slackを運用していく中で、パブリックチャンネルにゲストを招待する際の運用は、皆様どうされてますでしょうか?

(執筆時点では)Slackの仕様上、管理者以上の権限がないとゲストをパブリックチャンネルには招待できません。したがって、

  • 管理者に都度連絡する
  • 管理者権限を多くのメンバーに付ける
  • そもそもマルチチャンネルゲストの参加チャンネルは固定にする

等、会社の状況やルールによって、様々な方法で運用されていると思います。

当社では、パブリックチャンネルであれば誰でも自由に入れるようにしたいが、管理者を増やしすぎるのも避けたいため、都度管理者に依頼して招待してもらう、という運用を行ってきました。 しかし依頼する側も遠慮してしまったり、面倒だったりするという問題がありました。

そこで今回、パブリックチャンネルであれば、誰でもゲストを招待できるツールを作りました。

誰でもチャンネルにゲストを招待できるツール

まずツールの機能ですが、誰でも自由にとは言いつつもちゃんとログも残したいので、以下のような要件としました。

  • いつ誰がどこのチャンネルに誰を招待したかログを取る
  • 招待できるチャンネルは、パブリックチャンネルだけとする
  • 招待できる対象はマルチチャンネルゲスト、それも当社のメールアドレスを持つアカウントだけ
  • 手入力だと入力の揺らぎが出てしまうので、なるべく選択式にしてエラー処理を省く

そしてなるべくコストをかけたなくないので、今回はサーバを用意して全部最初から作るということはやめて、普段利用しているG Suiteを使うようにしました。 その結果、以下のような相関図になりました。

相関図

そして、実際に完成したのが、以下のフォームです。

Google Form

招待したいチャンネルとマルチチャンネルゲストを選び送信ボタンを押すだけ、というシンプルな作りです。 ちなみにこのフォームは、Googleアカウントを収集するモードにしていますので、誰が操作したかをログに残せるようにしています。

このフォームにある2つのリストボックスですが、日々作られるチャンネルや登録されるゲストを手動で加えていくのは現実的ではありません。そこで、チャンネルとゲストをSlackのAPIを通じて選択肢に追加していくスクリプトを作って自動化しています。

リストボックスに選択肢を追加するスクリプト(抜粋)

  // channelリストの作成
  // channellistには、SlackAPIを通じて取ってきたChannelリストが格納されている
  for (i = 0; i < channellist.channels.length; i++) {
    // 生きているパブリックチャンネルのみ抽出
    if (channellist.channels[i].is_channel == true && channellist.channels[i].is_archived == false && channellist.channels[i].is_private == false) {
      // 選択肢にSlack APIで取ってきたリストを追加していく
      choices.push(items[0].asListItem().createChoice(channellist.channels[i].name));
    }
  }
  items[0].asListItem().setTitle("Public Channel").setChoices(choices);
  
  // multi guest list の作成
  // mguestlistには、SlackAPIを通じて取ってきたアカウントリストが格納されている
  var email;
  for (var i = 0; i < mguestlist.members.length; i++) {
    // 生きているマルチチャンネルゲストのみ抽出
    if (mguestlist.members[i].deleted == false && mguestlist.members[i].is_restricted == true && mguestlist.members[i].is_ultra_restricted == false) {
      email = mguestlist.members[i].profile.email;
      // SmartNewsのメールアドレスを持つゲストだけ選択肢とする
      if (email.indexOf("@smartnews.com") != -1) {
        choices.push(items[1].asListItem().createChoice(email));
      }
    }
  }
  items[1].asListItem().setTitle("Multi-Channel Guest").setChoices(choices);

また、チャンネルとゲストを選択して送信ボタンを押すと、チャンネルにゲストが自動的に招待されますが、このとき招待と合わせて対象のチャンネルにも誰が誰を招待したかわかるメッセージもポストするようしました。

ゲストが追加されたときにポストされるメッセージ

実現できなかったこと

今回はGoogleフォームを使うことで手軽に作ることができましたが、逆にGoogleフォームの制約のため、いくつかの機能を断念しました。

  • 送信ボタン押下後に、確認画面を出したかった

こういった登録系の画面では、「このチャンネルにこのゲストを追加します。いいですか?」というような確認画面を出したいところですが、これはGoogleフォームの制限で、送信ボタンを押したあとのメッセージを動的に変えて出すことができません。

  • 複数のチャンネルや複数メンバーの複数登録がしたかった

Googleフォームで用意されている選択式のパーツには、複数選択出来るものがありません。チャンネルやゲストの指定を、選択式ではなく自由入力にすれば可能になりますが、その分入力ミス等の処理を考えると、シンプルな今回の形に落ち着きました。

このあたりを実現するには、UIから開発する必要が出てくるので、今後運用していく中でニーズが高まれば、検討したいと思います。

最後に

このツールを使うことで、誰でもチャンネルに招待できるようになり、業務効率や情報の公開性を向上することができたかと思います。 これからも、社内が便利になったり業務効率が上がるような仕組みを、模索し続けていきます。

コーポレートエンジニアリングでは、一緒に会社をより良くしていく仲間を募集中です。 興味を持たれた方は、ぜひご応募ください! https://smartnews.workable.com/j/2AE725C07D

なおコーポレートエンジニアリング以外にも、多数のポジションで皆様の応募をお待ちしております。 また、もっと気軽に会社のことを聞いてみたいという方には、カジュアルな面談という形もご用意しておりますので、ご興味持たれた方はぜひ一度ご連絡ください。 https://smartnews.workable.com/