Tindakan universal

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Tindakan universal adalah elemen item menu yang memungkinkan pengguna membuka halaman web baru, menampilkan kartu UI baru, atau menjalankan fungsi Apps Script tertentu saat dipilih. Dalam operasinya, prinsip ini sangat mirip dengan tindakan kartu, tetapi tindakan universal tersebut selalu ditempatkan di setiap kartu dalam add-on, terlepas dari konteks add-on saat ini.

Dengan menggunakan tindakan universal, Anda dapat memastikan pengguna selalu memiliki akses ke fungsi tertentu, terlepas dari bagian add-on yang berinteraksi dengan mereka. Berikut adalah beberapa contoh kasus penggunaan untuk tindakan universal:

  • Buka halaman web setelan (atau tampilkan kartu setelan).
  • Menampilkan informasi bantuan kepada pengguna.
  • Memulai alur kerja baru, seperti 'Tambahkan pelanggan baru'.
  • Menampilkan kartu yang memungkinkan pengguna mengirim masukan tentang add-on.

Setiap kali Anda memiliki tindakan yang tidak bergantung pada konteks saat ini, Anda harus mempertimbangkan untuk membuatnya menjadi tindakan universal.

Menggunakan tindakan universal

Tindakan universal dikonfigurasi dalam manifes project add-on. Setelah mengonfigurasi tindakan universal, tindakan tersebut selalu tersedia bagi pengguna add-on. Jika pengguna melihat kartu, serangkaian tindakan universal yang telah Anda tetapkan selalu muncul di menu kartu, setelah setiap tindakan kartu yang Anda tentukan untuk kartu tersebut. Tindakan universal muncul di menu kartu dalam urutan yang sama seperti yang ditentukan dalam manifes add-on.

Mengonfigurasi tindakan universal

Anda mengonfigurasi tindakan universal dalam manifes add-on; lihat Manifes untuk detail selengkapnya.

Untuk setiap tindakan, Anda menentukan teks yang akan muncul di menu untuk tindakan tersebut. Anda kemudian dapat menentukan kolom openLink yang menunjukkan bahwa tindakan tersebut harus langsung membuka halaman web di tab baru. Atau, Anda dapat menentukan kolom runFunction yang menentukan fungsi callback Apps Script yang akan dijalankan saat tindakan universal dipilih.

Saat runFunction digunakan, fungsi callback yang ditentukan biasanya melakukan salah satu hal berikut:

  • Membuat kartu UI untuk segera ditampilkan dengan menampilkan objek UniversalActionResponse yang di-build.
  • Membuka URL, mungkin setelah melakukan tugas lain, dengan menampilkan objek UniversalActionResponse yang di-build.
  • Melakukan tugas latar belakang yang tidak dialihkan ke kartu baru atau membuka URL. Dalam hal ini, fungsi callback tidak menampilkan apa pun.

Saat dipanggil, fungsi callback akan meneruskan objek peristiwa yang berisi informasi tentang kartu terbuka dan konteks add-on.

Contoh

Cuplikan kode berikut menampilkan contoh nukilan manifes untuk Google Workspace add-on yang menggunakan tindakan universal saat memperluas Gmail. Kode secara eksplisit menetapkan cakupan metadata sehingga add-on dapat menentukan siapa yang mengirim pesan terbuka.

  "oauthScopes": [
    "https://www.googleapis.com/auth/gmail.addons.current.message.metadata"
  ],
  "addOns": {
    "common": {
      "name": "Universal Actions Only Addon",
      "logoUrl": "https://www.example.com/hosted/images/2x/my-icon.png",
      "openLinkUrlPrefixes": [
        "https://www.google.com",
        "https://www.example.com/urlbase"
      ],
      "universalActions": [{
          "label": "Open google.com",
          "openLink": "https://www.google.com"
        }, {
          "label": "Open contact URL",
          "runFunction": "openContactURL"
        }, {
          "label": "Open settings",
          "runFunction": "createSettingsResponse"
        }, {
          "label": "Run background sync",
          "runFunction": "runBackgroundSync"
      }],
      ...
    },
    "gmail": {
      "contextualTriggers": [
        {
          "unconditional": {},
          "onTriggerFunction": "getContextualAddOn"
        }
      ]
    },
    ...
  },
  ...

