Azioni universali

Le azioni universali sono elementi di menu che consentono a un utente di aprire una nuova pagina web, visualizzare nuove schede dell'interfaccia utente o eseguire una funzione Apps Script specifica quando selezionata. Nel funzionamento sono molto simili alle azioni delle schede, tranne per il fatto che le azioni universali vengono sempre inserite in ogni scheda del componente aggiuntivo, indipendentemente dal contesto attuale del componente aggiuntivo.

Utilizzando le azioni universali, puoi assicurarti che l'utente abbia sempre accesso a determinate funzionalità, indipendentemente dalla parte del componente aggiuntivo con cui interagisce. Ecco alcuni casi d'uso di esempio per le azioni universali:

  • Apri una pagina web delle impostazioni (o visualizza una scheda delle impostazioni).
  • Mostra all'utente le informazioni della guida.
  • Avvia un nuovo flusso di lavoro, ad esempio "Aggiungi nuovo cliente".
  • Mostra una scheda che consente a un utente di inviare feedback sul componente aggiuntivo.

Ogni volta che hai un'azione che non dipende dal contesto attuale, dovresti prendere in considerazione la possibilità di renderla un'azione universale.

Utilizzare le azioni universali

Le azioni universali sono configurate nel manifest del progetto del componente aggiuntivo. Una volta configurata un'azione universale, questa è sempre disponibile per gli utenti del tuo componente aggiuntivo. Se l'utente sta visualizzando una scheda, l'insieme di azioni universali che hai definito viene sempre visualizzato nel menu della scheda, dopo le azioni della scheda che hai definito per quella scheda. Le azioni universali vengono visualizzate nei menu delle schede nello stesso ordine in cui sono definite nel file manifest del componente aggiuntivo.

Configurare le azioni universali

Configura le azioni universali nel manifest del componente aggiuntivo. Per ulteriori dettagli, consulta la sezione Manifest.

Per ogni azione, specifica il testo che deve essere visualizzato nel menu per quell'azione. Puoi quindi specificare un campo openLink che indica che l'azione deve aprire direttamente una pagina web in una nuova scheda. In alternativa, puoi specificare un campo runFunction che specifica una funzione di callback di Apps Script da eseguire quando viene selezionata l'azione universale.

Quando viene utilizzato runFunction, la funzione di callback specificata di solito esegue una delle seguenti operazioni:

  • Crea schede dell'interfaccia utente da visualizzare immediatamente restituendo un oggetto UniversalActionResponse.
  • Apre un URL, magari dopo aver svolto altre attività, restituendo un oggetto UniversalActionResponse integrato.
  • Esegue attività in background che non passano a una nuova scheda o aprono un URL. In questo caso, la funzione di callback non restituisce nulla.

Quando viene chiamata, alla funzione di callback viene passato un oggetto evento contenente informazioni sulla scheda aperta e sul contesto del componente aggiuntivo.

Esempio

Il seguente snippet di codice mostra un estratto di esempio del file manifest per un componente aggiuntivo Google Workspace che utilizza azioni universali durante l'estensione di Gmail. Il codice imposta in modo esplicito un ambito dei metadati in modo che il componente aggiuntivo possa determinare chi ha inviato il messaggio aperto.

  "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"
        }
      ]
    },
    ...
  },
  ...

Le tre azioni universali definite nell'esempio precedente svolgono le seguenti operazioni:

  • Apri google.com si apre https://www.google.com in una nuova scheda.
  • Apri URL contatto esegue una funzione che determina l'URL da aprire e poi lo apre in una nuova scheda utilizzando un oggetto OpenLink. Il codice crea l'URL utilizzando l'indirizzo email del mittente.
  • Apri impostazioni esegue la funzione createSettingsCards() definita nel progetto di script del componente aggiuntivo. Questa funzione restituisce un oggetto UniversalActionResponse valido contenente un insieme di schede con l'impostazione dei componenti aggiuntivi e altre informazioni. Una volta terminata la creazione dell'oggetto, l'interfaccia utente visualizza l'elenco delle schede (vedi Restituzione di più schede).
  • Esegui la sincronizzazione in background esegue la funzione runBackgroundSync() definita nel progetto di script del componente aggiuntivo. Questa funzione non crea schede, ma esegue altre attività in background che non modificano la UI. Poiché la funzione non restituisce un UniversalActionResponse, l'interfaccia utente non mostra una nuova scheda al termine della funzione. L'interfaccia utente mostra invece una rotellina di caricamento mentre la funzione è in esecuzione.

Ecco un esempio di come potresti creare le funzioni openContactURL(), createSettingsResponse() e 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.
}