繁体   English   中英

Google Apps Script Calendar Service:仅获取所有重复(全天)事件中的第一个事件

[英]Google Apps Script Calendar Service: Get only the first events of all recurring (all day) events

除了这个问题,我想问一下如何有效地仅检索所有重复(全天)事件的第一个事件。 为每个单个事件调用函数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对象为值的数组。

  • 您想从 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 ### }, , , ]

参考:

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

添加:

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

由此,我无法理解您是想要数组还是对象。 所以我想提出两种模式。 在这种情况下,我认为可以使用当前脚本的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; });

模式2:

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

脚本:
 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; }, {});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM