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

Google Apps Script假期日历:如何正确识别全天OOO事件并导入?

解决Google日历OOO全天事件无法被识别的问题

问题背景

我在使用Google Apps Script开发的假期日历脚本时遇到了一个问题:想要仅导入全天事件,包括普通全天事件和OOO(外出)全天事件,但现有的判断逻辑会把所有OOO事件都判定为非全天事件,导致无法导入。即使是明确设置为全天的OOO事件,CalendarEvent.isAllDayEvent()方法也始终返回false。

原代码如下:

function shouldImportEvent(user, keyword, event) {
  // Filters out events where the keyword did not appear in the summary
  // (that is, the keyword appeared in a different field, and are thus
  // is not likely to be relevant).
  if (event.summary.toLowerCase().indexOf(keyword) < 0) {
    return false;
  }

  // Only import events that are all day
  let calEvent = CalendarApp.getCalendarById(user.getEmail()).getEventById(event.id)
  if (!calEvent.isAllDayEvent()) {
    // all outOfOffice events are returning here
    return false; 
  }

  if (!event.organizer || event.organizer.email == user.getEmail()) {
    // If the user is the creator of the event, always imports it.
    return true;
  }
  // Only imports events the user has accepted.
  if (!event.attendees) return false;
  let matching = event.attendees.filter(function(attendee) {
    return attendee.self;
  });
  return matching.length > 0 && matching[0].responseStatus == 'accepted';
}

问题原因

Google日历的OOO事件在底层结构上和普通全天事件不同,isAllDayEvent()方法的判断逻辑并不适用于OOO事件。全天OOO事件的结束日期会被自动设置为次日的0点,而不是和普通全天事件一样使用相同的日期。

解决方案

修改全天事件的判断逻辑,分别处理普通事件和OOO事件:

  1. 对OOO事件,通过检查start.date和end.date的日期差是否为1天来判断是否是全天事件
  2. 对普通事件,保留原有的isAllDayEvent()判断逻辑

修改后的完整代码:

function shouldImportEvent(user, keyword, event) {
  // 过滤摘要中不含指定关键词的事件
  if (event.summary.toLowerCase().indexOf(keyword) < 0) {
    return false;
  }

  let isAllDay = false;
  // 处理OOO类型事件
  if (event.outOfOfficeProperties) {
    // 全天OOO事件的start和end日期会相差1天
    if (event.start.date && event.end.date) {
      const startDate = new Date(event.start.date);
      const endDate = new Date(event.end.date);
      const dayDiff = (endDate - startDate) / (1000 * 60 * 60 * 24);
      isAllDay = dayDiff === 1;
    }
  } else {
    // 普通事件使用原方法判断
    const calEvent = CalendarApp.getCalendarById(user.getEmail()).getEventById(event.id);
    isAllDay = calEvent.isAllDayEvent();
  }

  if (!isAllDay) {
    return false;
  }

  // 事件创建者直接导入
  if (!event.organizer || event.organizer.email === user.getEmail()) {
    return true;
  }

  // 仅导入用户已接受的事件
  if (!event.attendees) return false;
  const matchingAttendee = event.attendees.find(attendee => attendee.self);
  return matchingAttendee && matchingAttendee.responseStatus === 'accepted';
}

关键修改点

  • 新增对event.outOfOfficeProperties的检测,识别OOO事件
  • 通过日期差判断OOO事件是否为全天(Google日历中全天OOO事件结束日期为次日)
  • 优化了参会者判断逻辑,使用find替代filter更高效
  • 使用严格相等===替代==,避免类型转换问题

内容的提问来源于stack exchange,提问作者Lindsey Hanna SheHer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:35:54