【发布时间】:2015-06-04 19:15:22
【问题描述】:
我正在创建一个几乎完成的预订系统。目前我正在从表单中收集数据,将其传递给工作表,然后使用其中的一些信息来创建日历事件。这一切都很好。
在创建事件时,我还收集了 eventID,以便我可以使用它来识别事件并从电子表格中更新它。这些更新也有效,但更新开始/结束日期和时间会导致以下错误:
TypeError:在对象 CalendarEventSeries 中找不到函数 setTime。
这是我正在使用的代码:
var eventStart = sh.getRange("D"+rowNumber).getValues();
var eventEnd = sh.getRange("E"+rowNumber).getValues();
event.setTime(eventStart, eventEnd);
我用 setLocation 和 setTitle 做同样的事情没有问题。
我是新手,我不知道对象是什么,所以错误消息对我来说意义不大!但我可以看到 setTime 是“CalendarEvent”(https://developers.google.com/apps-script/reference/calendar/calendar-event#setTime(Date,Date))类中概述的方法,但不在“CalendarEventSeries”中。无论如何,我的所有活动都是开关活动?
提前感谢您的任何指点。
更新
我已经集成了 Mogsdad 的高级日历服务代码,之后
"var endTime = parseDate(event.end.date||event.end.dateTime);"
我正在检查/记录“开始时间”和“事件”。 “startTime”作为“无效日期”返回(坏事?),“事件”返回所有我能想象到的日历条目信息(我希望是好事?!)。
parseDate 函数实际上应该去哪里?也许我把它放在了错误的地方(我到处都试过了!)而且这个没有被使用?
另外,现在我要编辑的事件已被确定,是否已解析日期并用于搜索我已经找到的事件以返回我最终可以使用 setTime 的日历事件?这就是重点吗?
感谢您对我的包容。
更新 2 - 无效日期?
如果我跳过解析并像这样记录变量:
var startTime = event.start.dateTime;
我认为结果是 2015-05-24T02:00:00+01:00。因此,无效日期肯定是在解析函数期间出现问题的情况,因为它只有在它返回“无效日期”时才会出现。
以下上下文中的代码。
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [{name: "Create Event Document Manually", functionName: "addSheet"},{name: "Update Calendar Entry", functionName: "getEventById"}
];
ss.addMenu("Select Row & Click Here", menuEntries);
}
/**
* Retrieve a CalendarApp CalendarEvent object from IDs.
* This version utilizes the Advanced Calendar Service, which must be
* enabled before use.
*
* @param {string} calendarId ID of calendar to be searched
* @param {string} eventId Event ID to match
*
* @returns {CalendarEvent} CalendarApp CalendarEvent object or null
*/
function getEventById(calendarId, eventId) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var rowNumber = sh.getActiveRange().getRowIndex();
var myEventId = "q8q533oioluipirksmno88qv2g";
var calendarId = "mydomain.tv_q9608ku2min78rasgt2s2n233c@group.calendar.google.com";
// Get event by ID.
var event = Calendar.Events.get(calendarId, myEventId);
// This isn't a CalendarApp CalendarEvent though, so use the info
// in the event to find it AGAIN as the right type.
// Get start & end times of event. All-day events start at start.date,
// while other events start at start.datetime. Likewise for end.
var startTime = parseDate(event.start.date||event.start.dateTime);
var endTime = parseDate(event.end.date||event.end.dateTime);
Logger.log('Variables: ' + startTime + ' and ' + endTime);
// Get array of events that fall between startTime & endTime
var calEvents = CalendarApp.getEvents(startTime, endTime);
// Search through those events, looking for a match by ID
for (var i=0; i<calEvents.length; i++) {
var curId = calEvents[i].getId().split('@')[0]; // extract id from id@calendar.google.com
if (curId == eventId) {
// Mission accomplished; we have an Event object with given id!
return calEvents[i];
}
}
// We did not find matching event
return null;
}
function parseDate(string) {
var parts = string.split('T');
parts[0] = parts[0].replace(/-/g, '/');
return new Date(parts.join(' '));
}
【问题讨论】:
-
是的,编辑的更新是正确的。这是获取正确事件对象的一种方式。
-
太好了,感谢您澄清 Serge。这感觉像是进步!当我记录“事件”时,这是我收到的关于开始日期/时间的数据:“start”:{“dateTime”:“2015-05-24T02:00:00+01:00”,“timeZone”:” Europe/London"},这是否符合预期,是否有任何理由无法解析并导致日期无效?
-
Mogsdad 下面写的辅助函数 (parseDate(string)) 处理该格式,它在字母“T”上分割字符串,只取第一部分并用“/”替换连字符,这样该格式可用作新 Date 语句的参数。那里不应该出现错误。
-
确实,我可以看到函数在做什么以及为什么它是必要的,但在这种情况下,我真的不知道它是否在做。如果日期格式不正确,在解析之前或之后,我仍然希望在记录 startTime/endTime 变量时看到它而不是“无效日期”,不是吗?什么决定日期无效?什么无效?!我还没有尝试对它做任何事情!我会将我的代码完整地发布到原始帖子中,这可能是我的一个愚蠢的错误......
标签: google-apps-script google-sheets google-calendar-api