見出し画像

【GAS】Google Apps Script 活用事例 Slackで新しく作成したチャンネルに一括招待したいときに使えるスクリプト

新しく作成したチャンネルに200 ~ 300人くらい一括で招待したいと思うシーンがあり実装しました。

特定のチャンネルに所属しているメンバーをシートに書き出すスクリプト

function getSlackChannelMembers() {
  const slackToken = "xoxp-********************************************";  // 取得したSlack APIトークン
  const channelId  = "*********";  // メンバーを取得したいチャンネルのID
  const url = "https://slack.com/api/conversations.members?channel=" + channelId + "&limit=350"; // デフォルトだと100人までしか取得できない Maxが確か1,000
  const options = {
    "method": "get",
    "headers": {
      "Authorization": "Bearer " + slackToken
    }
  };
  const response = UrlFetchApp.fetch(url, options);
  const json = JSON.parse(response.getContentText());

  let invitesList = []

  if (json.ok) {
    const members = json.members;

    members.forEach(member => invitesList.push([member]));
    console.log(invitesList); //一覧を取得

  } else {
    console.log("メンバー一覧の取得に失敗しました");
    console.log(json);
  }
  const newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('members');
  newSheet.getRange(1, 1, invitesList.length, invitesList[0].length).setValues(invitesList);
  newSheet.activate();
}

スプレッドシートに記載されたIDを元に一括で招待

Slackでの一括招待をするときのポイントは、ID一覧に、チャンネル招待済みの人がいるとエラーになってしまう点です。そこでfilterメソッドを使って省いています。


const slackToken = "xoxp-**********************";
const channelId = getSlackChannelId_();

function invitesAllMembers() {
  const existingMembers = getSlackChannelMembers_(); // 招待済みのメンバーを取得
  const newMembers      = getTargetMemberIds_(); // 招待したいメンバー
  const filteredMembers = newMembers.filter(member => !existingMembers.includes(member));

  console.log(filteredMembers);
  console.log(`招待済みのメンバーを排除した後の人数:${filteredMembers.length}`);
  
  // カンマ区切りの文字列として招待したいメンバー一覧をAPIに渡す
  const converted = filteredMembers.join(',');
  console.log(converted);

  const url = 'https://slack.com/api/conversations.invite';
  const options = {
    "method": "post",
    "headers": {
      "Authorization": "Bearer " + slackToken,
      "Content-Type": "application/json"
    },
    "payload": JSON.stringify({
      "channel": channelId,  // チャンネルIDを指定
      "users": converted  // ユーザーIDのリストを指定
    })
  };
  const response = UrlFetchApp.fetch(url, options);
  console.log(`responseCode: ${response.getResponseCode()}`);
  console.log(response.getContentText());
}


/**
 * 新規チャンネルを作った際に、チャンネルの作成者などを取得する
 * 招待するメンバー一覧から外すために取得が必要
 * 
 */
function getSlackChannelMembers_() {
  const url = "https://slack.com/api/conversations.members?channel=" + channelId + "&limit=1000";
  const options = {
    "method": "get",
    "headers": {
      "Authorization": "Bearer " + slackToken
    }
  };
  const response = UrlFetchApp.fetch(url, options);
  const json = JSON.parse(response.getContentText());
  let invitesList = []
  if (json.ok) {
    const members = json.members;
    members.forEach(member => invitesList.push(member));

    console.log(`${channelId}に招待済みのメンバー一覧`)
    console.log(invitesList); //一覧を取得

  } else {
    console.log("メンバー一覧の取得に失敗しました");
    console.log(json);
  }

  return invitesList

}



/**
 * URLからChannelIdを取得する
 * 
 * 
 */
function getSlackChannelId_(){
  const channelUrl = nepia_infinity.showPrompt('メンバーを招待したいチャンネルのURLを入力', '(例) https://******.slack.com/archives/******');
  const channelId  = channelUrl.replace('https://******.slack.com/archives/', '');
  console.log(`channelId: ${channelId}`);
  return channelId
}



/**
 * 招待したいメンバー一覧をシートから読み取る
 * 
 * 
 */
function getTargetMemberIds_(){
  const sheet  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('招待したいメンバーID一覧');
  const values = sheet.getDataRange().getValues();
  values.shift();

  console.log(`チャンネルに新規で招待したいメンバーの人数:${values.length}`);

  // 2次元配列を1次元配列に変換する
  const converted = values.flat();
  console.log(converted);

  return converted

}



いいなと思ったら応援しよう!