You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式字符串(全天事件)。

修复步骤

  1. 修改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;
      }
    }
    
  2. 可选优化:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:32:03