LoginSignup
18
21

More than 5 years have passed since last update.

すぐできる!Java100本ノックをSlackに自動投稿するBot

Last updated at Posted at 2016-12-05

はじめに

先日、JJUG CCC 2016 Fallに参加してきました。
その中でJava100本ノックが紹介されており、面白そうだから社内でもやってみようかという話になりました。
Slackに問題を自動投稿するBotをスプレッドシートとGASで作ってみたので、よければ参考にしてみてください。

手順

1.問題番号を保存するスプレッドシート作成

Java100本ノックSlackBot_-_Google_スプレッドシート.png

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.起動トリガーを設定

スクリプトエディタのトリガーアイコン(時計のマーク)より、トリガーを設定します。
Java100Knock.png

この設定で毎朝8~9時に問題が自動投稿されます。(ソース内で平日のみ投稿するように制御しています)

投稿された問題は以下のような感じになります。
Slack_-_Paygent.png

参考

18
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
21