Search code examples
javascriptgoogle-apps-scriptgoogle-docs-api

Export Google Calendar to Google Doc Table - Extra Line Return


I've created a script to generate a calendar of the week's events in Google Docs. It's working, but I can't figure out how to remove that extra line return at the beginning of each cell in the 2nd column (see image).

ChatGPT suggested using trim() and few other options, but none of those suggestions worked.

function fetchCalendarEvents() {
  var calendarIds = [
    // Add subscribed calendar IDs here
    // e.g., '[email protected]', '[email protected]'
  ];

  var startDate = new Date('2023-06-10'); // Replace with your desired start date
  var endDate = new Date('2023-06-18');   // Replace with your desired end date

  var docId = 'DOCUMENT_ID';  // Replace with your Google Doc document ID

  var doc = DocumentApp.openById(docId);
  var body = doc.getBody();

  var dateRange = getDateRange(startDate, endDate);
  var table = body.appendTable().setBorderWidth(1);
  var headerRow = table.appendTableRow();
  headerRow.appendTableCell('Date');
  headerRow.appendTableCell('Event');

  for (var i = 0; i < dateRange.length; i++) {
    var date = dateRange[i];

    var eventRow = table.appendTableRow();
    eventRow.appendTableCell(date.toDateString());

    var allDayEvents = [];
    var timedEvents = [];

    for (var j = 0; j < calendarIds.length; j++) {
      var calendarId = calendarIds[j];
      var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(date);

      for (var k = 0; k < events.length; k++) {
        var event = events[k];
        var startTime = event.getStartTime();

        if (event.isAllDayEvent()) {
          allDayEvents.push(event.getTitle());
        } else if (startTime) {
          timedEvents.push({
            time: startTime,
            title: event.getTitle()
          });
        }
      }
    }

    var eventsCell = eventRow.appendTableCell();
    var eventsList = '';

    allDayEvents.forEach(function (title) {
      eventsList += title + '\n';
    });

    timedEvents.sort(function (a, b) {
      return a.time - b.time;
    });

    timedEvents.forEach(function (event) {
      eventsList += formatEventTime(event.time) + ' ' + event.title + '\n';
    });

    eventsList = eventsList.trim(); // Remove leading and trailing whitespace

    if (eventsList !== '') {
      eventsCell.clear();
      eventsCell.appendParagraph(eventsList);
    } else {
      eventsCell.appendParagraph('No events');
    }
  }
}

function formatEventTime(time) {
  var formattedTime = Utilities.formatDate(time, Session.getScriptTimeZone(), 'h:mm a');
  return formattedTime;
}

function getDateRange(startDate, endDate) {
  var dateRange = [];
  var currentDate = new Date(startDate);

  while (currentDate <= endDate) {
    dateRange.push(new Date(currentDate));
    currentDate.setDate(currentDate.getDate() + 1);
  }

  return dateRange;
}

enter image description here


Solution

  • When I saw your script, I'm worried that the initial paragraph in the cell might be the reason for your current issue. So, in your script, how about the following modification?

    From :

    if (eventsList !== '') {
      eventsCell.clear();
      eventsCell.appendParagraph(eventsList);
    } else {
      eventsCell.appendParagraph('No events');
    }
    

    To:

    if (eventsList !== '') {
      eventsCell.clear();
      eventsCell.insertParagraph(0, eventsList);
    } else {
      eventsCell.insertParagraph(0, 'No events');
    }
    

    or

    if (eventsList !== '') {
      eventsCell.clear();
      eventsCell.appendParagraph(eventsList);
    } else {
      eventsCell.appendParagraph('No events');
    }
    eventsCell.getChild(0).removeFromParent();
    
    • At the 1st modification, the initial paragraph in the cell is left.
    • At the 2nd modification, the initial paragraph in the cell is removed.