简体   繁体   中英

Google Sheets with Calendar Integration + Times based on conditions

I'm running into an issue while trying to run the following code to set events based on Google Sheets to Calendar, pretty much what I'm trying to achieve is:

If the user enters High : The calendar should look for the next available time slot and set the event there

If the user enters Mid : Look for the first third of time between the next upcoming event and the one already established, ie: One event at 9 am already and another at 12 Pm, so if I'm trying to set a new event under the priority Mid, it should set it at 10 am

If the user enters Low : Look for the second third of timebetween the next upcoming event and the one already established, ie: One event at 9 am already and another at 12 Pm, so if I'm trying to set a new event under the priority Mid, it should set it at 11 am

If there are no available Time Slots in Between give an alert.

So far the script is setting up the time under any entry for the next upcoming event

Also, I'm stuck at setting the events to be between 6 AM and 11 PM for the default calendar.

Big piece of code here, so any insights would be truly appreciated it

//schedule event
function schedEvent() {
  var spreadsheet = SpreadsheetApp.getActive();
  var ss = spreadsheet.getSheetByName('Scheduler');
  var lrow = ss.getLastRow();

  if(lrow<2)
    return;

  var edata = ss.getRange(lrow, 1, 1, 9).getValues()[0];

  if(edata[5]=='Scheduled')
    return;

  var calendar = CalendarApp.getDefaultCalendar();
//  var calendar = CalendarApp.getCalendarById('ecmoranavila@gmail.com');

  var d = new Date();
  var dl = new Date(edata[2].getTime() + 1000*3600*24);
  var events = calendar.getEvents(d, dl);
  var eId = '';

  Logger.log(d);

  var to_dl = (dl-d);
  var et = edata[3];
  var st;
  var d1;
  var d2 = dl;

  if(edata[4]=='High') {
    d1 = new Date(Math.max(d, new Date(new Date().setHours(23,0,0,0))))
    d2 = new Date(Math.min(d2, new Date(new Date().setHours(6,0,0,0))))
    if(events.length==0) {
      st = d1;
    } else {
      st = checkInterval(et, events, d1, d2);
    }

  } else if(edata[4]=='Mid') {

    //check 2nd third
    d1 = new Date(Math.max(new Date(d.getTime() + to_dl/0.33), new Date(new Date(d.getTime() + 1/3*to_dl).setHours(6,0,0,0))));
    d2 = new Date(Math.min(new Date(d.getTime() + to_dl/0.33), new Date(new Date(d.getTime() + 2/3*to_dl).setHours(11,0,0,0))));
    if(events.length==0) {
      st = d1;
    } else {
      st = checkInterval(et, events, d1, d2);
    }

    //check 1st third
    if(st=='No available time slots') {
      d1 = new Date(Math.max(d, new Date(new Date().setHours(23,0,0,0))))
      d2 = new Date(Math.min(new Date(d.getTime() + to_dl/0.33), new Date(new Date(d.getTime() + 1/3*to_dl).setHours(11,0,0,0))));
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

    //check 3rd third
    if(st=='No available time slots') {
      d1 = new Date(Math.max(new Date(d.getTime() + 2/3/to_dl), new Date(new Date(d.getTime() + 2/3*to_dl).setHours(23,0,0,0))));
      d2 = new Date(Math.min(dl, new Date(new Date(dl).setHours(6,0,0,0))));
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

  } else if(edata[4]=='Low') {

    //check 3rd third
    d1 = new Date(Math.max(new Date(d.getTime() + 2/3*to_dl), new Date(new Date(d.getTime() + 2/3*to_dl).setHours(23,0,0,0))));
    d2 = new Date(Math.min(dl, new Date(new Date(dl).setHours(6,0,0,0))));
    if(events.length==0) {
      st = d1;
    } else {
      st = checkInterval(et, events, d1, d2);
    }

    //check 2nd third
    if(st=='No available time slots') {
    d1 = new Date(Math.max(new Date(d.getTime() + 1/3*to_dl), new Date(new Date(d.getTime() + 1/3*to_dl).setHours(23,0,0,0))));
    d2 = new Date(Math.min(new Date(d.getTime() + 2/3*to_dl), new Date(new Date(d.getTime() + 2/3*to_dl).setHours(6,0,0,0))));
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

    //check 1st third
    if(st=='No available time slots') {
      d1 = new Date(Math.max(d, new Date(new Date().setHours(23,0,0,0))))
      d2 = new Date(Math.min(new Date(d.getTime() + 1/3*to_dl), new Date(new Date(d.getTime() + 1/3*to_dl).setHours(6,0,0,0))));
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

  }

  Logger.log(st);
  if(st=='No available time slots') {
    edata[5] = st;
    edata[6] = '';
    edata[7] = '';
    ss.getRange(lrow, 1, 1, 9).setValues([edata]);  
  } else {
    st = new Date(st);
    edata[5] = 'Scheduled';
    edata[6] = st
    edata[7] = Utilities.formatDate(st, 'CST', 'hh:mm:ss a');
    edata[8] = Utilities.formatDate(new Date(st.getTime() + et*3600000), 'CST', 'hh:mm:ss a');
    Logger.log(st);
    Logger.log(new Date(st.getTime() + et*3600000));

    var event = calendar.createEvent(edata[1], new Date(st), new Date(st.getTime() + et*3600000));
    eId = event.getId();
    ss.getRange(lrow, 1, 1, 9).setValues([edata]);        
  }  

}

//find other time for the event
function reschEvent(ss_prty, calendar, edata) {
  var d = new Date();
  edata[7] = new Date(edata[7]);
  edata[8] = new Date(edata[8]);
  var events = calendar.getEvents(d, edata[7]);
  var eId = '';

  Logger.log(d);

  var to_dl = (edata[7]-d);
  var et = (edata[8]-edata[7])/3600000;
  var st;
  var d1;
  var d2 = edata[7];

  if(edata[5]=='High') {

    if(events.length==0) {
      st = d;
    } else {
      st = checkInterval(et, events, d, d2);
    }

  } else if(edata[5]=='Mid') {

    //check 2nd third
    d1 = new Date(d.getTime() + 1/3*to_dl);
    d2 = new Date(d.getTime() + 2/3*to_dl);
    if(events.length==0) {
      st = d1;
    } else {
      st = checkInterval(et, events, d1, d2);
    }

    //check 1st third
    if(st=='No available time slots') {
      d1 = d;
      d2 = new Date(d.getTime() + 1/3*to_dl);
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

    //check 3rd third
    if(st=='No available time slots') {
      d1 = new Date(d.getTime() + 2/3*to_dl);
      d2 = edata[7];
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

  } else if(edata[5]=='Low') {

    //check 3rd third
    d1 = new Date(d.getTime() + 2/3*to_dl);
    d2 = edata[7];
    if(events.length==0) {
      st = d1;
    } else {
      st = checkInterval(et, events, d1, d2);
    }

    //check 2nd third
    if(st=='No available time slots') {
      d1 = new Date(d.getTime() + 1/3*to_dl);
      d2 = new Date(d.getTime() + 2/3*to_dl);
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

    //check 1st third
    if(st=='No available time slots') {
      d1 = d;
      d2 = new Date(d.getTime() + 1/3*to_dl);
      if(events.length==0) {
        st = d1;
      } else {
        st = checkInterval(et, events, d1, d2);
      }
    }

  }

  if(st=='No available time slots') {
    edata[6] = st;
    edata[7] = '';
    edata[8] = '';
    edata[9] = '';
    ss_prty.getRange(ss_prty.getLastRow()+1, 1, 1, 10).setValues([edata]);  
  } else {
    edata[6] = 'Rescheduled';
    edata[7] = st.getDate();
    edata[8] = Utilities.formatDate(st, 'CST', 'hh:mm:ss a');
    edata[9] = Utilities.formatDate(new Date(st.getTime() + et*3600000), 'CST', 'hh:mm:ss a');
    Logger.log(st);
    Logger.log(new Date(st.getTime() + et*3600000));
    var event = calendar.createEvent(edata[1], st, new Date(st.getTime() + et*3600000));
    eId = event.getId();
    ss_prty.getRange(ss_prty.getLastRow()+1, 1, 1, 10).setValues([edata]);        
  }  

  return eId;

}

function checkInterval(et, events, d, dl) {
  var dt;
  var st;

  Logger.log(events.length);
  for(var i=0; i<=events.length; i++) {

    if(i==0) {
      dt = (events[i].getStartTime()-d)/3600000;
    } else if (i==events.length) {
      dt = (dl-events[i-1].getEndTime())/3600000;
    } else {
      dt = (events[i].getStartTime() - events[i-1].getEndTime())/3600000;
    }
    Logger.log(dt);

    if(dt>et) {
      if(i==0) {
        Logger.log(d);
        st = d;
      } else {
        Logger.log(events[i-1].getEndTime());
        st = events[i-1].getEndTime();
      }
      return st;
    }
  }
  if(!st)
    return 'No available time slots';
}

I resolved it by changing

d1 = new Date(Math.max(new Date(d.getTime() + 1/3*to_dl), new Date(new Date(d.getTime() +to_dl*0.33).setHours(23,0,0,0)))); d2 = new Date(Math.min(new Date(d.getTime() +to_dl*0.33), new Date(new Date(d.getTime()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM