Невозможно создать конференцию Google Meet для существующего события календаря Google

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

Я выполнил шаги https://developers.google.com/calendar/create-events?hl=en_US#java, и у меня появилась следующая функция:

(defn add-meet-link-to-calendar-event
  "Adds a meet link to a calendar event."
  [google-ctx calendarId input-event]
  (if input-event
    (let [calendar-service (build-calendar-service google-ctx)
          events           (doto (.events ^Calendar calendar-service)
                             assert)
          conf-req-data (doto (CreateConferenceRequest.)
                          (.setRequestId (generate-random-string))
                          (.setConferenceSolutionKey (.setType (ConferenceSolutionKey.)
                                                               "hangoutsMeet")))
          conference-data (doto (ConferenceData.)
                            (.setCreateRequest conf-req-data)
                            )
          event (doto input-event
                        (.setConferenceData conference-data)
                        (.set "conferenceDataVersion" 1)
                        (.set "sendNotifications" true)
                        )
          eventId (get event "id")
          adding-link   (.patch events calendarId eventId event)]
      (prn "Before executing at add-meet-link-to-calendar-event" calendarId eventId event events)
      (.execute adding-link))))

Как часть входного события для этой функции, я передаю следующий результат другой функции, которая извлекает объект события из календаря Google:

{"attendees" [{"email" "jjj@company.com", 
"responseStatus" "needsAction"} 
{"email" "main@company.com", 
"organizer" true, 
"responseStatus" "accepted", 
"self" true}], 
"created" #object[com.google.api.client.util.DateTime 0x686d6e12 "2020-10-26T15:27:49.000Z"], 
"creator" {"email" "main@company.com", 
"self" true}, 
"end" {"dateTime" #object[com.google.api.client.util.DateTime 0x5a909950 "2020-10-24T22:30:00.000+02:00"]}, 
"etag" "\"3207454201190000\"", 
"htmlLink" "https://www.google.com/calendar/event?eid=M25wb2RtbnNsNWN2N3E3MGVsc2RvYTQwc2ogbmFpaGFAdWJpa2FyZSAAAA", 
"iCalUID" "3npodmnsl5cv7q70elsdoaAAAA@google.com", 
"id" "3npodmnsl5cv7q70elsdoaAAAA", 
"kind" "calendar#event", 
"organizer" {"email" "main@company.com", "self" true}, 
"reminders" {"useDefault" true}, 
"sequence" 0, 
"start" {"dateTime" #object[com.google.api.client.util.DateTime 0x7bcdfc0e "2020-10-24T22:00:00.000+02:00"]}, 
"status" "confirmed", 
"summary" "Another meet test", 
"updated" #object[com.google.api.client.util.DateTime 0xd4057 "2020-10-26T15:45:00.595Z"]}

Я тестировал такие значения, как summary можно обновить, чтобы patchзвонок вроде работает. Но даже добавив conferenceDataVersion и conferenceData похоже, не вносит изменений в происходящее.

Если я вручную изменю событие в календаре Google, я вижу, что к событию добавляются сведения о конференции.

2 ответа

Решение

Вот как мне в итоге удалось это исправить, благодаря информации из ссылки, предоставленной @ale13 ( Встречайте в Google Calendar API):

(defn add-meet-link-to-calendar-event
  "Adds a meet link to a calendar event."
  [google-ctx calendarId eventId]
  (if eventId
    (let [calendar-service (build-calendar-service google-ctx)
          events           (doto (.events ^Calendar calendar-service)
                             assert)
          conf-req-data (doto (CreateConferenceRequest.)
                          (.setRequestId (generate-random-string))
                          (.setConferenceSolutionKey (.setType (ConferenceSolutionKey.)
                                                               "hangoutsMeet")))
          conference-data (doto (ConferenceData.)
                            (.setCreateRequest conf-req-data)
                            )
          event (doto (Event.)
                        (.setConferenceData conference-data))
          adding-link   (.patch events calendarId eventId event)
          set-data-conf (.setConferenceDataVersion adding-link (int 1))
          ]
      (prn "Before executing" calendarId event)
      (.execute set-data-conf))))

Итак, главное здесь то, что conferenceDataVersionvalue не обязательно указывать как часть данных конференции. Это сеттер (setConferenceDataVersion), который должен быть вызван на patch результат.

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

Согласно документации ресурса Calendar API Events:

hangoutLink> Абсолютная ссылка на видеовстречу в Google+, связанную с этим событием. Только для чтения.

По сути, вы не можете изменить hangoutLink через Calendar API.

Вместо этого вы можете отметить ★ проблему в Google Issue Tracker здесь.

Обновить

Вы можете добавить hangoutLinkк событию, сделав следующий запрос, однако вы не можете изменить ссылку, поскольку она назначается автоматически:

Запрос

PATCH https://www.googleapis.com/calendar/v3/calendars/calendarId/events/eventId?conferenceDataVersion=1

Тело

{
  "conferenceData": {
    "createRequest": {
      "conferenceSolutionKey": {
        "type": "eventNamedHangout"
      },
      "requestId": "SOME_STRING"
    }
  }
}

Справка

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