/********************************************************************/ /* */ /* 1行目に見出し追加 2014.02.14 Ver.010 */ /* */ /********************************************************************/ /* */ /* 1行目に見出しがあるが内容が違う場合 → 書き直し */ /* 見出しがなくデータが書かれている場合 → 列を追加して見出し追加 */ /* */ /********************************************************************/ function writeTopTitleTable(Sheet){ const COLUMU_A = 1; // A列 const COLUMU_B = 2; // B列 const COLUMU_C = 3; // C列 const COLUMU_D = 4; // D列 const ROW_TOP = 1; // 1行目 const ROW_DATE_TOP = 2; // データのトップ行 2行目 var topRange = Sheet.getRange("A1:D1"); var topRangeValues = topRange.getValues(); var topA = topRangeValues[0][0]; // | || A列 | B列 | C列 | D列 | var topB = topRangeValues[0][1]; // ============================================== var topC = topRangeValues[0][2]; // | 1行 || topA | topB | topC | topD | var topD = topRangeValues[0][3]; // if((topA != "IN")||(topB != "OUT")||(topC != "不在時間")||(topD != "滞在時間")){ Logger.log("debug 1"); if((topA == "entered")||(topA == "exited")){ // データ行だったら列を追加 Logger.log("debug 2"); Sheet.insertRowBefore(ROW_TOP); // 列を追加 } var topTable = [["IN","OUT","不在時間","滞在時間"]]; topRange.setValues(topTable).setBackgroundColor("#CFE2F3").setFontWeight("bold").setHorizontalAlignment("center"); // 明るい青3 太字 中央 Sheet.setColumnWidth(COLUMU_A, 150); // A列 幅調整 Sheet.setColumnWidth(COLUMU_B, 150); // B列 幅調整 Sheet.setColumnWidth(COLUMU_C, 80); // C列 幅調整 Sheet.setColumnWidth(COLUMU_D, 80); // D列 幅調整 } } /************************************************************/ /* */ /* 関数 changeIftttDate() 2014.02.04 Ver.0.30 */ /* IFTTTでの日時文字列を成形し直す. */ /* */ /************************************************************/ /* */ /* 引数(IFTTTでの日時文字列を引数として渡す) */ /* 例: "December 26, 2013 at 05:34PM" */ /* */ /* 戻り値 */ /* 正常 例: "2013/12/26 17:34" 異常: -1 */ /* */ /************************************************************/ function changeIftttDate(ifttt_date){ var ret = 0; var temp_date = [null,null,null,null,null,null]; temp_date = ifttt_date.split(" "); // temp_date 格納データ例 // [0] "December" // 月 // [1] "26," // 日 // [2] "2013" // 年 // [3] "at" // // [4] "05:34PM" // 時分AM/PM // [5] null if((temp_date[4] != null)&&(temp_date[5] == null)){ // 要素数4がnullでないこと かつ 要素数5がnullであること で正常と判断 M = temp_date[0]; // 月: temp_date[0]格納データ例: "December" d = temp_date[1].substr(0,2); // 日: temp_date[1]格納データが"26,"の時,"26"を切り取る y = temp_date[2]; // 年: temp_date[2]格納データ例: "2013" h_12t = temp_date[4].substr(0,2); // 時(12時間表記): temp_date[4]格納データが"05:34PM"の時,"05"を切り取る m = temp_date[4].substr(3,2); // 分: temp_date[4]格納データが"05:34PM"の時,"34"を切り取る h_ampm = temp_date[4].substr(5,2); // 1AM/PM": temp_date[4]格納データが"05:34PM"の時,"PM"を切り取る var ms = Date.parse(M+" "+d+" "+y+" "+h_12t+":"+m+" "+h_ampm); // 例:"December 19 2013 10:02 PM" if(isNaN(ms) != true){ retDate = new Date(ms); // 出力データ作成 ----------------------- yyyy = retDate.getFullYear(); MM = retDate.getMonth() + 1; dd = retDate.getDate(); hh = retDate.getHours(); mm = retDate.getMinutes(); // 2桁にする if(MM < 10) MM = "0" + MM; if(dd < 10) dd = "0" + dd; if(hh < 10) hh = "0" + hh; if(mm < 10) mm = "0" + mm; ret = yyyy+"/"+MM+"/"+dd+" "+hh+":"+mm; // 例:"2013/12/26 17:34" }else{ ret = -1 // エラー } }else{ ret = -1; // エラー } return ret; } /************************************************************/ /* */ /* 関数 rewriteIftttDate() 2014.02.14 Ver.0.50 */ /* ITFFFの日付データを書き直しする */ /* */ /************************************************************/ /* */ /* 引数: なし */ /* */ /* 戻り値: 正常:0 異常:-1 */ /* */ /************************************************************/ function rewriteIftttDate(Sheet){ const COLUMU_A = 1; // A列 const COLUMU_B = 2; // B列 const COLUMU_C = 3; // C列 const COLUMU_D = 4; // D列 const ROW_TOP = 1; // 1行目 const ROW_DATE_TOP = 2; // データのトップ行 2行目 var ret = 0; var lastRow = Sheet.getLastRow(); // 最終行が何行目かを取得 Logger.log("lastRow="+lastRow); for(readRow = ROW_DATE_TOP; readRow <= lastRow; readRow++){ Logger.log("readRow="+readRow); readRange = Sheet.getRange("A"+(readRow-1)+":B"+readRow); // IFTTTでデータが書き込まれた列と一つ前の列 readRangeValues = readRange.getValues(); // writeCheckA = readRangeValues[0][0]; // 未使用 // | || A列 | B列 | C列 | writeCheckB = readRangeValues[0][1]; // ================================================== enter_exit = readRangeValues[1][0]; // | 1行 || writeCheckA | writeCheckB | | iftttTime = readRangeValues[1][1]; // readRow → | 2行 || enter_exit | iftttTime | | Logger.log("writeCheckA="+writeCheckA); Logger.log("writeCheckB="+writeCheckB); Logger.log("enter_exit ="+enter_exit ); Logger.log("iftttTime ="+iftttTime ); if(enter_exit == "entered"){ // IN Date の処理 ---------------------------------------------------------- writeCol_IftttTime = COLUMU_A; // A列 writeRow = readRow; }else if(enter_exit == "exited"){ // OUT Date の処理 --------------------------------------------------------- writeCol_IftttTime = COLUMU_B; // B列 if(writeCheckB == ""){ writeRow = readRow-1; }else{ writeRow = readRow; } }else{ // その他 ---------------------------------------------------------------------------------------------- Logger.log("A列が entered, exited 以外"); continue; // 今回のループをスキップ } writeTime = changeIftttDate(iftttTime); // IFTTT形式の時間を変換 例: "February 07,2014 at 23:34PM"→"2014/02/07 11:34" if(writeTime != -1){ Sheet.getRange("A"+readRow+":B"+readRow).clear(); // 読み込み行をクリア Sheet.getRange(writeRow, writeCol_IftttTime).setValue(writeTime); // 書き込み if((enter_exit == "exited")&&(writeCheckB == "")){ // exitedデータ かつ 書き込み予定のセルが空 Sheet.deleteRow(readRow); // readRow列を削除 lastRow = lastRow - 1; // 削除した列分減らす readRow--; // 削除分戻す } }else{ ret = -1; Logger.log("changeIftttDate Error"); break; // whileループから抜ける } } return ret; } /************************************************************/ /* */ /* 関数 diffTime() 2014.02.05 Ver.0.10 */ /* 経過日数時間の計算をする */ /* */ /************************************************************/ /* */ /* 引数 */ /* 第1引数 例: "2014/01/14 17:22" */ /* 第2引数 例: "2014/01/11 12:48" */ /* */ /* 戻り値 */ /* 正常 例: "04:34" 異常 00:00 */ /* */ /************************************************************/ function diffTime(arg1_Date, arg2_Date){ var ms_1 = Date.parse(arg1_Date); // 例: "2014/01/14 17:22" var ms_2 = Date.parse(arg2_Date); // 例: "2014/01/11 12:48" if(isNaN(ms_1) != true && isNaN(ms_2) != true){ ms_diff = Math.abs(ms_1 - ms_2); s_diff = (ms_diff / 1000); // ミリ秒を秒に変換 hh = Math.floor( s_diff / (60*60)); // 時 s_diff = s_diff - hh*(60*60); mm = Math.floor( s_diff / 60 ); // 分 // s_diff = s_diff - mm*(60); // ss = Math.floor( s_diff ); // 秒 // 出力データ作成 ----------------------- if(hh < 10) hh = "0" + hh; if(mm < 10) mm = "0" + mm; // if(ss < 10) ss = "0" + ss; return hh+":"+mm; // 例: "04:34" }else{ return "00:00"; } } /************************************************************/ /* */ /* 関数 writeDiffTime() 2014.02.14 Ver.0.10 */ /* 不在時間(OUT-IN), 滞在時間(IN-OUT)を計算しC列D列に書く */ /* */ /************************************************************/ /* */ /* 引数 */ /* なし */ /* */ /* 戻り値 */ /* 正常:0 異常:-1 */ /* */ /************************************************************/ function writeDiffTime(Sheet){ const COLUMU_A = 1; // A列 const COLUMU_B = 2; // B列 const COLUMU_C = 3; // C列 const COLUMU_D = 4; // D列 const ROW_TOP = 1; // 1行目 const ROW_DATE_TOP = 2; // データのトップ行 2行目 var lastRow = Sheet.getLastRow(); // 最終行が何行目かを取得 Logger.log("lastRow="+lastRow); for(readRow = ROW_DATE_TOP; readRow <= lastRow; readRow++){ Logger.log("readRow="+readRow); readRange = Sheet.getRange("A"+(readRow-1)+":D"+readRow); // IFTTTでデータが書き込まれた列と一つ前の列 readRangeValues = readRange.getValues(); // inDate1 = readRangeValues[0][0]; // 未使用 // | || A列 | B列 | C列 | D列 | OutDate1 = readRangeValues[0][1]; // ======================================================== inDate2 = readRangeValues[1][0]; // タイトル行 → | 1行 || inDate1 | OutDate1 | | | OutDate2 = readRangeValues[1][1]; // readRow → | 2行 || inDate2 | OutDate2 | outIn2 | inOut2 | outIn2 = readRangeValues[1][2]; // | 3行 || | | | | inOut2 = readRangeValues[1][3]; // | 4行 || | | | | Logger.log("writeCheckA="+writeCheckA); Logger.log("writeCheckB="+writeCheckB); Logger.log("enter_exit ="+enter_exit ); Logger.log("iftttTime ="+iftttTime ); if((outIn2 == "")&&(inDate2 != "")){ // 経過時間の計算 & 書き込み ------------------ diff_hhmm = diffTime(OutDate1, inDate2); // OUT - IN Sheet.getRange(readRow, COLUMU_C).setValue(diff_hhmm); // 経過時間の書き込み } if((inOut2 == "")&&(OutDate2 != "")){ diff_hhmm = diffTime(inDate2, OutDate2); // IN - OUT Sheet.getRange(readRow, COLUMU_D).setValue(diff_hhmm); // 経過時間の書き込み } } } /************************************************************/ /* */ /* 関数 analyseIftttDate() 2014.02.14 Ver.0.10 */ /* IFTTTの日付データからデータ分析する */ /* */ /************************************************************/ /* */ /* 引数: なし */ /* */ /* 戻り値: 正常:0 異常:-1 */ /* */ /************************************************************/ function analyseIftttDate(){ var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var Sheet = Spreadsheet.getActiveSheet(); writeTopTitleTable(Sheet); // 1行目に見出しがなければ追加 rewriteIftttDate(Sheet); // IFTTTの日付データを書き直す writeDiffTime(Sheet); // 不在時間, 滞在時間を計算してC列,D列に書く }