1

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

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

4

1 回答 1

1

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

为此,您必须将脚本与日历同步。您可以按照以下步骤操作:

  1. 创建一个脚本并启用日历高级服务
  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)
  }
}

我希望这对你有用!

于 2019-09-30T14:58:15.117 回答