下記記事をもとに、やってみたのですが、
出力がおかしいので、見ていただけたらと思います。
https://www.shanaidx.com/calendar_akijikan/
①予定が繰り返されてしまう
②隙間時間のみ抽出なのに、出力データがおかしい
例:6/21(火)の13:00-17:00が空いていると出力されているが、実際はその時間内にCさんは予定ありとなっています。
以下、怪しいところを記載いたします。
すみませんが、どなたか見ていただけたら幸いです。
①空き時間を選出するところで、うまくいっていないように見えます。。
GAS
1 /* 全員共通の空き時間出力 */ 2 const startdate = new Date(start_day); // 指定開始日 3 const enddate = new Date(end_day); // 指定終了日 4 var day_count = (enddate - startdate) / (1000 * 60 * 60 * 24); // 指定日数 5 6 // 一日ずつ空き時間を計算 7 for(var c=0;c<=day_count;c++){ 8 var start_time = Utilities.formatDate(list_data[2][4] , "Asia/Tokyo", "HH:mm") // 指定開始時間 9 var end_time = Utilities.formatDate(list_data[2][5] , "Asia/Tokyo", "HH:mm") // 指定終了時間 10 var cal_starttime = []; // 予定開始時間 11 var cal_endtime = []; // 予定終了時間 12 13 // 一人ずつ予定を抽出 14 for(var i=0; i<add.length; i++){ 15 var date = new Date(Date.parse(start_day) + (c * 60 * 60 * 24 * 1000)); 16 var cal = CalendarApp.getCalendarById(add[i]); 17 var events = cal.getEventsForDay(date) 18 var setFlag = setFlag = holiFlag(date,holiday)//祝日の判定 19 if(events.length > 0 ){ 20 if(setFlag == true){ //祝日ではないor祝日チェックなし 21 for(var e=0; e<events.length; e++){// 取得した予定を配列に入力 22 if (events[e].isAllDayEvent() == false) { //終日予定は避ける 23 var start1 = events[e].getStartTime()// 予定開始時間 24 var end1 = events[e].getEndTime() // 予定終了時間 25 cal_starttime.push(start1.getTime()) // 個人の予定開始時間を配列に追加 26 cal_endtime.push(end1.getTime()) // 個人の予定終了時間を配列に追加 27 } 28 } 29 } 30 } 31 32 // 指定開始・終了時間を設定 33 var start_time_con = start_time.substr(0,2)// 1日の指定開始時間 34 var opening = date.setHours(start_time_con, 0, 0, 0) 35 var opening = date.setMinutes(start_time.substr(3,2)); 36 var end_time_con = end_time.substr(0,2) // 1日の指定終了時間 37 var closing = date.setHours(end_time_con, 0, 0, 0); 38 var closing = date.setMinutes(end_time.substr(3,2)); 39 40 cal_endtime.push(date.setHours(23, 59, 59, 999)); // 1日の終了時間 41 cal_endtime.unshift(opening); 42 cal_endtime.sort(); 43 44 cal_starttime.push(closing); 45 cal_starttime.unshift(date.setHours(0, 0, 0, 0)); //1日の開始時間 46 cal_starttime.sort(); 47 48 49 // 開始時間と終了時間を比較して空き時間を選出 50 for (var i=0;i<cal_starttime.length-1;i++) { 51 var dateString = convert2String(cal_starttime[i+1], false); 52 var week1 = new Date(cal_starttime[i+1]) 53 var week_add = weekAdd(week1) 54 var weekNum = week1.getDay(); 55 setFlag = weekFlag(weekNum,list_data) //曜日の指定と実際の曜日を判定してフラグを設定する 56 57 if(setFlag == true){ 58 if(cal_starttime[i+1] - cal_endtime[i] >= wantTimes * 60 * 1000 && cal_starttime[i+1] != cal_endtime[i]){ 59 var startTime = cal_endtime[i] + travelTime1 * 60 * 1000 60 var endTime = cal_starttime[i+1] - travelTime2 * 60 * 1000 61 var startTimeString = convert2String(startTime) 62 var endTimeString = convert2String(endTime) 63 ok_time.push([dateString+'(' + week_add + ')' + Utilities.formatString("%s-%s", startTimeString, endTimeString)]) 64 } 65 } 66 } 67 } 68 //全員共通の空き時間を出力 69 for (var j=3, k=0 ;k<ok_time.length;j++,k++) { 70 list2.getRange(j,1).setValue(ok_time[k]) 71 } 72 }
②個人の出力もおかしい
1日ずつ空き時間を計算となっているが、2人目以降は最終日×日数分を繰り返している
gas
1 // 一日ずつ空き時間を計算 2 for(var c=0;c<=day_count;c++){ 3 var events = cal.getEventsForDay(date) 4 var cal_starttime = []; // 個人の予定開始時間 5 var cal_endtime = []; // 個人の予定終了時間 6 var setFlag = holiFlag(date,holiday)//祝日の判定 7 if(events.length > 0 ){ 8 if(setFlag == true){ 9 // 取得した予定を配列に入力 10 for(var e=0; e<events.length; e++){ 11 if (events[e].isAllDayEvent() == false) { //終日予定は避ける 12 var start1 = events[e].getStartTime()// 予定開始時間 13 var end1 = events[e].getEndTime() // 予定終了時間 14 cal_starttime.push(start1.getTime()) // 個人の予定開始時間を配列に追加 15 cal_endtime.push(end1.getTime()) // 個人の予定終了時間を配列に追加 16 } 17 } 18 } 19 }
あなたの回答
tips
プレビュー