【问题标题】:Copy events from one Google Calendar to another, without duplication将活动从一个 Google 日历复制到另一个,不重复
【发布时间】:2014-01-30 21:36:15
【问题描述】:

我正在努力在几个日历之间建立​​一些逻辑。

  • 获取我的日历,
  • 如果事件标题包含“安装”,
    • 在 InstallCalendar 上创建事件。

检索两个日历后,我遇到了困难。我不确定如何在底部优雅地添加我在 cmets 中的逻辑。

function copyInstalls(){
  var now = new Date();
  var later = new Date("January 1, 2015 08:00:00 PDT"); // be lazy for now

  // get my calendar to see whether I have install events scheduled 
  var my_calendar = CalendarApp.getDefaultCalendar();
  var my_install_events =  
  CalendarApp.getCalendarById('example@group.calendar.google.com').getEvents(now, later, {search: 'Install'});


  // snag the Installation Events calendar 
  var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
  var install_events = CalendarApp.getCalendarById('example@group.calendar.google.com').getEvents(now, later, {search: 'Install'});  

  for (var event in my_install_events){

     // if it doesn't exist in install_events, create a new event
     // Not sure how to do this part

  }

}

【问题讨论】:

  • 我有同样的想法/需求,我不知道从哪里开始,否则我可能对你有更多的帮助。我确实创建了一个新线程,也许我可能会得到一些您可以使用的有用信息,也许不会。 stackoverflow.com/questions/22764973/…

标签: google-apps-script google-calendar-api


【解决方案1】:

您需要清楚哪些标准可以确定您的“安装”事件之一是否已经在 InstallCalendar 上。由于您的意图是复制原始事件的副本,因此我们不能期望事件 ID 会相同。 (但是,如果您邀请改为使用 InstallCalendar,它会 - 更好的是,重新安排会自动反映。)

我们可以假设匹配主题中的“安装”+相同的开始时间就足够了。但是,在一个日历上重新安排时间会在另一个日历上孤立该事件,从而导致重复。

更好的选择是将自定义标记应用到 InstallCalendar 中的事件,为方便起见将其设置为原始事件的 ID。然后我们只需要搜索所有先前设置的标签,寻找来自my_calendar 的事件ID 的匹配项。为此,我们可以构建一个包含这些标签的数组:

  // build array of event tags for comparison
  var install_event_Tags = [];
  install_events.forEach( function (event) {
    install_event_Tags.push(event.getTag('origID'));
  });

完成后,我们将确保我们只复制一次事件:

  ...
  my_install_events.forEach( function (event) {
     // if it doesn't exist in install_events, create a new event
    var eventId = event.getId();
    var match = install_event_Tags.indexOf(eventId);
    if (match === -1) {
      // Duplicate the event from my_calendar
      var newEvent = install_calendar.createEvent(event.getTitle(), event.getStartTime(), event.getEndTime());
      // Apply a tag with original event ID
      newEvent.setTag('origID', eventId);
    }
  });

其他问题

您的代码中似乎还有其他问题需要解决。

  1. 在检索my_install_events 时,您将打开共享的example 日历,该日历稍后也用于install_events

      // get my calendar to see whether I have install events scheduled 
      var my_calendar = CalendarApp.getDefaultCalendar();
      var my_install_events =  
      CalendarApp.getCalendarById('example@group.calendar.google.com').getEvents(now, later, {search: 'Install'});
    

    也许你的意思是……

      // get my calendar to see whether I have install events scheduled 
      var my_calendar = CalendarApp.getDefaultCalendar();
      var my_install_events = my_calendar.getEvents(now, later, {search: 'Install'});
                              ^^^^^^^^^^^
    
  2. 本身不是错误,但重复调用 getCalendarById 会减慢您的代码速度。既然你已经算好了install_calendar,那就用吧。

    // snag the Installation Events calendar 
    var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
    var install_events = CalendarApp.getCalendarById('example@group.calendar.google.com').getEvents(now, later, {search: 'Install'});  
    

    更容易维护:

    // snag the Installation Events calendar 
    var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
    var install_events = install_calendar.getEvents(now, later, {search: 'Install'});  
                         ^^^^^^^^^^^^^^^^
    

最终脚本

function copyInstalls(){
  var now = new Date();
  var later = new Date("January 1, 2015 08:00:00 PDT"); // be lazy for now

  // get my calendar to see whether I have install events scheduled 
  var my_calendar = CalendarApp.getDefaultCalendar();
  var my_install_events = my_calendar.getEvents(now, later, {search: 'Install'});

  // snag the Installation Events calendar 
  var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
  var install_events = install_calendar.getEvents(now, later, {search: 'Install'});

  // build array of event tags for comparison
  var install_event_Tags = [];
  install_events.forEach( function (event) {
    install_event_Tags.push(event.getTag('origID'));
  });

  my_install_events.forEach( function (event) {
     // if it doesn't exist in install_events, create a new event
    var eventId = event.getId();
    var match = install_event_Tags.indexOf(eventId);
    if (match === -1) {
      // Duplicate the event from my_calendar
      var newEvent = install_calendar.createEvent(event.getTitle(), event.getStartTime(), event.getEndTime());
      // Apply a tag with original event ID
      newEvent.setTag('origID', eventId);
    }
  });
}

后续步骤

此脚本将制作从my_calendarInstallCalendar 的安装事件的唯一副本。这可能足以满足您的需求。但是,您可能需要考虑其他情况:

  • 如果安装事件存在于InstallCalendar,但被重新安排了怎么办?
  • 如果之前复制到InstallCalendar 的事件从my_calendar 中删除怎么办?
  • 如果之前复制到InstallCalendar 的事件在那里被删除了怎么办?当前脚本会再次复制它,但可能希望的行为也是将其从 my_calendar 中删除。

【讨论】:

  • 哇,谢谢莫格兹达。这个演练太棒了。我意识到我需要解决的问题只是场景的一部分,你的下一步行动已经结束。干杯!
猜你喜欢
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2023-03-28
  • 2018-01-13
相关资源
最近更新 更多