#前回の内容
前回は、「Googleスプレッドシートの出社表から自分の出社日を探し、その前日に「明日は出社日!」とSlackにリマインダーを送信してくれるスクリプト」を作りました。
出社日の前日にSlackへリマインダーを送信するスクリプト
#今回やりたいこと
今回は、Slackに出社日を問いかけると、該当日付をGoogleスプレッドシートから取得して教えてくれるSlack botを作ります。
具体的には以下のようにしたいです。
・「次の出社日」と投稿→未到来の直近の出社日を返す
・「出社日一覧」と投稿→未到来のすべての出社日を返す
また、Slack botの作成について、Outgoing Webhookは非推奨ということなので、今回はSlack APIを使用します。
#スプレッドシートの作成
前回使用したスプレッドシートにF列(曜日)を追加しました。
#Slack APIの設定①
1.Slack APIの設定ページにアクセス
2.「Create New App」をクリック
3.「App Name」と「Workspace」を入力し、「Create App」をクリック
4.「Bots」を選択
5.左側のメニューから「OAuth & Permissions」を選択し、「Bot Token Scopes」に以下を追加
6.「Install App to Workspace」をクリックし、権限のリクエストを許可する
・Bot User OAuth Access Tokenが発行されたらいったんOK
#実装①
参考にした記事
Outgoing Webhook の代わりとして Slack App の Event Subscriptions を使う
1.GASの記述
function doPost(e) {
var json = JSON.parse(e.postData.getDataAsString());
if (json.type === 'url_verification') {
return ContentService.createTextOutput(json.challenge);
}
}
2.スクリプトのプロパティの設定
・「ファイル」→「プロジェクトのプロパティ」→「スクリプトのプロパティ」を選択
・プロパティ名に「SLACK_ACCESS_TOKEN」、値には前述のSlack APIの設定で取得できる「Bot User OAuth Access Token」を入力し、保存をクリック
3.ライブラリの設定
参考にした記事
Slack BotをGASでいい感じで書くためのライブラリを作った
・「リソース」→「ライブラリ」を選択
・ライブラリキーに「M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO」を指定し、追加する
4.アプリケーションを公開
・「公開」→「Webアプリケーションとして導入」を選択
・以下の設定で「Deploy」をクリック
・URLが発行される
#Slack APIの設定②
1.左側のメニューから「Event Subscriptions」を選択し、「Enable Events」をOnに変更
2.Request URLに「4.アプリケーションの公開」で取得したURLをペースト(Verifiedが表示されればOK)
3.「Subscribe to bot ebents」と「Subscribe to events on behalf of users」を以下のように設定
4.変更を保存し、Slack AppをReinstallする(Reinstall後に以下のように表示されればOK)
#実装②
1.GASを修正
function doPost(e){
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
var slackApp = SlackApp.create(token); //SlackApp インスタンスの取得
//スプレッドシートを取得
var obj = SpreadsheetApp.openById("");//スプレッドシートのキー
var sheet = obj.getSheetByName("");// シート名
var lastRow = sheet.getLastRow();
var json = JSON.parse(e.postData.getDataAsString());
var text = json.event.text;
var workDay = null;
if (text === "次の出社日") {
workDay = searchSingleWorkDay(sheet, lastRow);
var options = {
channelId: "", //チャンネルID
userName: "出社日検索bot", //投稿するbotの名前
message: "次の出社日は " + workDay + " です!", //投稿するメッセージ
icon_emoji: ":spiral_calendar_pad:", //投稿するbotのアイコン
};
} else if (text === "出社日一覧") {
workDay = searchAllWorkDay(sheet, lastRow);
var options = {
channelId: "",
userName: "出社日検索bot",
message: "未到来の出社日一覧です!\n" + workDay,
icon_emoji: ":spiral_calendar_pad:",
};
}
//キャッシュを設定
var channel = json.event.channel;
var ts = json.event.ts;
var cache = CacheService.getScriptCache();
var cacheKey = channel + ":" + ts;
var cached = cache.get(cacheKey);
if (cached != null){
console.log("test");
return;
}
cache.put(cacheKey, true, 600);
//Slackに送信
slackApp.postMessage(options.channelId, options.message, {username: options.userName, icon_emoji: options.icon_emoji});
}
//次の出社日を探索
function searchSingleWorkDay(sheet, lastRow){
for(var i=3; i<=lastRow; i++){
for(var j=2; j<=4; j++){
if(sheet.getRange(i, j).getValue() === "探索したい文字列" && !sheet.getRange(i, 5).getValue()){
var workDay = sheet.getRange(i, 1).getValue() + "(" + sheet.getRange(i, 6).getValue() + ")";
return workDay;
}
}
}
}
//未到来の出社日一覧を探索
function searchAllWorkDay(sheet, lastRow){
var workDay = "";
for(var i=3; i<=lastRow; i++){
for(var j=2; j<=4; j++){
if(sheet.getRange(i, j).getValue() === "探索したい文字列" && !sheet.getRange(i, 5).getValue()){
workDay = workDay + sheet.getRange(i, 1).getValue() + "(" + sheet.getRange(i, 6).getValue() + ")" + "\n";
}
}
}
return workDay;
}
2.GASを修正したら再びWebアプリケーションを公開する
(2回目以降は「Deploy」ではなく「更新」に表示が変わる)
#Slackにアプリを追加
Slackを開き、GASで指定したチャンネルに「チャンネル詳細」→「その他」→「アプリを追加する」でアプリを追加する
#実行