如何创建具有开始日期和结束日期的事件系列

How to create an event series with a start date and an end date

首先,如果我的英语不好,因为我是法国人,请见谅。

我在互联网上使用的 google 脚本有问题,该脚本会自动在我的日历中输入假日。

让我详细解释一下:我使用 google 表格来获取输入我的日历所需的所有数据,例如员工的姓名、假期的开始日期、结束日期,以及其他信息,例如邮件和其他信息。开始日期和结束日期带有小时数,以指示假期开始和结束的时间。

这是我的问题,我使用 CreateEventSeries,但是当我使用它时,它会创建一个“栏”直到结束日期,但我希望每天都有一个事件,直到结束日期,在晚上 18 点结束。

这是我使用的代码:

  else if (approval == Approval.Approved && reason == Reason.Vacation) {
    CalendarApp.getCalendarById(email)
      .createEventSeries(
         'CP',
         startDate,
         endDate,
        CalendarApp.newRecurrence().addWeeklyRule()
        .onlyOnWeekdays([CalendarApp.Weekday.MONDAY, CalendarApp.Weekday.TUESDAY, CalendarApp.Weekday.WEDNESDAY, CalendarApp.Weekday.THURSDAY, CalendarApp.Weekday.FRIDAY])
        .until(endDate),

    
            {
              description: message,
              sendInvites: true,
            }
            );

    // Send a confirmation email.
    let subject = 'Congés acceptés';
    MailApp.sendEmail(additionalEmail, subject, message, );

    row[Header.NotifiedStatus] = NotifiedStatus.Notified;

    Logger.log(`Approved, calendar event created, row=${JSON.stringify(row)}`);
      
  }

不知道我说清楚没有。

我不想要全天活动,因为它在日历上不够明显。

简而言之,我想每天从早上 8 点到晚上 18 点创建一个活动系列,并指定开始日期和结束日期。

有人有解决方案或线索吗?

此致

问题:

通过 createEventSeries(title, startTime, endTime, recurrence, options) 创建事件系列时,参数 startTimeendTime 指的是系列中第一个事件的开始和结束时间,不是整个系列的:

startTime: the date and time when the first event in the series starts

endTime: the date and time when the first event in the series ends

这个endTime和你想在until(endDate)设置的完全不一样,until(endDate)指的是系列事件什么时候结束。

代码片段:

例如,如果您希望每天都有一个持续时间为上午 8 点到下午 6 点的活动,比方说,从 5 月 1 日到 15 日,您可以这样做:

const startTime = new Date('May 1, 2021 08:00:00 GMT+01:00');
const endTime = new Date('May 1, 2021 18:00:00 GMT+01:00');
const endDate = new Date('May 15, 2021 18:00:00 GMT+01:00');
const recurrence = CalendarApp.newRecurrence().addWeeklyRule()
    .onlyOnWeekdays([
      CalendarApp.Weekday.MONDAY, 
      CalendarApp.Weekday.TUESDAY, 
      CalendarApp.Weekday.WEDNESDAY, 
      CalendarApp.Weekday.THURSDAY, 
      CalendarApp.Weekday.FRIDAY
    ])
    .until(endDate)
CalendarApp.getCalendarById(email).createEventSeries('CP',startTime,endTime,recurrence);

更新:

假设你已经安装了一个 onFormSubmit 触发器,你的函数可能是这样的:

function createEventSeriesOnSubmit(e) {
  const formResponse = e.response;
  let itemResponses = formResponse.getItemResponses();
  const itemNames = ["startDate", "endDate", "startHour", "endHour"];
  const responses = itemNames.map(itemName => getResponseForItem(itemResponses, itemName));
  const [startDay, endDay, startHour, endHour] = responses;
  const startTime = new Date(`${startDay} ${startHour}`);
  const endTime = new Date(`${startDay} ${endHour}`);
  const endDate = new Date(`${endDay} ${endHour}`);
  const recurrence = CalendarApp.newRecurrence().addWeeklyRule()
      .onlyOnWeekdays([
        CalendarApp.Weekday.MONDAY, 
        CalendarApp.Weekday.TUESDAY, 
        CalendarApp.Weekday.WEDNESDAY, 
        CalendarApp.Weekday.THURSDAY, 
        CalendarApp.Weekday.FRIDAY
      ])
      .until(endDate)
  CalendarApp.getCalendarById(email).createEventSeries('CP',startTime,endTime,recurrence);
}

其中 "startDate", "endDate", "startHour", "endHour" 是表单中相应项目的名称。例如:

正如您在代码示例中看到的,您可以通过插入日期响应和时间响应来构建相应的日期以在日历中使用,如下所示:

const startTime = new Date(`${startDay} ${startHour}`);

生成的日历具有与指定的开始时间、结束时间、开始日期和结束日期相对应的一系列事件: