Search code examples
google-apps-scriptgoogle-sheetsgoogle-calendar-api

Join Date and time for events from sheet to calendar


With this code I can send the events directly to google calendar from google sheets. The start date and end date are on two different columns (col D and col F), the problem is that I need also the time that are on others two columns (col E and col G). How could I join startDate with date+time and endDate with date+time?

function sendToCalendar() {
  var spreadsheet = SpreadsheetApp.getActive().getSheetByName('XCALENDAR')
  var calendarID = spreadsheet.getRange("O1").getValue();
  var eventCal = CalendarApp.getCalendarById(calendarID);
  var signups = spreadsheet.getRange("A5:P5").getValues(); 
  
  for (x=0; x<signups.length;x++)
  {
    var shift = signups[x];
    var startTime = shift[3];
    var endTime = shift[5];
    var nameevent= shift[1];
    var desc= shift[13];
    var color = shift[15];
    var event = eventCal.createEvent(nameevent, startTime, endTime,{description:desc});

    if(color){
      event.setColor(CalendarApp.EventColor[color]);
    }
  }
}

Solution

  • To concatenate date (d) and time (t), you can do it this way

    new Date(d.getFullYear(), d.getMonth(), d.getDate(), t.getHours(), t.getMinutes(), t.getSeconds())
    

    try with

    function createEvent() { 
      // A = title, B = description, C = location, D = begin .. E = at, F = end ... G = at
      const myCalend = CalendarApp.getCalendarById("xxxxxxxxxxxx@gmail.com");
      const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
      const [headers, ...data] = sh.getRange('A1:H' + sh.getLastRow()).getValues()
      const colID = 8; // H
      data.forEach((r, index) => {
        if (r[colID - 1] == '') {
          let [title, desc, loc] = [r[0], r[1], r[2]]
          let [bd, bh, ed, eh] = [r[3], r[4], r[5], r[6]]
          let id = (myCalend.createEvent(
            title,
            new Date(bd.getFullYear(), bd.getMonth(), bd.getDate(), bh.getHours(), bh.getMinutes(), bh.getSeconds()),
            new Date(ed.getFullYear(), ed.getMonth(), ed.getDate(), eh.getHours(), eh.getMinutes(), eh.getSeconds()),
            {
              description: desc,
              location: loc
            }).getId())
          sh.getRange(index + 2, colID).setValue(id)
        }
      })
    }
    

    edit

    according to your spreadsheet, and assuming that dates are as dd/MM/yyyy, you can use (the eventID will be stored in column M=13 and prevent duplicating event)

    function sendToCal() {
      var spreadsheet = SpreadsheetApp.getActive().getSheetByName('Foglio1')
      let eventCal = CalendarApp.getCalendarById("xxxxxxxxx@gmail.com");
      var signups = spreadsheet.getRange("A2:M" + spreadsheet.getLastRow()).getDisplayValues();
      var col = 13; // M
      for (x = 0; x < signups.length; x++) {
        var shift = signups[x];
        if (shift[(col - 1)] == '') {
          let [d, e, f, g] = [shift[3].split("/"), shift[4].split(":"), shift[5].split("/"), shift[6].split(":")]
          let [nameevent, desc, color] = [shift[1], shift[11], shift[12]]
          var startTime = new Date(parseInt(d[2]), parseInt(d[1])-1, parseInt(d[0]), parseInt(e[0]), parseInt(e[1]), 0)
          var endTime = new Date(parseInt(f[2]), parseInt(f[1])-1, parseInt(f[0]), parseInt(g[0]), parseInt(g[1]), 0)
          var event = eventCal.createEvent(nameevent, startTime, endTime, { description: desc });
          spreadsheet.getRange(+x + 2, col).setValue(event.getId())
          if (color) {
            event.setColor(CalendarApp.EventColor[color]);
          }
        }
      }
    }