GASの依頼を受付中 詳細

【GAS】Slackで自分が参加しているチャンネル一覧を取得する

GASで自分が参加しているSlackチャンネル一覧を取得する記事のアイキャッチ画像

参加しているSlackのチャンネルが増えてきたとき、一度チャンネルを一覧にして出力して整理したいことがあると思います。

スプレッドシートに出力すると、一覧になって見やすいですもんね。

そこでこのページでは、Slackで自分が参加しているチャンネルの一覧をスプレッドシートに出力するGASのコードを解説します。

コードをコピペして、ちょっと編集するだけで使えるものなので、ぜひ最後まで読んでみてください。

目次

前提

このGASで取得できるのは、以下の2つのチャンネルのみです。

  • パブリックチャンネル
  • 自分が参加しているプライベートチャンネル

自分が参加していないプライベートチャンネルは、自分からは見えないので、取得できません。

GAS発動後のイメージ

この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チャンネル一覧を出力する手順

STEP

スプレッドシートを用意する

スプレッドシートを新しく作ってください。
そして「チャンネル名取得」という名前のシートを作りましょう。

GASで自分の参加しているチャンネル一覧をスプレッドシートに出力する手順
STEP

[拡張機能]→[App Script]をクリックする

スプレッドシートのメニューバーにある[拡張機能]→[Apps Script]をクリックし、スクリプトエディタを開きます。

GASで自分の参加しているチャンネル一覧をスプレッドシートに出力する手順2

▼以下のようなスクリプトエディタが開けばOKです。

GASで自分の参加しているチャンネル一覧をスプレッドシートに出力する手順3
STEP

ファイルを3つ用意する

コードを書くためのファイルを3つ用意します。

▼[コード.gs]の横にある点をクリックし[名前の変更]を選び「global」と入力します。

GASで自分の参加しているチャンネル一覧をスプレッドシートに出力する手順4

▼つぎに[+]をクリックし[スクリプト]を選びましょう。名前を入力できるようになるので「onOpen」と入力します。

GASで自分の参加しているチャンネル一覧をスプレッドシートに出力する手順5

再び[+]をクリックし[スクリプト]を選びましょう。名前を入力できるようになるので「チャンネル名取得」と入力します。

▼ファイル欄が以下のようになっていればOKです。

GASで自分の参加しているチャンネル一覧をスプレッドシートに出力する手順6
STEP

[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はスクリプトプロパティから取得するので、のちほどスクリプトプロパティを設定します。

STEP

[onOpen.gs]にコードをコピペする

以下のコードを[onOpen.gs]にコピペします。

/**
 * メニューバーに機能を追加する
 */
function onOpen(){
  let ui = SpreadsheetApp.getUi();
  ui.createMenu('GASメニュー')
    // .addSubMenu(SpreadsheetApp.getUi().createMenu('チャンネル作成')
    .addItem('チャンネル名取得', 'exportSlackChannelsToSheet')
  .addToUi();
}
STEP

[チャンネル名取得.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();
}
STEP

スクリプトプロパティを設定する

Slack APIのUser Tokenをスクリプトプロパティに設定します。

今回のKeyは「SLACK_API_USER_TOKEN」です。

スクリプトプロパティの設定方法は、以下のページを参考にしてみてください。

案外、かんたんですよ!

STEP

[チャンネル名取得.gs]を開いた状態で[実行]をクリックする

[チャンネル名取得.gs]を開いた状態で[実行]をクリックしましょう。

GASで自分の参加しているチャンネル一覧をスプレッドシートに出力する手順7

以下のような認証画面が出てきます。

GASの実行を承認するための画面1

以下のページを参考にして認証を進めていってください。

STEP

もう一度[実行]をクリックする

認証が終わったら、もう一度[チャンネル名取得.gs]を開いた状態で[実行]をクリックしましょう。

そうすれば、スプレッドシートにチャンネル一覧が表示されるはずです。

さいごに

このGASを使えば、Slack内の自分が参加しているチャンネル一覧を取得できます。

どのチャンネルから抜けるかを考える材料にするのもいいですし、他のGASと組み合わせて使うのも便利だと思いますよ。

たとえば、自分の参加しているチャンネルに他のメンバーを招待することも可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

GASやVBAを使って、スプレッドシートやExcel作業を自動化しています。自分のつくったプログラムが、誰かの時間を節約できたらうれしいです。また、SEOライターとして、節約メディアや視覚障害メディアで執筆しています。広島県広島市在住。

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

CAPTCHA

目次