Skip to content

Instantly share code, notes, and snippets.

@tatsumin39
Last active May 3, 2021 04:41
Show Gist options
  • Save tatsumin39/6bdbf58ab4e8a153793622c04a5cdca4 to your computer and use it in GitHub Desktop.
Save tatsumin39/6bdbf58ab4e8a153793622c04a5cdca4 to your computer and use it in GitHub Desktop.
Slack APIとGASを利用して特定チャンネルのユーザーを抽出する

Slack APIとGASを利用して特定チャンネルのユーザーを抽出する

事前準備

SlackAPIの設定

Slack Appを作成

以下のOAuth & Permissionsを有効しBot Tokenを取得します。

取得したBot TokenはGASのYour_Slack_Bot_User_OAuth_Token部分に置き換えてください。

  • user:read
  • user:read.email
  • channels:read

Googleスプレッドシートの準備

シート名:List

以下のように取得したいチャンネルのチャンネルIDとチャンネル名を記載します。

チャンネルIDはワークスペース管理画面のチャンネル管理から一覧をCSVエクスポートして取得しておきます。

チャンネルID チャンネル名
Cxxxx1 チャンネルa
Cxxxx2 チャンネルb

下記の2つのシートはGASを実行するたびに見出し行含めて書き換えられるため空白で問題ありません。

シート名:User

シート名:Channel

GASを実行

GASを実行するとWS全体のユーザー情報がシート名:Userに出力されます。

出力例は下記のようになります。※先頭4列のみ

ID 削除済み 氏名 メールアドレス
Uxxxx1 FALSE aaa aaa@xxx.com
Uxxxx2 FALSE bbb bbb@xxx.com
Uxxxx3 FALSE ccc ccc@xxx.com

次にシート名:ListのチャンネルIDを読み込み、チャンネルに所属しているユーザーIDをシート名:Channelに出力します。

出力例は下記のようになります。

チャンネルID チャンネル名 ユーザーID
Cxxxx1 チャンネルa Uxxxx1
Cxxxx1 チャンネルa Uxxxx2
Cxxxx1 チャンネルa Uxxxx3
Cxxxx1 チャンネルa Uxxxx4
Cxxxx2 チャンネルb Uxxxx2
Cxxxx2 チャンネルb Uxxxx8

チャンネル情報を取得するAPI channels:readではユーザーIDのみ抽出されます。

シート名:Channel記載の情報と組み合わせることで、氏名やメールアドレスなどの情報を補完します。

/*
必要なスコープ
user:read
user:read.email
channels:read
*/
function SlackFunction() {
getSlackUser();
getList();
}
//WS全体のSlackユーザー一覧を取得する。
function getSlackUser(cursor) {
const slack_app_token = "Your_Slack_Bot_User_OAuth_Token";
const limit =100;
const options = {
"method" : "get",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": slack_app_token,
"cursor": cursor,
"limit":limit
}
};
const url = "https://slack.com/api/users.list";
const response = UrlFetchApp.fetch(url, options);
const members = JSON.parse(response).members;
let activeArr = [];
let inActiveArr = [];
for (var member of members) {
let deleted = member.deleted;
let id = member.id;
let real_name = member.profile.real_name; //氏名
let mail = member.profile.email ; //メールアドレス
let name = member.name; //mei
let is_primary_owner = member.is_primary_owner; //プライマリオーナー
let is_owner = member.is_owner; //オーナー
let is_admin = member.is_admin; //管理者アカウント
let is_restricted = member.is_restricted; //Trueならばゲスト
let is_ultra_restricted = member.is_ultra_restricted; //true ならばシングルゲストチャンネル,Falseかつis_restrictedがTrueならばマルチチャンネルゲスト
let is_bot = member.is_bot; //botユーザー
let is_app_user = member.is_app_user; // アプリユーザー
let is_invited_user = member.is_invited_user;// 招待中
let guest_invited_by = member.guest_invited_by ; //アカウント有効期限
if (!member.deleted) {
activeArr.push([ id, deleted,real_name, mail, name, is_primary_owner, is_owner, is_admin , is_restricted, is_ultra_restricted, is_bot, is_app_user, is_invited_user,guest_invited_by]);
}
if (member.deleted) {
inActiveArr.push([ id, deleted,real_name, mail, name, is_primary_owner, is_owner, is_admin , is_restricted, is_ultra_restricted, is_bot, is_app_user, is_invited_user,guest_invited_by]);
}
}
//スプレッドシートに書き込み
const User_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('User');
if( cursor ==null){
User_sheet.clear();
User_sheet.appendRow(['ID','削除済','氏名','メールアドレス','ユーザー名','プライマリオーナー','オーナー','管理者アカウント','ゲストアカウント','シングルorマルチ','botユーザー','アプリユーザー','招待中','アカウント有効期限']);
}
try{
User_sheet.getRange( User_sheet.getLastRow()+1,1, activeArr.length, activeArr[0].length).setValues(activeArr);
User_sheet.getRange( User_sheet.getLastRow()+1,1, inActiveArr.length, inActiveArr[0].length).setValues(inActiveArr);
}
catch(e){
}
if( responseMeta = JSON.parse(response).response_metadata.next_cursor != ''){
getSlackUser(JSON.parse(response).response_metadata.next_cursor);
}
}
//シート名「List」から対象チャンネル情報を取得する
function getList(){
//シート名「channel」の初期化作業
const channel_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('channel');
channel_sheet.clear();
channel_sheet.appendRow(['チャンネルID', 'チャンネル名', 'ユーザーID',]);
const List_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('List');
const lastRow = List_sheet.getLastRow();
var values = List_sheet.getRange(1, 1, lastRow, 2).getValues();
for (var l = 1; l <= values.length; l++) {
var channel_ID = values[l-1][0];
var channel_Name = values[l-1][1];
//チャンネル情報を渡して、getChUserを実行
getChUser(channel_ID,channel_Name)
}
}
//特定のチャンネルのユーザーを取得する
function getChUser(channel_ID,channel_Name,cursor) {
const slack_app_token = "Your_Slack_Bot_User_OAuth_Token";
const limit =100;
//チャンネルのユーザー取得
const options = {
"method" : "get",
"contentType": "application/x-www-form-urlencoded",
"payload" : {
"token": slack_app_token,
"cursor": cursor,
"limit":limit,
"channel":channel_ID
}
};
const url = "https://slack.com/api/conversations.members";
const response = UrlFetchApp.fetch(url, options);
const members = JSON.parse(response).members;
let Arr = [];
for (const member of members) {
let id = member;
Arr.push([ channel_ID, channel_Name, id ]);
}
//スプレッドシートに書き込み
const channel_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('channel');
if( cursor ==null){
}
try{
channel_sheet.getRange( channel_sheet.getLastRow()+1,1, Arr.length, Arr[0].length).setValues(Arr);
}
catch(e){
}
if( responseMeta = JSON.parse(response).response_metadata.next_cursor != ''){
getChUser(channel_ID,channel_Name,JSON.parse(response).response_metadata.next_cursor);
}
//}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment