参加しているSlackのチャンネルが増えてきたとき、一度チャンネルを一覧にして出力して整理したいことがあると思います。
スプレッドシートに出力すると、一覧になって見やすいですもんね。
そこでこのページでは、Slackで自分が参加しているチャンネルの一覧をスプレッドシートに出力するGASのコードを解説します。
コードをコピペして、ちょっと編集するだけで使えるものなので、ぜひ最後まで読んでみてください。
前提
このGASで取得できるのは、以下の2つのチャンネルのみです。
- パブリックチャンネル
- 自分が参加しているプライベートチャンネル
自分が参加していないプライベートチャンネルは、自分からは見えないので、取得できません。
GAS発動後のイメージ
このGASを使うと、以下のようなかたちで、チャンネル一覧が作れます。
各列の内容は以下のとおりです。
列 | 内容 |
---|---|
A | チャンネル名 |
B | チャンネルID |
C | パブリック or プライベート |
D | チェックボックス |
D列のチェックボックスは、集計するときや他のGASの処理などで自由に使ってください。
必要なもの
自分が参加しているSlackチャンネル一覧を取得するためには以下のものが必要です。
- 対象となるワークスペースに追加したSlack App
- Slack APIのUser Token
Slack Appの作り方とUser Tokenの取得方法は以下のページで解説しています。
上記ページのStep9にて、必用なScopeを求められます。チャンネル一覧を取得するためには、以下のScopeをすべて選択してください。
- channels:read
- groups:read
- im:read
- mpim:read
GASでSlackチャンネル一覧を出力する手順
スプレッドシートを用意する
スプレッドシートを新しく作ってください。
そして「チャンネル名取得」という名前のシートを作りましょう。
[拡張機能]→[App Script]をクリックする
スプレッドシートのメニューバーにある[拡張機能]→[Apps Script]をクリックし、スクリプトエディタを開きます。
▼以下のようなスクリプトエディタが開けばOKです。
ファイルを3つ用意する
コードを書くためのファイルを3つ用意します。
▼[コード.gs]の横にある点をクリックし[名前の変更]を選び「global」と入力します。
▼つぎに[+]をクリックし[スクリプト]を選びましょう。名前を入力できるようになるので「onOpen」と入力します。
再び[+]をクリックし[スクリプト]を選びましょう。名前を入力できるようになるので「チャンネル名取得」と入力します。
▼ファイル欄が以下のようになっていればOKです。
[global.gs]にコードをコピペする
以下のコードを[global.gs]にコピペします。
/**
* global定数
*/
const SLACK_API_USER_TOKEN = PropertiesService.getScriptProperties().getProperty('SLACK_API_USER_TOKEN');
const API_URL_CONVERSATIONS_LIST = 'https://slack.com/api/conversations.list';
const API_URL_USERS_LIST = 'https://slack.com/api/users.list';
const API_URL_CONVERSATIONS_INVITE = 'https://slack.com/api/conversations.invite';
const API_URL_CONVERSATIONS_MEMBERS = 'https://slack.com/api/conversations.members';
const CHANNEL_SHEET_HEADER = ['チャンネル名', 'チャンネルID', '種類', 'セレクト'];
const USER_SHEET_HEADER = ['表示名', 'ユーザーID', '種別', 'セレクト'];
Slack APIのUser Tokenはスクリプトプロパティから取得するので、のちほどスクリプトプロパティを設定します。
[onOpen.gs]にコードをコピペする
以下のコードを[onOpen.gs]にコピペします。
/**
* メニューバーに機能を追加する
*/
function onOpen(){
let ui = SpreadsheetApp.getUi();
ui.createMenu('GASメニュー')
// .addSubMenu(SpreadsheetApp.getUi().createMenu('チャンネル作成')
.addItem('チャンネル名取得', 'exportSlackChannelsToSheet')
.addToUi();
}
[チャンネル名取得.gs]にコードをコピペする
以下のコードを[チャンネル名取得.gs]にコピペします。
/*
Bot Token:アプリが追加されているプライベートチャンネルのみ取得できる。
User Token:GAS実行ユーザーが入っているプライベートチャンネルのみ取得できる。
*/
/**
* メイン関数
*/
function exportSlackChannelsToSheet() {
// パブリックとプライベートのチャンネルを取得する
const slackChannels = fetchAllSlackChannels_(['public_channel', 'private_channel']);
// 取得したチャンネルをシートに出力する
writeChannelsToSheet_(slackChannels);
}
/**
* すべてのチャンネルを取得する
* @param {Array} channelTypes - 取得するチャンネルの種類の配列
* @return {Array} すべてのチャンネル情報の配列
*/
function fetchAllSlackChannels_(channelTypes) {
// チャンネルを格納するための空の配列を用意する
let allChannels = [];
// チャンネルタイプごとにチャンネルを取得する
channelTypes.forEach(type => {
allChannels = allChannels.concat(fetchSlackChannels_(type));
});
// 取得したチャンネルを返す
return allChannels;
}
/**
* 指定した種類のチャンネルを取得する
* @param {string} channelType - 取得するチャンネルの種類(public_channelまたはprivate_channel)
* @return {Array} チャンネル情報の配列
*/
function fetchSlackChannels_(channelType) {
let allChannels = []; // 取得した全チャンネル情報を格納する配列
let cursor = ''; // 次のページを示すカーソル
// ページネーションを考慮してチャンネル情報を取得
do {
const response = fetchChannelsByType_(channelType, cursor); // 現在のカーソルを使ってチャンネル情報を取得
allChannels = allChannels.concat(response.channels); // 取得したチャンネル情報をすべてのチャンネル配列に追加
cursor = response.nextCursor; // 次のページのカーソルを更新
} while (cursor); // カーソルが存在する限りループを継続
return allChannels; // すべてのチャンネル情報を返す
}
/**
* Slack APIを呼び出してチャンネル情報を取得する
* @param {string} channelType - 取得するチャンネルの種類
* @param {string} cursor - 次のページのカーソル
* @return {Object} チャンネル情報のオブジェクト(channels: チャンネル情報の配列, nextCursor: 次のページのカーソル)
*/
function fetchChannelsByType_(channelType, cursor) {
// APIリクエストのURLを作成
let url = `${API_URL_CONVERSATIONS_LIST}?exclude_archived=true&types=${channelType}`;
if (cursor) {
url += `&cursor=${cursor}`;
}
// APIリクエストのパラメータを設定
const params = {
method: 'get',
headers: {
'Authorization': `Bearer ${SLACK_API_USER_TOKEN}`
},
muteHttpExceptions: true
};
try {
// APIリクエストを送信
const response = UrlFetchApp.fetch(url, params);
const jsonResponse = JSON.parse(response.getContentText());
// リクエストが成功しなかった場合にエラーを投げる
if (!jsonResponse.ok) {
throw new Error('Failed to fetch Slack channels: ' + jsonResponse.error);
}
// 次のページのカーソルを取得
const nextCursor = jsonResponse.response_metadata ? jsonResponse.response_metadata.next_cursor : '';
// チャンネル情報と次のページのカーソルを返す
return {
channels: jsonResponse.channels,
nextCursor: nextCursor
};
} catch (error) {
// エラーが発生した場合にログを記録し、空の結果を返す
Logger.log('Error fetching Slack channels: ' + error.message);
return {
channels: [],
nextCursor: ''
};
}
}
/**
* チャンネル情報をスプレッドシートに書き込む
* @param {Array} channels - チャンネル情報の配列
*/
function writeChannelsToSheet_(channels) {
// アクティブなスプレッドシートの「チャンネル名取得」シートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('チャンネル名取得');
// シートをクリア
sheet.clear();
// 既存のフィルターを解除
if (sheet.getFilter()) {
sheet.getFilter().remove();
}
// ヘッダーとデータを含む配列を作成
const data = [CHANNEL_SHEET_HEADER].concat(channels.map(channel => [
channel.name, // チャンネル名
channel.id, // チャンネルID
channel.is_private ? 'Private' : 'Public', // チャンネルのタイプ(パブリックかプライベートか)
'' // チェックボックス列(この要素は一見削除してもよさそうだが、HEADERの要素が4つあるので、残しておく必要がある)
]));
// データを書き込む
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
// チェックボックスを設定
const checkBoxRange = sheet.getRange(2, 4, channels.length);
checkBoxRange.insertCheckboxes();
// フィルターを設定
const range = sheet.getRange(1, 1, data.length, data[0].length);
range.createFilter();
}
スクリプトプロパティを設定する
Slack APIのUser Tokenをスクリプトプロパティに設定します。
今回のKeyは「SLACK_API_USER_TOKEN」です。
スクリプトプロパティの設定方法は、以下のページを参考にしてみてください。
案外、かんたんですよ!
[チャンネル名取得.gs]を開いた状態で[実行]をクリックする
[チャンネル名取得.gs]を開いた状態で[実行]をクリックしましょう。
以下のような認証画面が出てきます。
以下のページを参考にして認証を進めていってください。
もう一度[実行]をクリックする
認証が終わったら、もう一度[チャンネル名取得.gs]を開いた状態で[実行]をクリックしましょう。
そうすれば、スプレッドシートにチャンネル一覧が表示されるはずです。
さいごに
このGASを使えば、Slack内の自分が参加しているチャンネル一覧を取得できます。
どのチャンネルから抜けるかを考える材料にするのもいいですし、他のGASと組み合わせて使うのも便利だと思いますよ。
たとえば、自分の参加しているチャンネルに他のメンバーを招待することも可能です。
コメント