Tiga tindakan universal yang ditentukan dalam contoh sebelumnya melakukan hal berikut:

  • Buka google.com akan membuka https://www.google.com di tab baru.
  • Buka URL kontak menjalankan fungsi yang menentukan URL yang akan dibuka lalu membukanya di tab baru menggunakan objek OpenLink. Kode membuat URL menggunakan alamat email pengirim.
  • Buka setelan menjalankan fungsi createSettingsCards() yang ditentukan dalam project skrip add-on. Fungsi ini menampilkan objek UniversalActionResponse yang valid yang berisi kumpulan kartu dengan setelan add-on dan informasi lainnya. Setelah fungsi selesai mem-build objek ini, UI akan menampilkan daftar kartu (lihat Menampilkan beberapa kartu).
  • Jalankan sinkronisasi latar belakang menjalankan fungsi runBackgroundSync() yang ditentukan dalam project skrip add-on. Fungsi ini tidak mem-build kartu; tetapi menjalankan beberapa tugas latar belakang lain yang tidak mengubah UI. Karena fungsi tidak menampilkan UniversalActionResponse, UI tidak menampilkan kartu baru saat fungsi selesai. Sebagai gantinya, UI menampilkan spinnner indikator pemuatan saat fungsi berjalan.

Berikut adalah contoh cara membuat fungsi openContactURL(), createSettingsResponse(), dan runBackgroundSync():

/**
 * Open a contact URL.
 * @param {Object} e an event object
 * @return {UniversalActionResponse}
 */
function openContactURL(e) {
  // Activate temporary Gmail scopes, in this case so that the
  // open message metadata can be read.
  var accessToken = e.gmail.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);

  // Build URL to open based on a base URL and the sender's email.
  // This URL must be included in the openLinkUrlPrefixes whitelist.
  var messageId = e.gmail.messageId;
  var message = GmailApp.getMessageById(messageId);
  var sender = message.getFrom();
  var url = "https://www.example.com/urlbase/" + sender;
  return CardService.newUniversalActionResponseBuilder()
      .setOpenLink(CardService.newOpenLink()
          .setUrl(url))
      .build();
}

/**
 * Create a collection of cards to control the add-on settings and
 * present other information. These cards are displayed in a list when
 * the user selects the associated "Open settings" universal action.
 *
 * @param {Object} e an event object
 * @return {UniversalActionResponse}
 */
function createSettingsResponse(e) {
  return CardService.newUniversalActionResponseBuilder()
      .displayAddOnCards(
          [createSettingCard(), createAboutCard()])
      .build();
}

/**
 * Create and return a built settings card.
 * @return {Card}
 */
function createSettingCard() {
  return CardService.newCardBuilder()
      .setHeader(CardService.newCardHeader().setTitle('Settings'))
      .addSection(CardService.newCardSection()
          .addWidget(CardService.newSelectionInput()
              .setType(CardService.SelectionInputType.CHECK_BOX)
              .addItem("Ask before deleting contact", "contact", false)
              .addItem("Ask before deleting cache", "cache", false)
              .addItem("Preserve contact ID after deletion", "contactId", false))
          // ... continue adding widgets or other sections here ...
      ).build();   // Don't forget to build the card!
}

/**
 * Create and return a built 'About' informational card.
 * @return {Card}
 */
function createAboutCard() {
  return CardService.newCardBuilder()
      .setHeader(CardService.newCardHeader().setTitle('About'))
      .addSection(CardService.newCardSection()
          .addWidget(CardService.newTextParagraph()
              .setText('This add-on manages contact information. For more '
                  + 'details see the <a href="https://www.example.com/help">'
                  + 'help page</a>.'))
      // ... add other information widgets or sections here ...
      ).build();  // Don't forget to build the card!
}

/**
 * Run background tasks, none of which should alter the UI.
 * Also records the time of sync in the script properties.
 *
 * @param {Object} e an event object
 */
function runBackgroundSync(e) {
  var props = PropertiesService.getUserProperties();
  props.setProperty("syncTime", new Date().toString());

  syncWithContacts();  // Not shown.
  updateCache();       // Not shown.
  validate();          // Not shown.

  // no return value tells the UI to keep showing the current card.
}