⚙️

Slack API (chat.postMessage) を用いてDMを一斉送信する

2021/02/27に公開

何でそんなことしようと思ったの?

インターン先でメールの一斉送信をかなりの頻度で行っているんですが、設定がめちゃくちゃしんどいんですよね。しかも全てのユーザーがSlackにいるんです。じゃあもうSlackに一本化しようよ、メールなんてレガシーなツール使うのはもうやめようよってのがきっかけです。

何でDMなの?

はい、そうですよね。DM嫌いなんです、自分。DMが来ると「同じ内容オープンチャンネルでもう一度投稿してもらっていいですか?」って言うほどの過激派なんですが、今回は内容が特定のユーザー群(しかも組み合わせが毎回変わる)にしか見えてはいけない内容なので、泣く泣くDMを使うことにしました。

結論

「説明は良いからコード見せろ」な方もいると思うので、先に載せちゃいます。詳しい説明(といっても大したことないけれど)は後からするアメリカンスタイルです。USA! USA!!

const APIToken = "xoxb-*****"; // 自分でSlack Appを作成し、発行されたtokenに差し替えてください
const sheetUrl = "https://docs.google.com/spreadsheets/d/*****/edit"; // Slack IDが記載された スプレッドシートのURLに差し替えてください
const sheetName = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName('シート1'); // 使用するシート名に差し替えてください
const infoCol = {
  "SlackID": "B", // DMを送る相手のIDが記載された列
  "content1": "C", // 送る内容が記載された列
  "content2": "D",
  "content3": "E"
}

function main() {
  const rowBegin = 2; // シートに合わせて変更してください
  const rowEnd = 30; // シートに合わせて変更してください
  const APIMethodUrl = "https://slack.com/api/chat.postMessage";

  if (isGoodTime() == false) {
    Logger.log("深夜なので実行しませんでした。");
  } else {
    postMessage(rowBegin, rowEnd, APIMethodUrl);
  }
}

function isGoodTime() {
  const goodTimeBegin = 8;
  const goodTimeEnd = 22;
  const date = new Date();
  const time = date.getHours();

  return (time >= goodTimeBegin && time <= goodTimeEnd) ? true : false;
}

function getUserID(row) {
  let userID = sheetName.getRange(infoCol.SlackID + row).getValue();

  return userID;
}

function createMessage(row) {
  let msgContent1 = sheetName.getRange(infoCol.content1 + row).getValue();
  let msgContent2 = sheetName.getRange(infoCol.content2 + row).getValue();
  let message = ("content1: " + msgContent1 + "\ncontent2: " + content2 + "\ncontent3: " + content3);

  return message;
}

function postMessage(rowBegin, rowEnd, APIMethodUrl) {
  for (let row = rowBegin; row < rowEnd; row++) {
    let userID = getUserID(row);

    if (userID == "")
      continue;
    
    let payload = {
      "token": APIToken,
      "channel": userID,
      "text": createMessage(row)
    };
    
    let params = {
      "method" : "post",
      "payload" : payload
    };
    
    UrlFetchApp.fetch(APIMethodUrl, params);
  }
}

解説

Slack APIを使ってAppを作成する手順(ざっくり)

  1. Slack Appを新しく作成する
  2. スプレッドシートで送信先のSlack IDと送信する内容のDB(?)を作成する
  3. 👆のコードをベースに色々書き換える
より詳しい手順を知りたい方は

各関数について

main()

JavaScriptをよくご存知の方は「いや、main()あるぞ…?」と混乱されたことでしょう。わかります、その気持ち。でも、普段Cばかり触ってる身としてはmain()がないと落ち着かないんです。許してください。それに、main()を見れば全体の概要がつかめますしね。
main()の役割は以下です。

  1. isGoodTime()に投稿可能時間(8~22時)か確認させる
  2. OKだったら、postMessage()に投稿させる
    シンプルですね。そもそもisGoodTime()は非常識な時間のDM通知を防ぐためのものなので、不要な人は丸ごと取っ払ってください。

isGoodTime()

これは関数名の通りです。現在時刻が設定した"good time"の範囲に収まっているかどうか判定するだけです。

postMessage()

これがプログラムの肝となる関数です。担う機能は関数名の通りですね。細かい説明を書くのは面倒になってしまったので、何となく察してください。

変数についてもっと詳しく

rowBegin, rowEnd

スプレッドシートのDBが何行目から何行目まで記載されているか?をmain()で定義して渡しています。これはシートによって異なると思うので、適宜変更してください。自分は以下のようなシートなので、rowBegin = 2としています。

APIMethodUrl

ここにはhttps://slack.com/api/chat.postMessageが入っています。Slack APIに載っているので、他のメソッドも漁ってみると楽しいですよ。

まとめ

「え、もうまとめ?」の声が聞こえてきますね。いや、説明不足なところが多いのはわかっています。Zennはエディタが楽しいのでつい出来心で書き始めるんですが、毎回エネルギー不足で書き切れないんですよね。「こいつZennのエディタ使いたかっただけなんだな」とおおらかな気持ちで受け入れてください。詳細については気が乗ったら追記しますが、多分しません。ご容赦ください。

Discussion