先日、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時に問題が自動投稿されます。(ソース内で平日のみ投稿するように制御しています)
投稿された問題は以下のような感じになります。