Google Apps 脚本日历服务:仅获取所有重复(全天)事件的第一个事件
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
objects 作为值。
- 您想从 Google 日历中检索所有重复事件和全天事件。
- 特别是,您想检索重复事件的开始事件的日期object。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
修改点:
- 本例中使用了
isRecurringEvent()
和isAllDayEvent()
的方法
getEvents()
returns 事件按降序排列。使用它,将检索到您期望的结果。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
从:
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 以获得所需的数组,其中事件标题作为键,日期 objects 作为值?
由此,我无法理解你想要一个数组还是一个object。所以我想提出 2 种模式。在这种情况下,我认为可以使用当前脚本的firstEvents
。
模式 1:
在这个模式中,返回一个数组,其中包括事件标题和开始日期分别是键和值,分别是object。请修改如下。
脚本:
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;
});
模式二:
在此模式中,返回一个 object,其中事件标题和开始日期 object 分别是键和值。
脚本:
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;
}, {});
除了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
objects 作为值。
- 您想从 Google 日历中检索所有重复事件和全天事件。
- 特别是,您想检索重复事件的开始事件的日期object。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
修改点:
- 本例中使用了
isRecurringEvent()
和isAllDayEvent()
的方法 getEvents()
returns 事件按降序排列。使用它,将检索到您期望的结果。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
从: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 以获得所需的数组,其中事件标题作为键,日期 objects 作为值?
由此,我无法理解你想要一个数组还是一个object。所以我想提出 2 种模式。在这种情况下,我认为可以使用当前脚本的firstEvents
。
模式 1:
在这个模式中,返回一个数组,其中包括事件标题和开始日期分别是键和值,分别是object。请修改如下。
脚本: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;
});
模式二:
在此模式中,返回一个 object,其中事件标题和开始日期 object 分别是键和值。
脚本: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;
}, {});