首页 > 解决方案 > Google Apps 脚本日历服务:仅获取所有重复(全天)事件的第一个事件

问题描述

除了这个问题,我想问一下如何有效地只检索所有重复(全天)事件的第一个事件。为每个事件调用函数findFirstEvent()似乎不合理。所以我的方法是过滤所有事件的数组。

var cal=CalendarApp.getCalendarById("Calendar Id");
var startTime=new Date(1850,0,1);
var endTime=new Date();
var events=cal.getEvents(startTime, endTime);
var firstEvents=events.filter(onlyFirstEvents);

function onlyFirstEvents() {
    ...
}

我最终真正需要的是一个数组,其中事件标题作为键,Date对象作为值。

标签: javascriptarraysgoogle-apps-scriptcalendar

解决方案


  • 您想从 Google 日历中检索所有重复事件和全天事件。
  • 特别是,您想要检索重复事件的开始事件的日期对象。
  • 您想使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

修改点:

  • 在这种情况下,使用isRecurringEvent()和的方法isAllDayEvent()
  • getEvents()以降序返回事件。使用它,您期望的结果被检索。

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

从:
var firstEvents=events.filter(onlyFirstEvents);
至:
var firstEvents = events.reduce(function(ar, e) {
  var id = e.getId();
  if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
    ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
  }
  return ar;
}, []);

结果:

运行上述脚本时,将返回以下值。

[
  {
    "eventTitle": "###",
    "eventId": "###",
    "startDate": ### date object ###,
    "endDate": ### date object ###
  },
,
,

]

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

添加:

  • 因此,您将 for 循环遍历结果数组 firstEvents 以获取所需的数组,其中事件标题为键,日期对象为值?

由此,我无法理解您想要一个数组还是一个对象。所以我想提出2种模式。在这种情况下,我认为firstEvents可以使用当前脚本。

模式一:

在此模式中,将返回一个数组,其中包括事件标题和开始日期对象分别是键和值。请进行如下修改。

脚本:
var firstEvents = events.reduce(function(ar, e) {
  var id = e.getId();
  if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
    ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
  }
  return ar;
}, []);
firstEvents = firstEvents.map(function(e) {
  var obj = {};
  obj[e.eventTitle] = e.startDate;
  return obj;
});

模式二:

在此模式中,返回一个对象,其中包括事件标题和开始日期对象分别是键和值。

脚本:
var firstEvents = events.reduce(function(ar, e) {
  var id = e.getId();
  if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
    ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
  }
  return ar;
}, []);
firstEvents = firstEvents.reduce(function(obj, e) {
  obj[e.eventTitle] = e.eventTitle in obj ? obj[e.eventTitle].concat(e.startDate) : [e.startDate];
  return obj;
}, {});

推荐阅读