Javascript Google工作表中的日期/时间未将正确的时间传输到Google日历
我有一个脚本,它用一个事件填充google日历。 我有一个日期字段和一个开始和结束时间字段。在google电子表格中,当我运行下面的脚本时,开始时间是13:00:00,而生成的日历开始时间是14:00:00。结束时间也会发生同样的事情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
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()
将时间值转换为字符串,并将该字符串解析为整数值以获得小时和分钟
你将不得不改变一点你的日期操作顺序,但从我所看到的你的编码技能,这应该不是一个问题
希望我的解释足够清楚;)