見出し画像

[GAS][Slack]定型的な投稿にBotを用いる(その3)

前2回、「GASで『定型的な文章』をSlack botに投稿」という記事を書きました。

別のパターンを構築してみます。

各チャンネルごとにメッセージを設定し一斉に投稿する

チャンネルごとに少しだけメッセージ内容を変更し投稿したいケースはよくあります。
以下のスプレッドシートを用意します。

送信したいチャンネルにチェックを入れ、列Cに投稿メッセージを入力します。

スクリプトはこちら。

function slackBot_03() {

  const ss      = SpreadsheetApp.getActiveSpreadsheet();
  const sheet   = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();

  const channelArray = ss.getSheetByName('channelリスト').getDataRange().getValues();

  for (let i = 2; i <= lastRow; i++) {
    const isSend = sheet.getRange(i, 1).getValue();
    if (isSend) {
      const channelName = sheet.getRange(i, 2).getValue();
      const channel     = findValue(channelArray, channelName);
      const message     = sheet.getRange(i, 3).getValue();
      postMessage(channel, message);
    }
  }
}

function postMessage(channel, message) {

  const token = PropertiesService.getScriptProperties().getProperty('SlackBot_token');

  const options = {
    "method": "post",
    "contentType": "application/x-www-form-urlencoded",
    "payload": {
      "token": token,
      "channel": channel,
      "text": message
    }
  };

  const url = 'https://slack.com/api/chat.postMessage';
  UrlFetchApp.fetch(url, options);

}

function findValue(values, key) {

  for (const i in values) {
    if (values[i][0] === key) {
      return values[i][1];
    }
  }
  return;
}

※列Aのチェックボックスをオン/オフにするのが煩わしい場合は以下のようなパターンでも良いかと思います。
この場合、「列Bが空白でないと投稿する」という設計にしているのでその点注意しましょう。

スクリプトはこちら。(function postMessage以下は共通)

function slackBot_04_2() {

  const ss    = SpreadsheetApp.getActiveSpreadsheet();
  const sheet  = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();

  const channelArray = ss.getSheetByName('channelリスト').getDataRange().getValues();

  for (let i = 2; i <= lastRow; i++) {

    const message = sheet.getRange(i, 2).getValue();
    if (message !== "") {
      const channelName = sheet.getRange(i, 1).getValue();
      const channel   = findValue(channelArray, channelName);
      postMessage(channel, message);
    }
  }
}

function postMessage(channel, message) {

  const token = PropertiesService.getScriptProperties().getProperty('SlackBot_token');

  const options = {
    "method": "post",
    "contentType": "application/x-www-form-urlencoded",
    "payload": {
      "token": token,
      "channel": channel,
      "text": message
    }
  };

  const url = 'https://slack.com/api/chat.postMessage';
  UrlFetchApp.fetch(url, options);

}

function findValue(values, key) {

  for (const i in values) {
    if (values[i][0] === key) {
      return values[i][1];
    }
  }
  return;
}

チャンネル数が多い場合はプルダウンで

チャンネル数が多い場合はプルダウンで実装するのも良いかと思います。

スクリプトはこちら。(function postMessage以下は共通)

function slackBot_04_3() {

  const ss      = SpreadsheetApp.getActiveSpreadsheet();
  const sheet   = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();

  const channelArray = ss.getSheetByName('channelリスト').getDataRange().getValues();

  for (let i = 2; i <= lastRow; i++) {

    const channelName = sheet.getRange(i, 1).getValue();
    const channel     = findValue(channelArray, channelName);
    const message     = sheet.getRange(i, 2).getValue();
    postMessage(channel, message);
  }
}

function postMessage(channel, message) {

  const token = PropertiesService.getScriptProperties().getProperty('SlackBot_token');

  const options = {
    "method": "post",
    "contentType": "application/x-www-form-urlencoded",
    "payload": {
      "token": token,
      "channel": channel,
      "text": message
    }
  };

  const url = 'https://slack.com/api/chat.postMessage';
  UrlFetchApp.fetch(url, options);

}

function findValue(values, key) {

  for (const i in values) {
    if (values[i][0] === key) {
      return values[i][1];
    }
  }
  return;
}

この記事が気に入ったらサポートをしてみませんか?