Slack×GAS:スラッシュコマンドでチャンネルを作成する①

公開:2021/01/16
更新:2021/01/18
2 min読了の目安(約2600字TECH技術記事

概要

チャンネルをスラッシュコマンドからコマンド一発で作成したい人生だった

<流れ>

  1. スラッシュコマンドを実行
  2. GAS:スラッシュコマンド応答
  3. GAS:チャンネル作成用GASを起動
  4. GAS:メンバー追加用GASを起動
  5. Slackに返す

内容

解説とかは後日書きます。
今日はソースコードだけ記載。
どうせソースコードだけ欲しいって人がほとんどやろ

スラッシュコマンド受付用メイン関数

function doPost(e) {
  var verificationToken = e.parameter.token;
  if (verificationToken != 'xxxxxxxxxxx') { // AppのVerification Tokenを入れる
    throw new Error('Invalid token');
  }
  var text = e.parameter.text;
  var userId = e.parameter.user_id;
  try {
    var addCh = createChannels(text)
    var addRes = addUserToChannels(userId, addCh);
    if (addRes != false) {
      var response = {
        text: text + 'チャンネルを作成しました:https://YourSlackDomain.slack.com/archives/' + addCh
      };
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    }
    const resultFail1 = '作成できませんでした'
    var response = {
      text: text + 'chを作成できませんでした'
    };
    return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    const resultFail2 = '作成できませんでした:' + error;
    var response = {
      text: resultFail2
    };
    return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    Logger.log(e);
  }
}

チャンネル作成用関数

function createChannels(chName) {
    const slack_app_token = "xoxb-xxxxxxxxxxx"; //Token
    const options = {
      "method": "POST",
      "contentType": "application/x-www-form-urlencoded",
      "payload": {
        "token": slack_app_token,
        "name": chName,
        "is_private": false
      }
    };
    const url = "https://slack.com/api/conversations.create";
    try {
      const response = UrlFetchApp.fetch(url, options);
      const resText = JSON.parse(response).channel;
      const chId = resText.id;
      if (JSON.parse(response).ok) {
        return chId;
      }
      return false;
    } catch (e) {
      return e;
    }
  }

チャンネルへユーザーを追加する関数

function addUserToChannels(userId, chId) {
  const slack_app_token = "xoxb-xxxxxxxxxxx"; //Token
  const options = {
    "method": "POST",
    "contentType": "application/x-www-form-urlencoded",
    "payload": {
      "token": slack_app_token,
      "channel": chId,
      "users": userId
    }
  };
  const url = "https://slack.com/api/conversations.invite";
  try {
    const response = UrlFetchApp.fetch(url, options);
    const resText = JSON.parse(response).channel;
    const chId = resText.id;
    if (JSON.parse(response).ok) {
      return true;
    }
    return false;
  } catch (e) {
    return e;
  }
}