DoubleD84
DoubleD84

Reputation: 65

Google Apps Script: Server encountered an error. Try again later

I am stuck.. Error is thrown @ Line 63 and sometimes at line 50. Both using the appendTableRow() method. I can't find anything wrong.

row3.appendTableCell(entryDesc)

Link to generated file: Link

Execution Transcript: Link

I am new so if you notice any "bad practices" feel free to aim a finger.

    // Import data from the Calendar to the timesheet document
    function importDataToTS (dateStart,dateFinish,doc) {
      if (!dateStart) {
        var dateStart = new Date('January 1, 2014');
      }
      var cal = CalendarApp.getCalendarById('[email protected]')
      var events = cal.getEvents(dateStart, dateFinish);
      var oldDate = new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate() - 1);
      var paragraph = "";
      var totalHoursWorked = 0

      // START --- Text element styles
      // Date
      var entryDateStyle = {};
        entryDateStyle[DocumentApp.Attribute.BOLD] = true;
        entryDateStyle[DocumentApp.Attribute.FONT_SIZE] = 18;
      // Title
      var entryTitleStyle = {};
        entryTitleStyle[DocumentApp.Attribute.FONT_SIZE] = 14;
      // entryTimes
      var entryTimesStyle = {};
        entryTimesStyle[DocumentApp.Attribute.BOLD] = true;
        entryTimesStyle[DocumentApp.Attribute.FONT_SIZE] = 12;
      // entryDescription
      var entryDescriptionStyle = {};
        entryDescriptionStyle[DocumentApp.Attribute.ITALIC] = true;
        entryDescriptionStyle[DocumentApp.Attribute.FONT_SIZE] = 10;
      // END --- Text element styles 
      var entriesTable = doc.appendTable();
      Logger.log(entriesTable.getType());

      for (var i = 0; i in events; i++) {
    var entryDate = events[i].getStartTime();
    if (i > 0) {
      oldDate = (events[i-1].getStartTime());
    }
    // If it's a new day add a full width cell
    if (entryDate.getDate() > oldDate.getDate()) {   
      var row1 = entriesTable.appendTableRow();
      row1.appendTableCell(shortDate(entryDate,4));
        //.setAttributes(entryDateStyle);
    }

    // Add title, start/end times & hours worked
     // Add title, start/end times & hours worked
    var entryTitle = events[i].getTitle();
    Logger.log(i + ": " + entryTitle);
    var entryTimes = shortTime(events[i].getStartTime(),2) + " - " + shortTime(events[i].getEndTime(),2);
    Logger.log(i + ": " + entryTimes);
    var entryHoursWorked = ((events[i].getEndTime() - events[i].getStartTime())/(1000*60*60)%24) + "hr(s)";
    Logger.log(i + ": " + entryHoursWorked);
    var row2 = entriesTable.appendTableRow();
    row2.appendTableCell(entryTitle);
      //.setAttributes(entryTitleStyle);
    row2.appendTableCell(entryTimes + "\t\t" + entryHoursWorked);
      //.setAttributes(entryTimesStyle);


    // Add entry description
    var entryDesc = (events[i].getDescription().length > 1) ? events[i].getDescription().toString() : "";

    if (entryDesc.length > 1) { 
      var row3 = entriesTable.appendTableRow();
      row3.appendTableCell();
      row3.appendTableCell(entryDesc);
        //.setAttributes(entryDescriptionStyle);
    }

    totalHoursWorked += entryHoursWorked;
    if (i === (events.length - 1)) {
      var lastRow = entriesTable.appendTableRow(); 
      lastRow.appendTableCell("Total Hours: " + totalHoursWorked);
    }
  }
  for (var i = 0; i in entriesTable; i++) { 
    for (var j = 0; j in entriesTable[i]; j++) {
      Logger.log(i + ":" + j + " " + entriesTable[i][j].toString());
    }
  }

      doc.appendTable(entriesTable);
    }

shortDate() && shorttTime()

function shortDate(date,n) {
  // Returns a date object as "MMMDD";
    if (date) {
      switch (n) {
        case 1:
          //Jul6
          return Utilities.formatDate(date, "EST", "MMMdd")
          break;
        case 2:
          //Jul 6
          return Utilities.formatDate(date, "EST", "MMM dd")
          break;
        case 3:
          //July 6
          return Utilities.formatDate(date, "EST", "MMMM dd")
          break;
        case 4:
          return Utilities.formatDate(date, "EST", "EEE, MMM dd")
          break;
        default:
          //Full Date unchanged
          return date;
      }
    }
}

