Как работают повторяющиеся события в календаре Google

Я пытаюсь реализовать два способа синхронизации приложения с календарем Google. Я не нашел разумного описания, как работают повторяющиеся события. Они физически дублируются (имеют собственные идентификаторы) в главном событии? API календаря Google (listEvents) возвращает только главное событие с повторениями (строка). Если у повторений нет собственных идентификаторов, как я могу их удалить? Когда я удаляю одно повторяющееся событие из серии (в календаре Google) в данных из API (listEvents), не упоминается об этом пропущенном повторяющемся событии.


person tomasr    schedule 13.12.2013    source источник


Ответы (1)


Повторяющееся событие - это серия единичных событий (экземпляров). Вы можете прочитать об экземплярах по следующей ссылке: https://developers.google.com/google-apps/calendar/v3/reference/events/instances.

Если вы хотите удалить повторяющееся событие (все экземпляры), вам необходимо использовать следующий код:

$rec_event = $this->calendar->events->get('primary', $google_event_id);
if ($rec_event && $rec_event->getStatus() != "cancelled") { 
    $this->calendar->events->delete('primary', $google_event_id); // $google_event_id is id of main event with recurrences
}

Если вы хотите удалить все следующие экземпляры с некоторой даты, вам нужно получить все экземпляры после этой даты, а затем удалить их в цикле:

    $opt_params = array('timeMin' => $isoDate); // date of DATE_RFC3339 format,  "Y-m-d\TH:i:sP"
    $instances = $this->calendar->events->instances($this->calendar_id, $google_event_id, $opt_params);

    if ($instances && count($instances->getItems())) {
      foreach ($instances->getItems() as $instance) {
        $this->calendar->events->delete('primary', $instance->getId());
      }
    }

Если вы хотите добавить исключение (удалить только один экземпляр повторяющегося события), необходимо использовать почти тот же код, но с другим фильтром:

    $opt_params = array('originalStart' => $isoDate); // exception date
    $instances = $this->calendar->events->instances($this->calendar_id, $google_event_id, $opt_params);

    if ($instances && count($instances->getItems())) {
      foreach ($instances->getItems() as $instance) {
        $this->calendar->events->delete('primary', $instance->getId());
      }
    }
person Natali    schedule 24.04.2014
comment
это не то, как следует обрабатывать удаление будущих событий, поскольку может быть бесконечное количество событий (дата / счет окончания не указаны). Вместо этого следует обновить текущее повторяющееся событие, установив новую дату окончания (или соответствующий счетчик), и создать новое повторяющееся событие, начинающееся с той же даты. Дополнительная информация доступна в официальном документе: developers.google.com/calendar/recurringevents. - person vir us; 14.05.2020