はじめに
先日、JJUG CCC 2016 Fallに参加してきました。
その中でJava100本ノックが紹介されており、面白そうだから社内でもやってみようかという話になりました。
Slackに問題を自動投稿するBotをスプレッドシートとGASで作ってみたので、よければ参考にしてみてください。
手順
1.問題番号を保存するスプレッドシート作成
2.スクリプトエディタを開く
スプレッドシートのメニューから「ツール」→「スクリプトエディタ」を選択します。
3.GASにSlackAppライブラリを導入する
スクリプトエディタのメニューから「リソース」→「ライブラリ」を選択し、以下のLibrary Keyを入力します。
SlackAppのLibrary Key → M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
4.Slackのトークンを発行
こちらの記事を参考に、Slackのトークンを発行します。
5.コード作成
スクリプトエディタに以下のコードを貼り付けます。
TOKEN定数は上記で取得したトークンに置き換えてください。
var URL = "https://github.com/JustSystems/java-100practices/tree/master/contents/";
var TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // 取得したトークンを貼り付け
function main() {
// 平日のみ投稿
var today = new Date();
if(isJapaneseHoliday(today) || today.getDay() == 0 ||today.getDay() == 6){return;}
var qNumRange = SpreadsheetApp.getActiveSheet().getRange(1, 2);
var qNum = qNumRange.getValue();
postSlackMessage(qNum);
// 問題インクリメント
qNum++;
if(qNum > 100){ qNum = 1;}
qNumRange.setValue(qNum);
}
function postSlackMessage(qNum) {
var slackApp = SlackApp.create(TOKEN); //SlackApp インスタンスの取得
var options = {
channelId: "#java100knock",
userName: "Java100本ノックBot",
message: "今日の問題はこちら!\n" +
URL + ('000' + qNum).slice( -3 ) // 問題番号0埋め
};
slackApp.postMessage(options.channelId, options.message, {username: options.userName});
}
function isJapaneseHoliday(date) {
var year = date.getFullYear();
var month = date.getMonth();
var day = date.getDate();
var startDate = new Date();
startDate.setFullYear(year, month-1, day);
startDate.setHours(0, 0, 0, 0);
var endDate = new Date();
endDate.setFullYear(year, month-1, day);
endDate.setHours(23, 59, 59, 999);
var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
var holidays = cal.getEvents(startDate, endDate);
return holidays.length != 0;
}
この状態でmainメソッドを実行すると、Slackのjava100knockチャンネルに問題が投稿されます。
6.起動トリガーを設定
スクリプトエディタのトリガーアイコン(時計のマーク)より、トリガーを設定します。
この設定で毎朝8~9時に問題が自動投稿されます。(ソース内で平日のみ投稿するように制御しています)