Warm tip: This article is reproduced from serverfault.com, please click

php-Google日历API>编辑定期事件>此及后续选项>持久异常

(php - Google calendar API > Edit Recurring Events > this and following option > persist exceptions)

发布于 2020-12-07 16:27:07

我从12月11日到12月20日使用Google-calendar-api创建了一个重复系列。我在12月18日使用“仅此事件”选项对单个实例进行了更改(例如:描述)。

然后,我将在12月15日编辑标题,然后选择“此及后续”选项。这会在12月18日(更改描述的地方)重置我的异常,以匹配12月15日的描述。

如Google API文档中所述,在将父系列分为“ this and following”分为两个时,如何保留该系列的例外。

编辑:要创建Google定期活动:

$event = new Google_Service_Calendar_Event([
           'summary'  => $meeting->title,
           'location' => $meeting->location,
           'start' => [
                'date'     => $all_day_startdate,
                'dateTime' => $start_date_time,
                'timeZone' => $timezone
           ],
           'end' => [
               'date'     => $all_day_enddate,
               'dateTime' => $end_date_time,
               'timeZone' => $timezone
           ],
            'conferenceData' => $conference_link,
        ]);

         $event>setRecurrence(array(format_recurrence_rule_for_google($recurrence_pattern)));

        // set Google calendar event parameters.
        $calendar_id = 'primary';
        $opt_params  = [
            'sendNotifications'     => $send_invite,
            'conferenceDataVersion' => 1
        ];

        
        // create the Google calendar event
        $event = $service->events->insert($calendar_id, $event, $opt_params);

要更新单个实例:

$event = new Google_Service_Calendar_Event([
            'summary'  => $meeting->title,
            'location' => $meeting->location,
            'start' => [
                   'date'     => $all_day_startdate,
                   'dateTime' => $start_date_time,
                   'timeZone' => $meet_creator->timezone
             ],
             'end' => [
                   'date'     => $all_day_enddate,
                   'dateTime' => $end_date_time,
                   'timeZone' => $meet_creator->timezone
             ],
             "recurringEventId" => $recurring_event_id,
             "originalStartTime" => [
                    "dateTime" => $exist_event->getOriginalStartTime()->getDateTime(),
                        "timeZone" => $meet_creator->timezone
              ],
              "iCalUID" => $exist_event->getiCalUID(),
            
             'conferenceData' => event_conference($meeting->conference)
            ]);

            $opt_params  = [
                    'conferenceDataVersion' => ($generate_conf || $cancel_conf) ? 1 : 0
                ];

            $calendar_id  = 'primary';
            $updatedEvent = $service->events->insert($calendar_id, $event, $opt_params);

此及后续事件代码段

$current_event = $this->get_instance_with_event_id($parent_meeting);
$rec           = format_recurrence_rule_for_google($parent_meeting->meeting_options->recurrence);

$current_event->setRecurrence(array($rec));

// trim the parent recurring event into two
$service->events->update('primary', $parent_meeting->meeting_options->recurring_event_id, $current_event);

              
 $event = $this->create_initial_calendar_event() // which is the first snippet to create recurring event
Questioner
findX
Viewed
0
fullfine 2020-12-28 16:38:27

简短答案

这不可能

解释

官方文档说明了如何使用重复事件它的一节显示了如何修改以下所有实例,但是按照这些步骤,你将两个分开Recurring Events,并且exception instances将消失。只有一种方法可以修改an的某些参数,instance并将其应用于此事件后续事件,并且使用的网络版本Calendar(它也尊重异常)。

解决方法

  1. 循环播放

    • 循环浏览所有实例,更新所需的实例你可以设置一个条件,只适用,如果礼(更新startdescription)与规范相匹配。

    • 缺点:每次更新只能打一个电话。

  2. 更新并插入(在此处查看官方文档

    • 事件:更新以修剪事件并(重新)定义不更改的实例。正文请求是一个事件资源,它需要使用已创建的所有属性Recurring Event进行recurrence修改后的原始属性,以覆盖所需的日期。
    • 事件:插入以插入具有修改后属性的其余实例。必须像上一步一样定义主体请求及其所有属性。
    • 缺点:它会创建两个不同的对象Recurring Events,并且Event resources必须从零开始定义。它还与例外重叠。
  3. 获取,修补和插入(可以处理一些异常)

    • 事件:获得获得Recurring Event与它的所有信息。
    • 事件:打补丁以修剪事件并保留instances具有的事件exceptions正文请求是Event资源,可以通过两种方式进行定义:
      • 从零:它只需要startendrecurrence使用将patch维护所有其他参数。
      • 从之前使用获得的原始事件get对于你的情况,你需要修改start.dateTimeend.dateTime直到12月15日(和相应的小时数)以及要更改的新参数,例如description
    • 事件:insert插入不带的其余实例exceptionsEvent resource该步骤中使用与原始的克隆Recurring Event有一些属性需要更改:iCalUID = ""id = ""和(针对你的情况recurrence)以便于12月15日停止。
    • 缺点:它会创建两个不同的接口,Recurring Events并需要三个不同的API调用。exceptions只保留一个Recurring Event
  4. 取消实例,插入新事件

    • 事件:实例获取instancesRecurring Event
    • 取消一个实例一的Recurring Event改变它status一个未消除重复事件的取消例外表明,这种情况不应再呈现给用户。
    • 事件:insertEvent resource在与日期相同的日期插入新内容,cancelled instance以便以后对的更改Recurring Event不会更改this exception可以从原始属性获得instance
    • 缺点:异常事件不属于Recurring Event

参考