【问题标题】:Google Apps Script Calendar Service: Get only the first events of all recurring (all day) eventsGoogle Apps 脚本日历服务:仅获取所有重复(全天)事件的第一个事件
【发布时间】:2020-06-22 14:47:46
【问题描述】:

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

【问题讨论】:

    标签: javascript arrays google-apps-script calendar


    【解决方案1】:
    • 您想从 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;
    });
    

    模式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;
    }, {});
    

    【讨论】:

    • 您的回答堪称典范。非常感谢! getEvents() 不是按升序返回事件吗?所以你会 for 循环遍历结果数组 firstEvents 以获得所需的数组,其中事件标题作为键,Date 对象作为值?
    • @Ben 感谢您回复并指出我的英语。我以为我可能误解了“上升”和“下降”。我想说getEvents() 检索到的数组的第一个索引是最旧的事件。我为我糟糕的英语水平深表歉意。关于the desired array with the event titles as keys and Date objects as values,我更新了我的答案。你能确认一下吗?如果这不是您想要的方向,我再次道歉。
    • 其实我指的不是你的英语,而是你的回答的排列整齐和礼貌。但无论如何,你的英语可能比我的好得多。由于第一个事件是最古老的,我将顺序称为升序,但这可能是一个见仁见智的问题。模式1就好了。非常感谢!顺便说一句,完全没有必要道歉。 :)
    • @Ben 感谢您的回复。我很高兴你的问题得到了解决。我也可以从你的问题中学习。也谢谢你。
    • 似乎firstEvents 不仅拥有活动系列的第一个活动,而且还分别拥有(当前)最后一个活动!?
    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 2020-10-05
    • 2016-07-04
    相关资源
    最近更新 更多