Membuat konferensi pihak ketiga

Setiap solusi konferensi yang ditentukan dalam manifes project skrip Anda memiliki onCreateFunction terkait. Add-on Google Workspace memanggil fungsi ini untuk membuat konferensi setiap kali pengguna mencoba memilih solusi konferensi tersebut untuk suatu acara.

Terapkan setiap onCreateFunction yang dijelaskan dalam manifes add-on Anda. Fungsi ini harus melakukan hal berikut:

  1. Mengambil informasi acara Google Kalender apa pun, seperti ID acara atau daftar tamu, yang diperlukan sistem konferensi pihak ketiga untuk membuat konferensi.
  2. Hubungkan ke layanan konferensi pihak ketiga dan buat konferensi baru di sana menggunakan informasi acara Kalender.
  3. Jika permintaan pembuatan konferensi gagal, gunakan informasi error untuk membuat dan menampilkan objek ConferenceData yang berisi ConferenceError. Jika tidak, selesaikan langkah berikutnya.
  4. Lakukan inisialisasi sinkronisasi konferensi.
  5. Gunakan informasi yang ditampilkan oleh layanan konferensi pihak ketiga untuk membuat dan menampilkan objek ConferenceData baru.

Mengambil informasi acara

Untuk membuat konferensi pihak ketiga, informasi tentang acara Kalender yang sesuai diperlukan. Informasi acara yang tepat yang diperlukan bervariasi antara sistem konferensi pihak ketiga yang berbeda, tetapi sering kali mencakup waktu mulai acara, waktu berakhir, ringkasan, daftar peserta, dan ID.

Saat dipanggil, setiap onCreateFunction yang Anda tentukan akan meneruskan argumen yang berisi ID kalender dan acara. Gunakan ID ini untuk mengambil informasi acara lengkap menggunakan layanan lanjutan Kalender.

Kalender dapat menambahkan detail konferensi ke acara sebelum acara tersebut ada. Dalam kasus seperti itu, Kalender meneruskan onCreateFunction eventId yang valid, tetapi panggilan berikutnya ke Calendar.Events.get dapat menghasilkan error yang menyatakan bahwa acara tidak ada. Dalam kasus ini, buat konferensi pihak ketiga menggunakan data placeholder; data ini akan diganti saat acara disinkronkan berikutnya.

Buat konferensi pihak ketiga

Setelah onCreateFunction mengambil data peristiwa yang diperlukan, onCreateFunction harus terhubung ke sistem konferensi pihak ketiga untuk membuat konferensi. Biasanya hal ini dilakukan dengan membuat permintaan API yang didukung oleh sistem konferensi pihak ketiga. Periksa dokumentasi solusi konferensi pihak ketiga Anda untuk menentukan permintaan API yang dapat Anda gunakan untuk membuat konferensi.

Di Google Apps Script, cara termudah untuk menangani pembuatan permintaan API eksternal adalah dengan menggunakan OAuth2 untuk Apps Script atau OAuth1 untuk Apps Script library open source. Anda juga dapat terhubung ke API eksternal menggunakan layanan UrlFetch, tetapi Anda harus menangani detail otorisasi secara eksplisit.

Setelah meminta pembuatan konferensi, Anda mungkin perlu membuat permintaan tambahan untuk mengambil detail konferensi baru.

Menginisialisasi sinkronisasi konferensi

Setelah add-on berhasil membuat konferensi di sistem pihak ketiga, diperlukan beberapa langkah untuk mengaktifkan sinkronisasi agar perubahan pada acara Kalender tercermin dalam konferensi.

Lihat Menyinkronkan perubahan Kalender untuk mengetahui detail tentang cara menyiapkan sinkronisasi setelah konferensi dibuat.

Membangun respons data konferensi

Dengan menggunakan informasi konferensi yang ditampilkan oleh layanan pihak ketiga, onCreateFunction kemudian harus membuat dan menampilkan objek ConferenceData; bagian Data konferensi menjelaskan konten objek ini. Kalender menggunakan informasi ini untuk mengarahkan pengguna ke konferensi setelah dimulai.

Saat membuat objek ConferenceData, perhatikan panjang kolom, format URI titik entri, dan kombinasi titik entri yang diizinkan. Misalnya, maksimal ada satu titik entri VIDEO dalam satu ConferenceData. Batasan ini identik dengan batasan yang dijelaskan di Acara Calendar API untuk kolom conferenceData yang sesuai, meskipun tidak semua kolom acara API yang dijelaskan di sana tersedia di Apps Script.

Menangani error

Error dapat terjadi selama proses pembuatan konferensi. Dalam beberapa kasus, pembuatan konferensi tidak dapat diselesaikan karena error yang ditampilkan oleh sistem konferensi pihak ketiga. Dalam kasus ini, add-on Anda harus menangani kondisi error dengan membuat dan menampilkan objek ConferenceData yang berisi detail ConferenceError, sehingga Kalender dapat bertindak sesuai dengan itu.

Saat membuat objek ConferenceData untuk melaporkan error, Anda tidak perlu menyertakan komponen ConferenceData selain objek ConferenceError. ConferenceErrors dapat memiliki ConferenceErrorType, pesan error, dan untuk masalah autentikasi, URL yang memungkinkan pengguna login ke sistem konferensi pihak ketiga.

Add-on Anda tidak perlu mencoba menyiapkan sinkronisasi konferensi jika upaya pembuatan konferensi gagal.

Contoh

Contoh berikut menunjukkan penerapan onCreateFunction. Nama fungsi dapat berupa apa saja; Anda hanya perlu menentukannya dalam manifes project add-on.

Fungsi create3rdPartyConference menghubungi sistem pihak ketiga untuk membuat konferensi dan fungsi getAuthenticationUrl membuat URL autentikasi sistem pihak ketiga. Fitur ini belum sepenuhnya diterapkan di sini.

Fungsi initializeSyncing tidak ditampilkan di sini; fungsi ini menangani tugas awal yang diperlukan untuk menyinkronkan. Lihat Menyinkronkan perubahan kalender untuk mengetahui detailnya.

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