Google表格中的日期/时间未将正确的时间转移到Google日历中

时间:2014-07-28 12:47:04

标签: javascript google-apps-script

我有这个脚本,用一个事件填充谷歌日历。 我有一个日期字段和一个开始和结束时间字段。在谷歌电子表格中,开始时间是13:00:00,当我运行以下脚本时,生成的日历开始时间是14:00:00。结束时间也是如此。

    function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export Events",
    functionName : "exportEvents"
  }];
  sheet.addMenu("Calendar Actions", entries);
};

/**
 * Export events from spreadsheet to calendar
 */
function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 1;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "trade.nsw.gov.au_004rslcuubrtlg81mkv48lse9c@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (i in data) {
    if (i < headerRows) continue; // Skip header row(s)
    var row = data[i];
    var date = new Date(row[2]);  // First column
    var title = row[1];           // Second column
    var tstart = new Date(row[3]);
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[4]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var loc = row[5];
    var desc = row[6];
    var id = row[10];              // Sixth column == eventId
    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventSeriesById(id);
    }
    catch (e) {
      // do nothing - we just want to avoid the exception when event doesn't exist
    }
    if (!event) {
      //cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
      row[10] = newEvent;  // Update the data array with event ID
    }
    else {
      event.setTitle(title);
      event.setDescription(desc);
      event.setLocation(loc);
      // event.setTime(tstart, tstop); // cannot setTime on eventSeries.
      // ... but we CAN set recurrence!
      //var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
      //event.setRecurrence(recurrence, tstart, tstop);
    }
    debugger;
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
}

1 个答案:

答案 0 :(得分:1)

问题很简单,但解释不那么简单......

让我们尝试吧!

代码修改:

var tstart = new Date(row[3]);
Logger.log('hour only = '+tstart)
tstart.setDate(date.getDate());
Logger.log('setDate = '+tstart)
tstart.setMonth(date.getMonth());
Logger.log('setMonth = '+tstart)
tstart.setYear(date.getYear());
Logger.log('setYear = '+tstart)

如您所见,我在您的代码中添加了几个Logger.log,并注意到时间值的差异,如下所示

[14-07-28 16:18:53:441 BST] hour only = Sat Dec 30 1899 10:00:00 GMT-0000 (GMT)
[14-07-28 16:18:53:442 BST] setDate = Fri Dec 29 1899 10:00:00 GMT-0000 (GMT)
[14-07-28 16:18:53:442 BST] setMonth = Sat Jul 29 1899 10:00:00 GMT+0100 (BST)
[14-07-28 16:18:53:442 BST] setYear = Tue Jul 29 2014 10:00:00 GMT+0100 (BST)

当您创建仅包含小时的日期对象时,日期在逻辑上是1899年12月30日,即冬天。(1899年12月30日是&#34;纪元&#34;在JS日期用作参考)

然后你设置日期(仍然在十二月)然后七月和七月的月显然是在夏天......正如你在记录器中看到的那样,日期对象已从GMT切换到BST(英国夏季时间)我猜?)从那里开始是1小时后。

要解决您有几种可能性,最简单的方法是在电子表格本身中组合时间和日期,这将创建一个不需要任何更改的完整日期对象。

如果您无法(或者不想)更改您的SS布局,我想更简单的方法是使用Utilities.formatDate()将您的时间值转换为字符串并将此字符串解析为获得小时和分钟的整数值。

你必须改变日期操作的顺序,但是从我看到的编码技巧上看,这不应该是一个问题。

希望我的解释足够明确;)