Google Apps脚本:服务器遇到错误。稍后再试

时间:2014-03-16 19:51:21

标签: google-apps-script

我被卡住了。错误被抛出@第63行,有时在第50行。两者都使用了appendTableRow()方法。我找不到任何错误。

row3.appendTableCell(entryDesc)

链接到生成的文件:Link

执行记录:Link

我很新,所以如果你发现任何"不良做法"随意瞄准手指。

    // 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('0k2s9lfibn50scj41gcuurovck@group.calendar.google.com')
      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();
  }
}

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,看来:body.appendTableCell();不处理换行符“\ n”。当脚本从日历导入多行事件描述时,我会收到“服务器错误”消息。将split('\ n')添加到描述行可以解决问题。这工作:body.appendTableCell(data).split(“\ n”);

完成的代码:

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);
    }

答案 1 :(得分:0)

我没有完整的答案,但我认为同时展示一个没有事件描述的版本可能会很有趣。

我改变了无法工作的总时间的计算。

可以使用测试功能在任何默认日历上测试代码。

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