Apps Script结合Google Sheets创建日历事件 起止日期相同报错解决方案
报错根因
你碰到的报错是Google日历createAllDayEvent方法的固定校验规则导致的:
全天事件的结束日期采用排他计算逻辑:接口会把你传入的结束日期当做事件不包含的起始点。举个例子,如果你要创建10月5日当天的全天休假事件,接口要求传入的结束日期必须是10月6日,才会识别为10月5日全天的事件;如果传入和开始日期相同的10月5日,系统会判定事件时长为0,触发「开始日期必须早于结束日期」的错误。
修复方案
逻辑非常简单:在创建事件前先做一次判断,如果开始日期和结束日期是同一天,就把传给接口的结束日期往后顺延1天即可;如果是跨天申请,就保持原来的结束日期不变,完全不影响原有跨天休假的逻辑,日历端显示也完全符合预期。
你可以直接用下面的代码替换你原来对应的代码块:
else if (approval == Approval.Approved) { // 适配单天全天事件的日期规则 let eventEndDate = endDate; // 判断如果起止日期为同一天,将结束日期向后顺延1天 if (startDate.getTime() === endDate.getTime()) { eventEndDate = new Date(endDate); eventEndDate.setDate(eventEndDate.getDate() + 1); } // 审批通过后创建日历事件 CalendarApp.getCalendarById(email) .createAllDayEvent( 'OOO - Out Of Office', startDate, eventEndDate, // 这里传入处理后的结束日期 { description: message, guests: additionalEmail, sendInvites: true, });
新手注意事项
- 替换代码时只需要替换你原来写的
else if (approval == Approval.Approved) { ... }这一整段即可,其他代码不需要改动 - 顺延1天的逻辑只会在起止日期完全相同的时候触发,跨天休假申请会直接走原有逻辑,不会出现日期多算1天的问题
- 单天休假场景下虽然传给接口的是顺延1天的日期,但Google日历会自动识别为申请当天的全天事件,不会显示为两天假期,你可以先拿测试表单提交1条单天申请验证效果,不会影响正式日历数据
内容的提问来源于stack exchange,提问作者QAA
相关产品推荐
相关产品推荐

