API календаря Google обновляет все события, а не только выбранное событие

Моя текущая проблема заключается в том, что я использую API календаря Google. Когда я пытаюсь исправить событие, API обновляет все будущие события, а не только выбранное событие.

Мой проект выглядит так, Пользователь выбирает дату в календаре, а затем серверу отправляется запрос на получение всех событий за этот день. Затем пользователь может щелкнуть событие, чтобы подтвердить его, и на сервер будет отправлен другой запрос. Во время запроса API календаря должен просто обновить событие для события, на которое нажали.

Из проведенного мной исследования я думаю, что должен использовать повторение, а затем EXDATE, но я попытался расшифровать документы календаря Google и ничего не добился...

Это код, который я пробовал до сих пор.

    adjustEventForTeacher = async(userCalendarLocation, slotId) => {

        let getEventStartTime = await calendar.events.get({
           calendarId: 's',
            eventId: slotId
        })
        const getEventEndTime = getEventStartTime.data.end.dateTime
        getEventStartTime = getEventStartTime.data.start.dateTime
        console.info(getEventStartTime)
        const res = await calendar.events.patch({
            calendarId: 's',
            eventId: slotId,
            requestBody: {
                summary: 'Busy',
                name: 'Busy',
                status: 'confirmed',
                colorId: '0',
                // start: {
                //     dateTime: getEventStartTime
                // },
                // end: {
                //     dateTime: getEventEndTime
                // }
                // recurrence: [ `EXDATE;VALUE=DATE:${getEventStartTime}` ],
            }
            })

        console.info(res.data)
    }

Спасибо.

Я вижу, что даже если я проверю события в будущем, все они будут иметь одинаковый идентификатор, возможно, придется использовать другой подход.

DMantas 27.10.2022 20:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В документации это не слишком ясно, но я понял, как изменить один экземпляр повторяющегося события, проанализировав, как события выглядят в API после изменения в пользовательском интерфейсе.

Как вы уже заметили, использование update или patch изменяет все экземпляры повторяющегося события. Это имеет смысл, поскольку повторяющиеся события по-прежнему имеют только один идентификатор, а их повторение определяется их recurrence[] правилами. Таким образом, календарю не нужно создавать потенциально бесконечное количество новых событий, когда они настроены на ежедневное без ограничений.

Хитрость заключается в том, что вместо этого вы должны использовать метод events.insert для создания нового события, а также указать, что это модификация существующего повторяющегося события. Это делается путем добавления полей recurringEventId и originalStartTime в тело запроса. recurringEventId должен быть идентификатором повторяющегося события, которое вы хотите изменить, а originalStartTime должен содержать startTime и timeZone конкретного экземпляра, который вы хотите изменить.

Полное объяснение: вот пример повторяющегося события в API, которое вы можете найти, создав его в пользовательском интерфейсе и используя events.list для его получения. Фактический вывод длиннее, но я урезал некоторые нерелевантные поля:

  {
   "kind": "calendar#event",
   "id": "<original-recurrent-event>",
   "status": "confirmed",
   "created": "2022-10-28T02:58:32.000Z",
   "updated": "2022-10-28T02:58:32.287Z",
   "summary": "Recurrent event",
   "start": {
    "dateTime": "2022-10-27T21:30:00-06:00",
    "timeZone": "your-timezone"
   },
   "end": {
    "dateTime": "2022-10-27T22:30:00-06:00",
    "timeZone": "your-timezone"
   },
   "recurrence": [
    "RRULE:FREQ=DAILY"
   ],
   "eventType": "default"
  }

Выше показано ежедневно повторяющееся событие. Единственная разница между ним и другими событиями заключается в том, что у него есть правило recurrence. Я заменил фактический идентификатор заполнителем <original-recurrent-event>.

Когда я изменил это событие в пользовательском интерфейсе только на один день, было добавлено новое событие, которое выглядело так:

{
   "kind": "calendar#event",
   "id": "<original-recurrent-event>_20221029T033000Z",
   "status": "confirmed",
   "created": "2022-10-28T02:58:32.000Z",
   "updated": "2022-10-28T02:59:30.474Z",
   "summary": "Modified event",
   "start": {
    "dateTime": "2022-10-28T21:00:00-06:00",
    "timeZone": "your-timezone"
   },
   "end": {
    "dateTime": "2022-10-28T22:00:00-06:00",
    "timeZone": "your-timezone"
   },
   "recurringEventId": "<original-recurrent-event>",
   "originalStartTime": {
    "dateTime": "2022-10-28T21:30:00-06:00",
    "timeZone": "your-timezone"
   },
   },
   "eventType": "default"
  }

Это похоже на обычное новое событие с некоторыми отличиями:

  • Его id не генерируется случайным образом, как обычно. Вместо этого он состоит из исходного идентификатора события и добавляет отметку времени с исходным временем начала в формате UTC.
  • В нем есть поля recurringEventId и originalStartTime, о которых я упоминал ранее.

При всем вышесказанном на практике вам просто нужно вставить новое событие с теми полями, которые для вас выглядели бы примерно так:

    const res = await calendar.events.insert({ // use insert method
        calendarId: 's',
        requestBody: {
            summary: 'Busy',
            name: 'Busy',
            start: {
                dateTime: getEventStartTime
            },
            end: {
                dateTime: getEventEndTime
            },
            recurringEventId:slotId,
            originalStartTime:{
                startTime:getOriginalStartTime,
                timeZone:getTimezone
            }
        }
        })

У меня нет среды Node, чтобы запустить это самостоятельно, но я надеюсь, что это даст вам представление о том, как это сделать. Когда я попробовал это в проводнике API на страницах документации, он работал, как описано. Как ни странно, документация не объясняет эти поля, поэтому я отправил некоторые отзывы в надежде, что они смогут прояснить это на будущее.

Источники:

Вы, сэр, легенда... Я не спал всю ночь и до сих пор не мог заставить его работать... баловался с RRrule и EXDATE... еще раз большое спасибо, если бы я мог отдать вам все свои 93 репутации, я было бы.

DMantas 28.10.2022 10:54

Также, чтобы уточнить для тех, кто запутался, как я, когда он говорит originalStartTime, это дата, когда дата события, которое вы хотите изменить, не является первой датой, когда событие было создано. Допустим, первое событие — 01/01/2000, а затем оно повторяется каждый день. Допустим, вы хотите изменить третий день, который вы бы сделали 03/01/2000 в исходном StartTime.

DMantas 28.10.2022 11:38

После еще одной недели использования календаря Google я нашел это... singleEvents boolean Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False.

DMantas 01.11.2022 17:44

Добавление приведенного выше кода позволяет вам сделать повторяющиеся события с индивидуальными идентификаторами, что позволит вам редактировать их напрямую.

DMantas 01.11.2022 17:44

Другие вопросы по теме