Creare conferenze di terze parti

Ogni soluzione per conferenze definita nel manifest del progetto di script ha un onCreateFunction associato. Il componente aggiuntivo Google Workspace chiama questa funzione per creare una conferenza ogni volta che un utente tenta di selezionare questa soluzione di conferenza per un evento.

Implementa ogni onCreateFunction descritto nel manifest del componente aggiuntivo. Queste funzioni devono fare quanto segue:

  1. Recuperare le informazioni sugli eventi di Google Calendar, come l'ID evento o l'elenco dei partecipanti, necessarie al sistema di conferenze di terze parti per creare la conferenza.
  2. Connettiti al servizio di conferenze di terze parti e crea una nuova conferenza utilizzando le informazioni dell'evento di Calendar.
  3. Se la richiesta di creazione della conferenza non va a buon fine, utilizza le informazioni sull'errore per creare e restituire un oggetto ConferenceData contenente un ConferenceError. In caso contrario, completa i passaggi successivi.
  4. Inizializza la sincronizzazione della conferenza.
  5. Utilizza le informazioni restituite dal servizio di conferenze di terze parti per creare e restituire un nuovo oggetto ConferenceData.

Recuperare informazioni sull'evento

Per creare una conferenza di terze parti, sono necessarie informazioni sull'evento di Calendar corrispondente. Le informazioni esatte sull'evento richieste variano a seconda dei diversi sistemi di conferenza di terze parti, ma spesso includono l'ora di inizio, l'ora di fine, il riepilogo, l'elenco dei partecipanti e l'ID dell'evento.

Quando viene chiamato, a ogni onCreateFunction che definisci viene passato un argomento che contiene gli ID del calendario e dell'evento. Utilizza questi ID per recuperare le informazioni complete sull'evento utilizzando il servizio avanzato Calendar.

È possibile che Calendar aggiunga i dettagli della conferenza a un evento prima che esista. In questi casi, Calendar passa onCreateFunction un eventId valido, ma le chiamate successive a Calendar.Events.get possono generare un errore che indica che l'evento non esiste. In questi casi, crea la conferenza di terze parti utilizzando dati segnaposto; questi dati vengono sostituiti la volta successiva che l'evento viene sincronizzato.

Crea la conferenza di terze parti

Dopo aver recuperato i dati degli eventi necessari, onCreateFunction deve connettersi al sistema di conferenza di terze parti per creare la conferenza. In genere, questa operazione viene eseguita effettuando richieste API supportate dal sistema di conferenza di terze parti. Consulta la documentazione della tua soluzione di conferenza di terze parti per determinare quali richieste API puoi utilizzare per creare conferenze.

In Google Apps Script, il modo più semplice per gestire le richieste API esterne è utilizzare le librerie open source OAuth2 per Apps Script o OAuth1 per Apps Script. Puoi anche connetterti ad API esterne utilizzando il servizio UrlFetch, ma questo richiede di gestire esplicitamente i dettagli di autorizzazione.

Dopo aver richiesto la creazione della conferenza, potresti dover effettuare richieste aggiuntive per recuperare i nuovi dettagli della conferenza.

Inizializzare la sincronizzazione delle conferenze

Una volta che il componente aggiuntivo ha creato correttamente una conferenza su un sistema di terze parti, sono necessari alcuni passaggi per attivare la sincronizzazione in modo che le modifiche all'evento di Calendar vengano riflesse nella conferenza.

Per informazioni dettagliate sulla configurazione della sincronizzazione dopo la creazione della conferenza, vedi Sincronizzazione delle modifiche di Calendar.

Creare una risposta di dati della conferenza

Utilizzando le informazioni sulla conferenza restituite dal servizio di terze parti, il onCreateFunction deve quindi creare e restituire un oggetto ConferenceData; la sezione Dati della conferenza descrive i contenuti di questo oggetto. Calendar utilizza queste informazioni per indirizzare gli utenti alla conferenza una volta iniziata.

Quando crei un oggetto ConferenceData, tieni presente le lunghezze dei campi, i formati degli URI dei punti di ingresso e le combinazioni consentite di punti di ingresso. Ad esempio, può esserci al massimo un punto di accesso VIDEO in un singolo ConferenceData. Queste limitazioni sono identiche a quelle descritte nell'evento dell'API Calendar per il campo conferenceData corrispondente, anche se non tutti i campi dell'evento API descritti sono disponibili in Apps Script.

Gestisci gli errori

Possono verificarsi errori durante il processo di creazione della conferenza. In alcuni casi, la creazione della conferenza non può essere completata a causa di un errore restituito dal sistema di conferenze di terze parti. In questi casi, il componente aggiuntivo deve gestire la condizione di errore creando e restituendo un oggetto ConferenceData contenente i dettagli di ConferenceError, in modo che Calendar possa agire di conseguenza.

Quando crei un oggetto ConferenceData per segnalare un errore, non devi includere componenti ConferenceData diversi dall'oggetto ConferenceError. ConferenceErrors può avere un ConferenceErrorType, un messaggio di errore e, per i problemi di autenticazione, un URL che consente agli utenti di accedere al sistema di videoconferenza di terze parti.

Il componente aggiuntivo non deve tentare di configurare la sincronizzazione delle conferenze se il tentativo di creazione non è riuscito.

Esempio

Il seguente esempio mostra un'implementazione di onCreateFunction. Il nome della funzione può essere qualsiasi; devi solo definirlo nel manifest del progetto del componente aggiuntivo.

La funzione create3rdPartyConference contatta il sistema di terze parti per creare la conferenza e la funzione getAuthenticationUrl crea un URL di autenticazione del sistema di terze parti. Questi non sono completamente implementati qui.

La funzione initializeSyncing non è mostrata qui; gestisce il lavoro preliminare necessario per la sincronizzazione. Per maggiori dettagli, vedi Sincronizzare le modifiche del calendario.

/**
 *  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;
}