6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS-GUILDAdvent Calendar 2023

Day 23

【SlackAPI】無料版Slackワークスペースに所属している全ユーザーをAPIを利用して取得する

Last updated at Posted at 2023-12-23

概要

「あるチャンネルに全ユーザーを招待したいけど、一人ひとり招待するのは面倒くさい。」

こういった場面に直面したので、SlackAPIを用いて、ワークスペースに所属している全ユーザーのメンション名をスプレッドシートに出力する処理をGAS(GoogleAppScript)で実装してみました。

また、↑の記事を参考に
#general/who というコマンドを打てば、招待できるんやん!」
とも思ったのですが、100人を超えると省略されてしまいます。
この記事で説明する方法は、ワークスペースが100人以上いる時に使う方法だと思ってもらえればと思います。

実装方針

実装方針はざっとこんな感じです。

① SlackAPIを利用する上で必要なトークン類を発行
② SlackAPI の users.list を叩く
③ 「削除済ユーザー」などの招待対象外のユーザーを弾く条件文を追加する
④ スプレッドシートに出力する

タイトルの「ワークスペースに所属している全ユーザーを取得する」だけを見ると、大分面倒くさそうですが、一つひとつはとてもシンプルです。非エンジニアでも全然実装できると思います。

botトークンを発行

これは他所で何度も紹介されている内容なので省略します。

こちらの記事とか分かりやすかったのでおすすめです。

ただ、bot の scope の設定だけ、上の記事とは違うので補足します。
上の記事では、chat:writeと設定していましたが、今回の実装ではusers:readを設定してください。

Bot User OAuth Tokenを生成するところまで出来たら、とりあえずこの章での目標は達成です。

実装

一つ前の章で、実装方針で言うところの①に相当する内容を達成できました。
残りの②〜④は一つのファイルにコードを書くだけなので、この章でまとめて紹介しちゃいます!

まずはスプレッドシートとGASを紐付けます。
スプレッドシートを新規作成して、拡張機能 > AppScriptsを選択し、エディタを開きます。
スクリーンショット 2021-11-30 7.21.54.png

開いたエディタに以下のコードを貼り付けます。
slack_app_tokenに前章で作成したトークンを代入し、実行をクリックすればスプレッドシートに全メンション名が出力されます。

function getSlackUser() {
  
  //  一つ前の章で作成した Bot User OAuth Token
  const slack_app_token = "xoxb-xxx...";
  
  const options = {
    "method" : "get",
    "contentType": "application/x-www-form-urlencoded",
    "payload" : { 
      "token": slack_app_token
    }
  };
  
  // users.list(GET): ワークスペースの全ユーザーを取得する 
  const url = "https://slack.com/api/users.list";
  const response = UrlFetchApp.fetch(url, options);
  
  const members = JSON.parse(response).members;
  let arr = [];
  for (const member of members) {
    //削除済、botユーザー、Slackbotを除く
    if (!member.deleted && !member.is_bot && member.id !== "USLACKBOT") {
      // "表示名" もしくは "Slack名" を配列に格納
      let name = [member.profile.display_name || member.real_name]
      name[0] = '@' + name[0];
      arr.push(name);
    }
  }

  //スプレッドシートに書き込む
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheets()[0];
  const range = sheet.getRange(1, 1, arr.length);
  range.setValues(arr)
}

はい、以上です!
中身は気にせず、とりあえずメンション名を出力して招待したい人はここまでで大丈夫です。

ここからは、コードの重要な箇所を説明していきます。
興味がある人は是非!


SlackAPIの users.list を叩く

ここは実装方針の②SlackAPIの users.list を叩くに該当します。

  //  一つ前の章で作成した Bot User OAuth Token
  const slack_app_token = "xoxb-xxx...";
  
  const options = {
    "method" : "get",
    "contentType": "application/x-www-form-urlencoded",
    "payload" : { 
      "token": slack_app_token
    }
  };
  
  // users.list(GET): ワークスペースの全ユーザーを取得する 
  const url = "https://slack.com/api/users.list";
  const response = UrlFetchApp.fetch(url, options);

作成したトークンを payload に忍ばせ、 UrlFetchApp.fetch() でAPIを叩きにいきます。
他にも細かいオブションを設定することも可能なので、詳しくは公式docsを参照してみてください。

また、 url , options の中身を変えれば、他の SlackAPI も叩けるので、色々応用も利かせられます。

招待対象外のユーザーを弾く条件文を追加する

次は③「削除済ユーザー」などの招待対象外のユーザーを弾く条件文を追加するについての実装です。

  const members = JSON.parse(response).members;
  let arr = [];
  for (const member of members) {
    //削除済、botユーザー、Slackbotを除く
    if (!member.deleted && !member.is_bot && member.id !== "USLACKBOT") {
      // "表示名" もしくは "Slack名" を配列に格納
      let name = [member.profile.display_name || member.real_name]
      name[0] = '@' + name[0];
      arr.push(name);
    }
  }

for文で取得したユーザーを一つずつ取得し、招待対象外のユーザー以外を配列に追加する処理を書いています。
今回招待対象外としたユーザーは以下の3つです。

  • 削除済ユーザー
  • botユーザー
  • idがUSLACKBOTのユーザー

また、今回はチャンネルに招待することが目的なので、メンション名を出力する必要があります。
メンション名の仕組みは、基本的に@+表示名となりますが、表示名が設定されていない場合は@+Slack名となっているため、let name = ではor演算子を使用します。

member(user)のデータ構造については、公式docsの ExampleResponse を参照すれば、分かりやすいかと思います。

スプレッドシートに出力する

ここで最後です!
最後に↑でフィルターをかけたユーザーのメンション名をスプレッドシートに書き込みます。

  //スプレッドシートに書き込む
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheets()[0];
  const range = sheet.getRange(1, 1, arr.length);
  range.setValues(arr)

ここはシンプルですね。
arr.lengthで書き込むセルの行数を設定し、setValues() で出力します。

それ以外は特に工夫点などはないので、「そもそも getRange() , setValues() とは何だ?」という方はGASの公式docsを参照してみてください!

おわり

これにて解説は以上です!

SlackAPIやGAS関連は多くのシチュエーションで利用できると思うので、エンジニアの方も非エンジニアの方も是非一度触ってみてください!
意外と何でも効率化できるもんです(笑)

6
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?