Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google工作表中的日期/时间未将正确的时间传输到Google日历_Javascript_Google Apps Script - Fatal编程技术网

Javascript Google工作表中的日期/时间未将正确的时间传输到Google日历

Javascript Google工作表中的日期/时间未将正确的时间传输到Google日历,javascript,google-apps-script,Javascript,Google Apps Script,我有一个脚本,它用一个事件填充google日历。 我有一个日期字段和一个开始和结束时间字段。在google电子表格中,当我运行下面的脚本时,开始时间是13:00:00,而生成的日历开始时间是14:00:00。结束时间也会发生同样的事情 function onOpen() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [{ name : "Export Events", func

我有一个脚本,它用一个事件填充google日历。 我有一个日期字段和一个开始和结束时间字段。在google电子表格中,当我运行下面的脚本时,开始时间是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);
}
函数onOpen(){ var sheet=SpreadsheetApp.getActiveSpreadsheet(); 变量项=[{ 名称:“导出事件”, 函数名:“exportEvents” }]; sheet.addMenu(“日历操作”,条目); }; /** *将事件从电子表格导出到日历 */ 函数exportEvents(){ var sheet=SpreadsheetApp.getActiveSheet(); var headerRows=1;//标题信息的行数(要跳过) var range=sheet.getDataRange(); var data=range.getValues(); var calId=“trade.nsw.gov.au_004rslcuubrtlg81mkv48lse9c@group.calendar.google.com"; var cal=CalendarApp.getCalendarById(calId); 对于(数据中的i){ 如果(i
问题很简单,但解释却不那么简单

让我们试试吧

代码修改:

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日是JS date中用作参考的“历元”)

然后你设定日期(仍然是12月),然后是7月,7月显然是在夏天。。。正如您在日志中所看到的,date对象已从GMT切换到BST(我想是英国夏季时间吧?),并且从那里开始是1小时后

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

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

你将不得不改变一点你的日期操作顺序,但从我所看到的你的编码技能,这应该不是一个问题

希望我的解释足够清楚;)