GASで現在時刻から現在のスプリントを取得する
スプリントが金曜~翌木曜で、現在時刻から今のスプリントを取得する。 例えば、今日が2018.09.17なら、2018.09.14-20という文字列を取得する。
とりあえず、今週金曜日を取得するコードはこちら
var this_day = new Date() var this_friday = new Date(this_day) this_friday.setDate(this_day.getDate() - (this_day.getDay() - 5));
なんかすごく冗長なので、Momentjsとやらを使ってみる。
こうなった。
var this_day = Moment.moment() var this_friday = Moment.moment(this_day).isoWeekday(5);
で、スプリントの期間を取得するのはこうなる
/** * 引数に指定した日付からスプリントの文字列を取得する * Momentjsに依存 * https://tonari-it.com/gas-moment-js-moment/ */ function getActiveSprint(){ // this_day = 2018.09.17 -> 2018.09.14-20 var this_day = Moment.moment().startOf('day') var td = this_day.format('YYYY-MM-DD HH:mm:SS') var this_friday = Moment.moment(this_day).isoWeekday(5); var previous_friday = (this_day < this_friday) ? Moment.moment(this_friday).subtract(7, 'days') : Moment.moment(this_friday) var this_thursday = Moment.moment(this_day).isoWeekday(4); var next_thursday = (this_thursday < this_day) ? Moment.moment(this_thursday).add(7, 'days') : Moment.moment(this_thursday) return previous_friday.format('YYYY.MM.DD') + '-' + next_thursday.format('DD') }
さらに共通化してこうなった
/** * 引数に指定した日付からスプリントの文字列を取得する * Momentjsに依存 * https://tonari-it.com/gas-moment-js-moment/ */ function getActiveSprint(dt){ var this_day = Moment.moment(dt).startOf('day') var previous_friday = getNextOrPreNDay(this_day, 'PREVIOUS', 'FRI') var next_thursday = getNextOrPreNDay(this_day, 'NEXT', 'THU') return previous_friday.format('YYYY.MM.DD') + '-' + next_thursday.format('DD') } /** * dtから次または前のN曜日の日付を返す */ function getNextOrPreNDay(dt, nxPre, day) { var dayStrs = ['SUN', 'MON', 'THE', 'WED', 'THU', 'FRI', 'SAT']; var dayNum = dayStrs.indexOf(day) var this_day = Moment.moment(dt).startOf('day') var this_n_day = Moment.moment(this_day).isoWeekday(dayNum); var previous_n_day = (this_day < this_n_day) ? Moment.moment(this_n_day).subtract(7, 'days') : Moment.moment(this_n_day) var next_n_day = (this_n_day < this_day) ? Moment.moment(this_n_day).add(7, 'days') : Moment.moment(this_n_day) if ( nxPre == 'NEXT' ) { return next_n_day; } else if(nxPre == 'PREVIOUS') { return previous_n_day } }
テスト
QUnit.helpers( this ); function doGet( e ) { QUnit.urlParams( e.parameter ); QUnit.config({ title: "GAS のユニットテスト" }); QUnit.load( myTests ); return QUnit.getHtml(); }; function myTests() { module('getActiveSprint 関数テスト'); test('正常系', function () { strictEqual(getActiveSprint(new Date('2018-09-14')), '2018.09.14-20', '2018-09-14は金曜日なので、14-20'); strictEqual(getActiveSprint(new Date('2018-09-13')), '2018.09.07-13', '2018-09-13は木曜日なので、7-13'); }); }