Google Calendar插件获取事件起止时间显示Invalid Date问题排查
问题:Google Calendar插件无法正确获取事件起止时间
开发Google Calendar内部插件时,点击日历事件后通过下拉菜单选择选项并点击按钮,选中项属性可正常获取,但事件起止时间始终无法正确获取,日志输出「Event start time: Invalid Date」「Event end time: Invalid Date」。此前尝试过直接获取日期、转换为字符串传递后再转回Date等方式,曾出现Undefined,当前为Invalid Date错误。
日志输出
Apr 23, 2025, 8:40:24 AM Info Selected customer ID: 1337 Apr 23, 2025, 8:40:24 AM Info Event start time: Invalid Date Apr 23, 2025, 8:40:24 AM Info Event end time: Invalid Date
脚本代码
/** * Callback for opening a calendar event. * @param {Object} e The event object for the open callback. * @return {CardService.Card} The card to show to the user. */ function onCalendarEventOpen(e) { var cardBuilder = CardService.newCardBuilder(); var customerData = getCustomersFromApi(); var selectionInput = CardService.newSelectionInput() .setType(CardService.SelectionInputType.DROPDOWN) .setFieldName("dropdown_field") .setTitle("Select a customer"); customerData.forEach(function(customer) { selectionInput.addItem(customer.name, customer.id, false); }); var startTime = ""; var endTime = ""; // SAFELY extract start and end time strings from calendar event if (e && e.calendarEvent) { var event = e.calendarEvent; if (event.getStartTime && event.getEndTime) { startTime = event.getStartTime().toISOString(); endTime = event.getEndTime().toISOString(); } } var action = CardService.newAction() .setFunctionName("onTidsraporteraClick") .setParameters({ startTime: startTime, endTime: endTime }); var button = CardService.newTextButton() .setText("Tidsraportera") .setOnClickAction(action); var section = CardService.newCardSection() .addWidget(selectionInput) .addWidget(button); return cardBuilder.addSection(section).build(); } /** * Callback for when the "Tidsraportera" button is clicked. * Logs the selected customer and the calendar event start/end times. * @param {Object} e The event object containing form inputs and parameters. * @return {CardService.ActionResponse} */ function onTidsraporteraClick(e) { try { var selectedCustomerId = e.commonEventObject.formInputs["dropdown_field"].stringInputs.value[0]; Logger.log("Selected customer ID: " + selectedCustomerId); var startTime = new Date(e.parameters.startTime); var endTime = new Date(e.parameters.endTime); Logger.log("Event start time: " + startTime); Logger.log("Event end time: " + endTime); } catch (error) { Logger.log("Error in onTidsraporteraClick: " + error); } return CardService.newActionResponseBuilder() .setNotification(CardService.newNotification() .setText("Customer: " + selectedCustomerId + "\nStart: " + startTime + "\nEnd: " + endTime)) .build(); }
appscript.json部分配置
{ "timeZone": "Europe/Berlin", "runtimeVersion": "V8", "oauthScopes": [ "https://www.googleapis.com/auth/calendar.addons.execute", "https://www.googleapis.com/auth/script.locale", "https://www.googleapis.com/auth/calendar.readonly", "https://www.googleapis.com/auth/calendar", "https://www.google.com/calendar/feeds", "https://www.googleapis.com/auth/script.external_request" ], }
问题原因与修复方案
核心问题
你在onCalendarEventOpen中错误使用了event.getStartTime()和event.getEndTime()方法,但Google Calendar插件的事件对象不提供这两个getter方法。正确的方式是直接访问e.calendarEvent.start和e.calendarEvent.end属性,它们本身就是Date对象(普通事件)或ISO格式字符串(全天事件)。
修复步骤
修改
onCalendarEventOpen中提取时间的逻辑:
替换原有的时间提取代码为以下内容,直接获取事件属性并处理不同类型的时间格式:var startTime = ""; var endTime = ""; // 正确提取日历事件的起止时间 if (e && e.calendarEvent) { // 普通事件的start/end是Date对象,全天事件是ISO字符串(YYYY-MM-DD) if (e.calendarEvent.start) { startTime = typeof e.calendarEvent.start === 'object' ? e.calendarEvent.start.toISOString() : e.calendarEvent.start; } if (e.calendarEvent.end) { endTime = typeof e.calendarEvent.end === 'object' ? e.calendarEvent.end.toISOString() : e.calendarEvent.end; } }可选优化:在
onTidsraporteraClick中增加空值校验,避免因参数为空导致的Invalid Date:var startTime = e.parameters.startTime ? new Date(e.parameters.startTime) : 'N/A'; var endTime = e.parameters.endTime ? new Date(e.parameters.endTime) : 'N/A';
补充说明
- Google Calendar插件的
e.calendarEvent对象结构中,start和end是直接暴露的属性,无需通过方法调用获取 - 全天事件的时间格式为
YYYY-MM-DD字符串,普通事件为Date对象,因此需要做类型判断以统一转换为ISO字符串传递
内容的提问来源于stack exchange,提问作者Deni Cuturic
相关产品推荐
相关产品推荐

