JavaScript で日付の計算などなど
Google Spreadsheet で作業セル(一時的に値を入れておくセル)を使ってごちゃごちゃと処理していた部分を GAS で js で自分で関数を作って整理した。時間かかったけれどすっきりしたぜ。
今朝インストールした SpiderMonkey の対話環境もちょっとしたことを確認するのに役に立った。
function getMonthLastDay(year, month) { // 月末の日付を求める // month: 1 月は 0 から始まり 11 は 12 月 // Date: 日付を 0 にすると前月の最終日を返す var day = new Date(year, month, 0); var endDate = day.getDate(); return endDate; } function getQuarter(year, first) { // 四半期の総日数を求める var LastDay_first = getMonthLastDay(year, first); var LastDay_second = getMonthLastDay(year, first+1); var LastDay_third = getMonthLastDay(year, first+2); var TotalDays = LastDay_first + LastDay_second + LastDay_third; return TotalDays; } function pastDays(year, first) { // 四半期の経過日数を求める var LastDay_first = getMonthLastDay(year, first); var LastDay_second = getMonthLastDay(year, first+1); var LastDay_third = getMonthLastDay(year, first+2); var Today = new Date(); var TodayDate = Today.getDate(); var trueMonth = Today.getMonth() + 1; // return month; switch (trueMonth) { case first: return TodayDate; break; case first+1: return LastDay_first + TodayDate; break; case first+2: return LastDay_first + LastDay_second + TodayDate; break; } } function restDays(year, first) { // 四半期の残り日数を求める var LastDay_first = getMonthLastDay(year, first); var LastDay_second = getMonthLastDay(year, first+1); var LastDay_third = getMonthLastDay(year, first+2); var Today = new Date(); var Month = Today.getMonth(); // Month - 1 が実際の月を表す var MonthTotal = getMonthLastDay(year, Month+1); var MonthRest = MonthTotal - Today.getDate(); // 月間の残り日数 // return nMonthRest; var TrueMonth = Month + 1; // return month; switch (TrueMonth) { case first: return LastDay_second + LastDay_third + MonthRest; break; case first+1: return LastDay_third + MonthRest; break; case first+2: return MonthRest; break; } } function centile(num, denom, decim) { // パーセンテージを取得する // decim はデフォルト 0, 最大 16 桁 decim = Math.min(16, decim || 0); var percentile = Math.floor((num / denom) * Math.pow(10, 2 + decim)) / Math.pow(10, decim); return percentile; } function achieveRate(score, goal) { // 達成率を求める var Rate = centile(score, goal, 2); return Rate + "%"; } function pastDaysRateQuarter(year, first) { // 四半期の経過日数の割合を求める var PastDays = pastDays(year, first); var TotalDays = getQuarter(year, first); var Rate = centile(PastDays, TotalDays, 1); return Rate + "%"; } function restDaysQuarter(year, first){ // 四半期の残り日数を求める var RestDays = restDays(year, first); var TotalDays = getQuarter(year, first); return RestDays + "/" + TotalDays + "日"; }
Closure Compiler でコンパイルするとこうなる
改行やインデントは見やすいように手直しした。
function getMonthLastDay(b,a){ return(new Date(b,a,0)).getDate() } function getQuarter(b,a){ var c=getMonthLastDay(b,a),e=getMonthLastDay(b,a+1),d=getMonthLastDay(b,a+2); return c+e+d } function pastDays(b,a){ var c=getMonthLastDay(b,a),e=getMonthLastDay(b,a+1); getMonthLastDay(b,a+2); var d=new Date,f=d.getDate(); switch(d.getMonth()+1){ case a:return f; case a+1:return c+f; case a+2:return c+e+f } } function restDays(b,a){ getMonthLastDay(b,a); var c=getMonthLastDay(b,a+1),e=getMonthLastDay(b,a+2),d=new Date,f=d.getMonth(),d=getMonthLastDay(b,f+1)-d.getDate(); switch(f+1){ case a:return c+e+d; case a+1:return e+d; case a+2:return d } } function centile(b,a,c){ c=Math.min(16,c||0); return Math.floor(b/a*Math.pow(10,2+c))/Math.pow(10,c) } function achieveRate(b,a){ return centile(b,a,2)+"%" } function pastDaysRateQuarter(b,a){ var c=pastDays(b,a),e=getQuarter(b,a); return centile(c,e,1)+"%" } function restDaysQuarter(b,a){ var c=restDays(b,a),e=getQuarter(b,a); return c+"/"+e+"\u65e5" };