function shortTime(date) {
  //Returns time string formatted as "hh:mm"am/pm
  //Still needs to be updated with Utilities.formatDate
  if (date) {
    var hours = (date.getHours() > 12) ? (date.getHours() - 12) : date.getHours();
    var ampm = (date.getHours() > 12) ? "pm" : "am";
    var minutes = (date.getMinutes() == 0) ? "00" : date.getMinutes();
    var time = hours + ":" + minutes + ampm
    return time.toString();
  }
}

Upvotes: 0

Views: 339

Answers (2)

DoubleD84
DoubleD84

Reputation: 65

I found a solution, it appears that: body.appendTableCell(); doesn't handle line breaks "\n". When the script was importing a multi-line event description from the calendar I would get a "server error" message. Adding split('\n') to the description row solved the problem. This worked: body.appendTableCell(data).split("\n");

Finished code:

var entryDesc = (events[i].getDescription().length > 1) ? events[i].getDescription() : "";
    if (entryDesc) { 
      var row3 = entriesTable.appendTableRow();
      row3.appendTableCell("");
      row3.appendTableCell(entryDesc.split("\n"))
        .setAttributes(entryDescriptionStyle);
    }

Upvotes: 1

Serge insas
Serge insas

Reputation: 46792

I don't have a complete answer but I thought it might be interesting in the mean time to show a version that works without the event description.

I changed the calculation of total time that didn't work either.

Code can be tested on any default calendar using test function.

function test(){
//dateStart,dateFinish,doc
  var doc = DocumentApp.getActiveDocument();
  var dateStart = new Date('January 1, 2014');
  var dateFinish = new Date('April 1, 2014')
  importDataToTS (dateStart,dateFinish,doc);
}



function importDataToTS (dateStart,dateFinish,doc) {
  if (!dateStart) {
    var dateStart = new Date('January 1, 2014');
  }
  var cal = CalendarApp.getDefaultCalendar();
  var events = cal.getEvents(dateStart, dateFinish);
  var oldDate = new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate() - 1);
  var paragraph = "";
  var totalHoursWorked = 0

  // START --- Text element styles
  // Date
  var entryDateStyle = {};
    entryDateStyle[DocumentApp.Attribute.BOLD] = true;
    entryDateStyle[DocumentApp.Attribute.FONT_SIZE] = 18;
  // Title
  var entryTitleStyle = {};
    entryTitleStyle[DocumentApp.Attribute.FONT_SIZE] = 14;
  // entryTimes
  var entryTimesStyle = {};
    entryTimesStyle[DocumentApp.Attribute.BOLD] = true;
    entryTimesStyle[DocumentApp.Attribute.FONT_SIZE] = 12;
  // entryDescription
  var entryDescriptionStyle = {};
    entryDescriptionStyle[DocumentApp.Attribute.ITALIC] = true;
    entryDescriptionStyle[DocumentApp.Attribute.FONT_SIZE] = 10;
  // END --- Text element styles 
  var entriesTable = doc.appendTable();
  Logger.log('events.length = '+events.length);

  for (var i = 0; i <events.length; i++) {
    var entryDate = events[i].getStartTime();
    if (i > 0) {
      oldDate = (events[i-1].getStartTime());
    }
      Logger.log('i = '+i);
    // If it's a new day add a full width cell
    if (entryDate.getDate() > oldDate.getDate()) {   
      var row1 = entriesTable.appendTableRow();
      row1.appendTableCell(shortDate(entryDate,4))
        .setAttributes(entryDateStyle);
    }

    // Add title, start/end times & hours worked
    var entryTitle = events[i].getTitle();
    var entryTimes = shortTime(events[i].getStartTime(),2) + " - " + shortTime(events[i].getEndTime(),2);
    var entryHoursWorked = (events[i].getEndTime().getTime() - events[i].getStartTime().getTime())/(1000*60*60) + "hr(s)";
    var row2 = entriesTable.appendTableRow();
    row2.appendTableCell(entryTitle)
      .setAttributes(entryTitleStyle);
    row2.appendTableCell(entryTimes + "\t\t" + entryHoursWorked)
      .setAttributes(entryTimesStyle);


    // Add entry description
    var entryDesc = (events[i].getDescription().length > 2) ? events[i].getDescription() : "";


    totalHoursWorked += Number(entryHoursWorked.replace(/\D/g,''));
    if (i === (events.length - 1)) {
      var lastRow = entriesTable.appendTableRow(); 
      lastRow.appendTableCell("Total Hours: " + totalHoursWorked+' Hours');
    }
  }
  for (var i = 0; i in entriesTable; i++) { 
    for (var j = 0; j in entriesTable[i]; j++) {
      Logger.log(i + ":" + j + " " + entriesTable[i][j].toString());
    }
  }

  doc.saveAndClose();
} 

Upvotes: 0

Related Questions