Каждое решение для конференции, которое вы определили в манифесте проекта скрипта, имеет связанную функцию onCreateFunction
. Надстройка вызывает эту функцию для создания конференции каждый раз, когда пользователь пытается выбрать это решение для конференции и событие.
Необходимо реализовать каждую onCreateFunction
, описанную в манифесте дополнения. В общем случае эти функции должны выполнять следующие действия:
- Получите любую информацию о событиях из Календаря Google, например идентификатор события или список участников, которая может потребоваться сторонней системе конференций для создания конференции.
- Подключитесь к сторонней службе конференций и создайте там новую конференцию, используя информацию о событиях из Календаря Google.
- Если по какой-то причине запрос на создание конференции не удался, используйте информацию об ошибке для создания и возврата объекта
ConferenceData
, содержащегоConferenceError
. В противном случае выполните следующие шаги.- Инициализируйте синхронизацию конференции.
- Используйте информацию, возвращаемую сторонней службой конференц-связи, для создания и возврата нового объекта
ConferenceData
.
Получение информации о событии
Для создания сторонней конференции требуется определённая информация о соответствующем мероприятии в Google Календаре. Точная информация о мероприятии различается в зависимости от сторонних систем конференц-связи, но часто включает время начала и окончания мероприятия, краткое описание, список участников и идентификатор.
При вызове каждой определяемой вами onCreateFunction
передаётся аргумент, содержащий идентификаторы календаря и событий. Вы можете использовать эти идентификаторы для получения полной информации о событиях с помощью расширенного сервиса Google Calendar .
Google Calendar может добавлять информацию о конференции к событию до его создания. В таких случаях Google Calendar передаёт в onCreateFunction
допустимый eventId
, но последующие вызовы Calendar.Events.get()
могут привести к ошибке, сообщающей об отсутствии события. В таких случаях лучше всего создать стороннюю конференцию, используя данные-заполнители; эти данные будут заменены при следующей синхронизации события.
Создание сторонней конференции
После того, как функция onCreateFunction
получит необходимые данные о событии, она должна подключиться к сторонней системе конференц-связи для создания конференции. Обычно это достигается путём отправки API-запросов, поддерживаемых сторонней системой. Ознакомьтесь с документацией к вашему стороннему решению для конференц-связи, чтобы узнать, какие API-запросы можно использовать для создания конференций.
В Apps Script самый простой способ обработки внешних API-запросов — использование библиотек с открытым исходным кодом OAuth2 for Apps Script или OAuth1 for Apps Script . Вы также можете подключаться к внешним API с помощью сервиса UrlFetch , но для этого потребуется явно указать данные авторизации.
После запроса на создание конференции вам может потребоваться сделать дополнительные запросы для получения новых данных конференции.
Инициализировать синхронизацию конференции
После того как дополнение успешно создаст конференцию в сторонней системе, ему следует выполнить несколько шагов для включения синхронизации , чтобы изменения в событии в Календаре Google отразились в конференции.
Подробную информацию о настройке синхронизации после создания конференции см. в разделе Синхронизация изменений календаря.
Создание ответа на конференц-данные
Используя информацию о конференции, возвращаемую сторонним сервисом, функция onCreateFunction
должна создать и вернуть объект ConferenceData
; раздел «Данные конференции» описывает содержимое этого объекта. Google Calendar использует эту информацию для направления пользователей на конференцию после её начала.
При создании объекта ConferenceData
имейте в виду, что существуют некоторые ограничения на длину полей, форматы URI точек входа и допустимые комбинации точек входа. Например, в одном ConferenceData
может быть не более одной точки входа VIDEO
. Эти ограничения идентичны ограничениям, описанным в разделе "Событие API календаря" (/workspace/calendar/v3/reference/events) для соответствующего поля conferenceData
, хотя не все описанные там поля событий API доступны в Apps Script.
Обработка ошибок
В некоторых случаях создание конференции не может быть завершено из-за ошибки, возвращаемой сторонней системой конференц-связи. В таких случаях ваше дополнение должно эффективно обрабатывать ошибку, создавая и возвращая объект ConferenceData
, содержащий сведения ConferenceError
, чтобы Google Calendar мог действовать соответствующим образом.
При создании объекта ConferenceData
для сообщения об ошибке не требуется включать какие-либо компоненты ConferenceData
, кроме объекта ConferenceError
. ConferenceErrors
может иметь тип ConferenceErrorType
, сообщение об ошибке и, в случае проблем с аутентификацией, URL-адрес, позволяющий пользователям войти в стороннюю систему конференц-связи.
Пример
Ниже показан пример onCreateFunction
(обратите внимание, что имя функции может быть любым; вам нужно только определить его в манифесте проекта надстройки).
Функция create3rdPartyConference()
обращается к сторонней системе для создания конференции, а функция getAuthenticationUrl()
создаёт URL-адрес для аутентификации в сторонней системе. Эти функции здесь реализованы не полностью, поскольку сильно зависят от данных сторонней системы.
Функция initializeSyncing()
здесь не показана; она выполняет всю подготовительную работу, необходимую для синхронизации. Подробнее см. в разделе Синхронизация изменений календаря .
/** * Creates a conference, then builds and returns a ConferenceData object * with the corresponding conference information. This method is called * when a user selects a conference solution defined by the add-on that * uses this function as its 'onCreateFunction' in the add-on manifest. * * @param {Object} arg The default argument passed to a 'onCreateFunction'; * it carries information about the Google Calendar event. * @return {ConferenceData} */ function createConference(arg) { const eventData = arg.eventData; const calendarId = eventData.calendarId; const eventId = eventData.eventId; // Retrieve the Calendar event information using the Calendar // Advanced service. var calendarEvent; try { calendarEvent = Calendar.Events.get(calendarId, eventId); } catch (err) { // The calendar event does not exist just yet; just proceed with the // given event ID and allow the event details to sync later. console.log(err); calendarEvent = { id: eventId, }; } // Create a conference on the third-party service and return the // conference data or errors in a custom JSON object. var conferenceInfo = create3rdPartyConference(calendarEvent); // Build and return a ConferenceData object, either with conference or // error information. var dataBuilder = ConferenceDataService.newConferenceDataBuilder(); if (!conferenceInfo.error) { // No error, so build the ConferenceData object from the // returned conference info. var phoneEntryPoint = ConferenceDataService.newEntryPoint() .setEntryPointType(ConferenceDataService.EntryPointType.PHONE) .setUri('tel:+' + conferenceInfo.phoneNumber) .setPin(conferenceInfo.phonePin); var adminEmailParameter = ConferenceDataService.newConferenceParameter() .setKey('adminEmail') .setValue(conferenceInfo.adminEmail); dataBuilder.setConferenceId(conferenceInfo.id) .addEntryPoint(phoneEntryPoint) .addConferenceParameter(adminEmailParameter) .setNotes(conferenceInfo.conferenceLegalNotice); if (conferenceInfo.videoUri) { var videoEntryPoint = ConferenceDataService.newEntryPoint() .setEntryPointType(ConferenceDataService.EntryPointType.VIDEO) .setUri(conferenceInfo.videoUri) .setPasscode(conferenceInfo.videoPasscode); dataBuilder.addEntryPoint(videoEntryPoint); } // Since the conference creation request succeeded, make sure that // syncing has been enabled. initializeSyncing(calendarId, eventId, conferenceInfo.id); } else if (conferenceInfo.error === 'AUTH') { // Authenentication error. Implement a function to build the correct // authenication URL for the third-party conferencing system. var authenticationUrl = getAuthenticationUrl(); var error = ConferenceDataService.newConferenceError() .setConferenceErrorType( ConferenceDataService.ConferenceErrorType.AUTHENTICATION) .setAuthenticationUrl(authenticationUrl); dataBuilder.setError(error); } else { // Other error type; var error = ConferenceDataService.newConferenceError() .setConferenceErrorType( ConferenceDataService.ConferenceErrorType.TEMPORARY); dataBuilder.setError(error); } // Don't forget to build the ConferenceData object. return dataBuilder.build(); } /** * Contact the third-party conferencing system to create a conference there, * using the provided calendar event information. Collects and retuns the * conference data returned by the third-party system in a custom JSON object * with the following fields: * * data.adminEmail - the conference administrator's email * data.conferenceLegalNotice - the conference legal notice text * data.error - Only present if there was an error during * conference creation. Equal to 'AUTH' if the add-on user needs to * authorize on the third-party system. * data.id - the conference ID * data.phoneNumber - the conference phone entry point phone number * data.phonePin - the conference phone entry point PIN * data.videoPasscode - the conference video entry point passcode * data.videoUri - the conference video entry point URI * * The above fields are specific to this example; which conference information * your add-on needs is dependent on the third-party conferencing system * requirements. * * @param {Object} calendarEvent A Calendar Event resource object returned by * the Google Calendar API. * @return {Object} */ function create3rdPartyConference(calendarEvent) { var data = {}; // Implementation details dependent on the third-party system API. // Typically one or more API calls are made to create the conference and // acquire its relevant data, which is then put in to the returned JSON // object. return data; } /** * Return the URL used to authenticate the user with the third-party * conferencing system. * * @return {String} */ function getAuthenticationUrl() { var url; // Implementation details dependent on the third-party system. return url; }