Slack API (chat.postMessage) を用いてDMを一斉送信する
何でそんなことしようと思ったの?
インターン先でメールの一斉送信をかなりの頻度で行っているんですが、設定がめちゃくちゃしんどいんですよね。しかも全てのユーザーが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を作成する手順(ざっくり)
- Slack Appを新しく作成する
- スプレッドシートで送信先のSlack IDと送信する内容のDB(?)を作成する
- 👆のコードをベースに色々書き換える
各関数について
main()
JavaScriptをよくご存知の方は「いや、main()
あるぞ…?」と混乱されたことでしょう。わかります、その気持ち。でも、普段Cばかり触ってる身としてはmain()
がないと落ち着かないんです。許してください。それに、main()
を見れば全体の概要がつかめますしね。
main()
の役割は以下です。
-
isGoodTime()
に投稿可能時間(8~22時)か確認させる - 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