【问题标题】:How to create chain events from one event on Google Calendar?如何从谷歌日历上的一个事件创建连锁事件?
【发布时间】:2019-09-28 04:49:53
【问题描述】:

我在为一家非营利组织工作,他们希望我安排他们的 Google 日历,这样一旦您创建了一个事件,比如事件 A,它就会自动创建事件 B、C、D 和 E。

例如-如果我创建一个事件“安妮的生日”,那么日历应该自动创建事件(或子事件),例如在截止日期前 1 周的生日计划会议作为事件“B”,4 天前的蛋糕订单截止日期为事件“C”,派对准备购物提前 2 天为事件“D”,在截止日期前的指定日期和时间与受邀者联系提前 1 天为事件“E”,并且应适用于所有类似的未来事件。

【问题讨论】:

    标签: javascript google-apps-script gcal


    【解决方案1】:

    您应该在脚本中创建一个触发事件,当有新事件添加到您的日历时将触发您的函数。

    为此,您必须synchronize your script to your calendar。您可以按照以下步骤操作:

    1. 创建脚本并启用Calendar advance service
    2. 使用Events.list() 为您要跟踪创建的事件的日历获取 nextSyncToken(在开始时运行此函数,仅运行一次):
    function initialSync() {
      var nextSyncToken = Calendar.Events.list('your_calendar_id')["nextSyncToken"];
      var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
      sheet.getRange('A1').setValue(nextSyncToken)
    }
    

    您必须将此 nextSyncToken 存储在某处。我在这个示例中使用了电子表格,但您可以使用数据库或任何适合您的方式(实际上电子表格并不是最安全的数据存储方式,因此我建议您使用其他方式)。

    1. 创建一个触发事件,每当您更新日历中的事件(创建、编辑或删除事件)时就会触发该事件。同样只运行一次这个函数,你只需要一个触发器:
    function createTrigger() {
        var t = ScriptApp.newTrigger("createSubevents")
             .forUserCalendar("your_calendar_id")
             .onEventUpdated()
             .create();
    }
    
    1. 创建函数将在每次创建新事件时创建“子事件”。此函数应与您在刚刚创建的触发器中调用的函数同名。在以下函数中,仅创建了一个“子事件”,重复该过程或创建一个函数来为您要创建多少个子事件执行相同的操作(您应该至少运行一次此函数以获得所有需要的权限):李>
    function createSubevents() {
      // Getting current syncToken from spreadsheet
      var params = {
        syncToken: sheet.getRange('A1').getValue()
      }
      // Retrieve events that were updated since last call
      var events = Calendar.Events.list('your_calendar_id', params);
      var items = events["items"];
      // Update sync token in spreadsheet
      sheet.getRange('A1').setValue(events["nextSyncToken"]);
      // Loop through updated items (in this case, it should only be one)
      for(var i = 0; i < items.length; i++) {
        var item = items[i];
        var mainStartTime = new Date(item.start.date);
        var mainEndTime = new Date(item.end.date);
        var dateCreated = new Date(item.created);
        var dateUpdated = new Date(item.updated);
        // Check if updated event was created (not deleted nor merely edited)
        if (dateUpdated - dateCreated < 1000 && item.status != "cancelled") {
          var mainEventTitle = item.summary;
          // Setting event B title
          var eventBTitle = 'whatever_event_B_is_for ' + mainEventTitle;
          // Setting event B dates
          var numDaysB = 7 // Number of days before main event, edit according to each event
          var startTimeB = mainStartTime;
          startTimeB.setDate(mainStartTime.getDate() - numDaysB);
          var endTimeB = mainEndTime;
          endTimeA.setDate(mainEndTime.getDate() - numDaysB);
          // Creating event B
          createEvent(eventBTitle, startTimeB, endTimeB)
        }
      }
    }
    
    // This function receives a title, a start time and an end time and creates the corresponding event
    function createEvent(title, startTime, endTime) {
      try {
        var calendar = CalendarApp.getCalendarById('your_calendar_id');
        var event = calendar.createEvent(title, startTime, endTime)
        Logger.log(event)
      } catch(err) {
        Logger.log(err)
      }
    }
    

    希望对你有用!

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2013-06-26
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多