Działania w edytorze

Użyj obiektów Action, aby dodać interaktywne zachowania do dodatków Google Workspace.

Obiekty działań określają, co się dzieje, gdy użytkownik wchodzi w interakcję z widżetem (np. przyciskiem) w interfejsie dodatku.

Dodawanie działania do widżetu

Aby dołączyć działanie do widżetu, użyj funkcji obsługi widżetu, która definiuje też warunek wywołujący działanie. Po wywołaniu działanie wykona określone wywołanie zwrotne. Do funkcji wywołania zwrotnego przekazywany jest obiekt zdarzenia, który zawiera informacje o interakcjach użytkownika po stronie klienta. Musisz zaimplementować funkcję wywołania zwrotnego i skierować ją do zwrócenia określonego obiektu odpowiedzi.

Przykład: wyświetlanie nowej karty po kliknięciu przycisku

Jeśli chcesz dodać do dodatku przycisk, który po kliknięciu tworzy i wyświetla nową kartę, wykonaj te czynności:

  1. Utwórz widżet przycisku.
  2. Aby ustawić działanie związane z tworzeniem karty, dodaj funkcję obsługi widżetu przycisku setOnClickAction(action).
  3. Utwórz funkcję wywołania zwrotnego Apps Script, która ma zostać wykonana, i wskaż ją jako parametr (action) w funkcji obsługi widżetu. W tym przypadku funkcja wywołania powinna utworzyć odpowiednią kartę i zwrócić obiekt ActionResponse. Obiekt odpowiedzi informuje dodatek, aby wyświetlił kartę utworzoną przez funkcję wywołania zwrotnego.

Ten przykład pokazuje tworzenie widżetu przycisku. Działania te wymagają uprawnień drive.file w bieżącym pliku w imieniu dodatku.

/**
 * Adds a section to the Card Builder that displays a "REQUEST PERMISSION" button.
 * When it's clicked, the callback triggers file scope permission flow. This is used in
 * the add-on when the home-page displays basic data.
 */
function addRequestFileScopeButtonToBuilder(cardBuilder) {
    var buttonSection = CardService.newCardSection();
    // If the add-on does not have access permission, add a button that
    // allows the user to provide that permission on a per-file basis.
    var buttonAction = CardService.newAction()
      .setFunctionName("onRequestFileScopeButtonClickedInEditor");

    var button = CardService.newTextButton()
      .setText("Request permission")
      .setBackgroundColor("#4285f4")
      .setTextButtonStyle(CardService.TextButtonStyle.FILLED)
      .setOnClickAction(buttonAction);

    buttonSection.addWidget(button);
    cardBuilder.addSection(buttonSection);
}

/**
 * Callback function for a button action. Instructs Docs to display a
 * permissions dialog to the user, requesting `drive.file` scope for the 
 * current file on behalf of this add-on.
 *
 * @param {Object} e The parameters object that contains the documents ID
 * @return {editorFileScopeActionResponse}
 */
function onRequestFileScopeButtonClickedInEditor(e) {
  return CardService.newEditorFileScopeActionResponseBuilder()
      .requestFileScopeForActiveDocument().build();

Interakcje dotyczące dostępu do plików w przypadku interfejsów API REST

Dodatki Google Workspace, które rozszerzają edytory i korzystają z interfejsów API REST, mogą zawierać dodatkową akcję widżetu, aby poprosić o dostęp do plików. To działanie wymaga, aby powiązana funkcja wywołania zwrotnego działania zwróciła specjalny obiekt odpowiedzi:

Podejmowane działanie Wywołanie zwrotne powinno zwrócić
Poproś o dostęp do pliku current_document EditorFileScopeActionResponse

Aby można było użyć tego obiektu działania i odpowiedzi widżetu, muszą być spełnione wszystkie te warunki:

  • Wtyczka korzysta z interfejsów API REST.
  • Dodatek wyświetla okno zakresu pliku żądania za pomocą metody CardService.newEditorFileScopeActionResponseBuilder().requestFileScopeForActiveDocument().build();.
  • W pliku manifestu dodatku musi być uwzględniony zakres edycji https://www.googleapis.com/auth/drive.file i wyzwalacz onFileScopeGranted.

Prośba o dostęp do pliku w bieżącym dokumencie

Aby poprosić o dostęp do pliku w bieżącym dokumencie, wykonaj te czynności:

  1. Utwórz kartę na stronie głównej, która sprawdza, czy dodatek ma zakres drive.file.
  2. W przypadku, gdy dodatek nie ma przyznanego zakresu drive.file, zaimplementuj sposób prośby o przyznanie użytkownikom zakresu drive.file dla bieżącego dokumentu.

Przykład: uzyskanie dostępu do bieżącego dokumentu w Dokumentach Google

W tym przykładzie tworzymy interfejs Dokumentów Google, który wyświetla rozmiar bieżącego dokumentu. Jeśli wtyczka nie ma uprawnień drive.file, wyświetli się przycisk umożliwiający zainicjowanie autoryzacji zakresu pliku.

/**
 * Build a simple card that checks selected items' quota usage. Checking
 * quota usage requires user-permissions, so this add-on provides a button
 * to request `drive.file` scope for items the add-on doesn't yet have
 * permission to access.
 *
 * @param e The event object passed containing information about the
 *   current document.
 * @return {Card}
 */
function onDocsHomepage(e) {
  return createAddOnView(e);
}

function onFileScopeGranted(e) {
  return createAddOnView(e);
}

/**
 * For the current document, display either its quota information or
 * a button that allows the user to provide permission to access that
 * file to retrieve its quota details.
 *
 * @param e The event containing information about the current document
 * @return {Card}
 */
function createAddOnView(e) {
  var docsEventObject = e['docs'];
  var builder =  CardService.newCardBuilder();

  var cardSection = CardService.newCardSection();
  if (docsEventObject['addonHasFileScopePermission']) {
    cardSection.setHeader(docsEventObject['title']);
    // This add-on uses the recommended, limited-permission `drive.file`
    // scope to get granular per-file access permissions.
    // See: https://developers.google.com/drive/api/v2/about-auth
    // If the add-on has access permission, read and display its quota.
    cardSection.addWidget(
      CardService.newTextParagraph().setText(
          "This file takes up: " + getQuotaBytesUsed(docsEventObject['id'])));
  } else {
    // If the add-on does not have access permission, add a button that
    // allows the user to provide that permission on a per-file basis.
    cardSection.addWidget(
      CardService.newTextParagraph().setText(
          "The add-on needs permission to access this file's quota."));

    var buttonAction = CardService.newAction()
      .setFunctionName("onRequestFileScopeButtonClicked");

    var button = CardService.newTextButton()
      .setText("Request permission")
      .setOnClickAction(buttonAction);

    cardSection.addWidget(button);
  }
  return builder.addSection(cardSection).build();
}

/**
 * Callback function for a button action. Instructs Docs to display a
 * permissions dialog to the user, requesting `drive.file` scope for the
 * current file on behalf of this add-on.
 *
 * @param {Object} e The parameters object that contains the documents ID
 * @return {editorFileScopeActionResponse}
 */
function onRequestFileScopeButtonClicked(e) {
  return CardService.newEditorFileScopeActionResponseBuilder()
      .requestFileScopeForActiveDocument().build();
}