[GAS][Slack]定期的に投稿するBotを作成
私が所属しているコミュニティのSlackでは、毎日定期的にSlack Botが稼働しています。
実に様々なBotがあります。
コミュニティ内の様々なTipsを投稿したり、
「今日の名言」と題して名言を投稿したり、
「今日の成果を発表してください」と促すbotがあったり。
Bot投稿のノウハウを習得したく、調べながらまとめました。
Slackの設定は以下の記事を参考にさせていただきました。
ありがとうございました。
以下の手順で実装/確認します。
1_スプレッドシートの用意
今回は、GASを用い1日1回決められた時間帯にメッセージをSlackに投稿する...という機能を実装します。
以下のスプレッドシートを用意します。
列BにはSlackに送るメッセージ、列Cには送信済を判定する「isSent」(初期値は空欄)を用意しておきます。
2-1_Slackアプリの新規作成
Slackの設定は以下の記事を参考にさせていただきました。
ありがとうございました。
以下のURLからSlackアプリを新規作成します。
右上[Create New App]をクリックすると「Create an app」というダイアログが表示されるので、[From scratch]を選択します。
次のダイアログでApp名を入力し、workspaceをプルダウンより選択します。
2-2_Slackアプリの設定
左にある[OAuth & Permissons]をクリックし、「Scopes」にある[Add an OAuth Scope]をクリックした後、「chat:write」「chat:write.public」「chat:write.customize」の3つを選択します。
続けて、左にある[App Home]より「App Display」の[Edit]をクリックし、ボット名とデフォルトのユーザー名を入力します。
↑↑↑上部に「App display name saved!」が表示され、これで設定は完了です。
2-3_Slackアプリのインストール
最後に新規作成したSlackアプリをワークスペースにインストールします。
左の[Install App]より[Install to Workspace]をクリック、次のダイアログで[許可する]をクリックします。
ここで表示されるトークンをコピーし、GASのプロパティストアに格納しておきます。
2_GASのスクリプト
スクリプトはこちら。
function slackBot_01() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
for (let i = 2; i <= lastRow; i++) {
const isSent = sheet.getRange(i, 3).getValue();
if (isSent == "") {
const message = sheet.getRange(i, 2).getValue();
postMessage(message);
sheet.getRange(i, 3).setValue(true);
if (i >= lastRow) {
sheet.getRange(2, 3, lastRow - 1).clearContent();
}
break;
}
}
}
function postMessage(message) {
const token = PropertiesService.getScriptProperties().getProperty('SlackBot_token');
const channel = "#general";
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);
}
2つのfunctionではそれぞれ以下の処理を実行します。
【function slackBot_01】
・2行目以降より上から順に、列C「isSent」が空白の行を探す
・列3=空白の行があったら列Bのメッセージを変数(message)に格納
・function postMessageを実行
・最終行に到達した場合は列C「isSent」をすべてクリア
【function postMessage】
・トークンをプロパティストアより取得
・投稿するチャンネルを「#general」に設定
・function slackBot_01から受け取った変数messageをSlackに投稿
3_GAS実行
GASを実行すると指定したチャンネルにメッセージが投稿されます。
スプレッドシートを確認すると、列Cには投稿後に「TRUE」が記録され、
次回実行時には次の行のメッセージを投稿する仕組みになっています。
最終行を投稿後は列CのTRUEをすべてクリアし、最初の行から投稿が始まります。
「function SlackBot_01」に1日1回のトリガーを設定すると、毎日決められた時間帯に自動的に投稿することが出来ます。
※Bot作成についてはこちらの記事を参考にさせていただきました。
ありがとうございました。
※権限によっては投稿したメッセージが削除できない場合があります。Botのtokenを用いて削除する方法はこちら。
※類似記事を書きました。
※2022年9月に技術同人誌「会社員がVLOOKUPの次に覚えるQUERY関数超入門」を出版いたしました。
この記事が気に入ったらサポートをしてみませんか?