Google Sheets с интеграцией календаря + время в зависимости от условий - PullRequest
0 голосов
/ 24 февраля 2020

Я сталкиваюсь с проблемой при попытке запустить следующий код для установки событий на основе Календаря Google в Календарь, почти то, чего я пытаюсь достичь:

Если пользователь вводит Высокий : календарь должен найти следующий доступный временной интервал и установить событие там

Если пользователь вводит Mid : Найдите первую треть времени между следующим предстоящим событием и уже установленным, ie: одно событие уже в 9:00, а другое в 12:00, поэтому, если я пытаюсь установить новое событие с приоритетом Mid , он должен установить его в 10:00

Если пользователь вводит Низкий : найдите вторую треть времени между следующим предстоящим событием и уже установленным, ie: одно событие уже в 9:00, а другое в 12:00, поэтому, если я пытаюсь установить новое событие с приоритетом Mid, оно должно быть установлено в 11:00

Если нет доступных Временные интервалы между дают alert.

Пока что сценарий устанавливает время под любой записью для следующего предстоящего события

Кроме того, я застрял в установке событий между 6:00 и 23:00 для календарь по умолчанию.

Большой кусок кода здесь, так что любые идеи будут по достоинству оценены

//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';
}

1 Ответ

1 голос
/ 04 марта 2020

Я решил, изменив

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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...