見出し画像

[GAS][Slack]定期的に投稿するBotを作成

私が所属しているコミュニティのSlackでは、毎日定期的にSlack Botが稼働しています。
実に様々なBotがあります。

コミュニティ内の様々なTipsを投稿したり、
「今日の名言」と題して名言を投稿したり、
「今日の成果を発表してください」と促すbotがあったり。

Bot投稿のノウハウを習得したく、調べながらまとめました。

Slackの設定は以下の記事を参考にさせていただきました。
ありがとうございました。

以下の手順で実装/確認します。

1_スプレッドシートの用意
2-1_Slackアプリの新規作成
2-2_Slackアプリの設定
2-3_Slackアプリのインストール
3_GASのスクリプト
4_GAS実行/確認

1_スプレッドシートの用意

今回は、GASを用い1日1回決められた時間帯にメッセージをSlackに投稿する...という機能を実装します。

以下のスプレッドシートを用意します。
列BにはSlackに送るメッセージ、列Cには送信済を判定する「isSent」(初期値は空欄)を用意しておきます。

画像16

2-1_Slackアプリの新規作成

Slackの設定は以下の記事を参考にさせていただきました。
ありがとうございました。

以下のURLからSlackアプリを新規作成します。

右上[Create New App]をクリックすると「Create an app」というダイアログが表示されるので、[From scratch]を選択します。

画像2
画像3

次のダイアログでApp名を入力し、workspaceをプルダウンより選択します。

画像4

2-2_Slackアプリの設定

左にある[OAuth & Permissons]をクリックし、「Scopes」にある[Add an OAuth Scope]をクリックした後、「chat:write」「chat:write.public」「chat:write.customize」の3つを選択します。

画像5
画像6
画像7

続けて、左にある[App Home]より「App Display」の[Edit]をクリックし、ボット名とデフォルトのユーザー名を入力します。

画像8
画像9
画像10

↑↑↑上部に「App display name saved!」が表示され、これで設定は完了です。

2-3_Slackアプリのインストール

最後に新規作成したSlackアプリをワークスペースにインストールします。

左の[Install App]より[Install to Workspace]をクリック、次のダイアログで[許可する]をクリックします。

画像11
画像12

ここで表示されるトークンをコピーし、GASのプロパティストアに格納しておきます。

画像13

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を実行すると指定したチャンネルにメッセージが投稿されます。

画像14

スプレッドシートを確認すると、列Cには投稿後に「TRUE」が記録され、
次回実行時には次の行のメッセージを投稿する仕組みになっています。
最終行を投稿後は列CのTRUEをすべてクリアし、最初の行から投稿が始まります。

画像15


「function SlackBot_01」に1日1回のトリガーを設定すると、毎日決められた時間帯に自動的に投稿することが出来ます。

※Bot作成についてはこちらの記事を参考にさせていただきました。
ありがとうございました。


※権限によっては投稿したメッセージが削除できない場合があります。Botのtokenを用いて削除する方法はこちら。

※類似記事を書きました。


※2022年9月に技術同人誌「会社員がVLOOKUPの次に覚えるQUERY関数超入門」を出版いたしました。


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