Działania w edytorze

Obiekty Action pozwalają tworzyć interaktywne zachowanie w dodatkach do 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 określa też warunek wywołujący działanie. Wywołanie powoduje wykonanie określonej funkcji wywołania zwrotnego. Do funkcji wywołania zwrotnego przekazywany jest obiekt zdarzenia zawierający informacje o interakcjach użytkownika po stronie klienta. Musisz wdrożyć funkcję wywołania zwrotnego, która będzie zwracać określony obiekt 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 tworzenia kart, dodaj funkcję obsługi widżetu przycisku setOnClickAction(action).
  3. Utwórz funkcję wywołania zwrotnego Apps Script do wykonania i określ ją jako (action) w funkcji obsługi widżetu. W takim przypadku funkcja wywołania zwrotnego powinna utworzyć odpowiednią kartę i zwrócić obiekt ActionResponse. Obiekt odpowiedzi informuje dodatek, że ma wyświetlić kartę utworzoną przez funkcję wywołania zwrotnego.

Przykład poniżej pokazuje, jak utworzyć widżet przycisku. Czynność ta żąda zakresu drive.file bieżącego 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 document’s ID
 * @return {editorFileScopeActionResponse}
 */
function onRequestFileScopeButtonClickedInEditor(e) {
  return CardService.newEditorFileScopeActionResponseBuilder()
      .requestFileScopeForActiveDocument().build();

Interakcje z dostępem do plików dla interfejsów API REST

Dodatki do Google Workspace, które rozszerzają możliwości edytorów i korzystają z interfejsów API typu REST, mogą zawierać dodatkowe działanie widżetu żądające dostępu do pliku. To działanie wymaga, by powiązana funkcja wywołania zwrotnego działania zwracała wyspecjalizowany obiekt odpowiedzi:

Podjęto próbę wykonania działania Funkcja wywołania zwrotnego powinna 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:

  • Dodatek korzysta z interfejsów API typu REST.
  • Dodatek wyświetla okno zakresu pliku żądania przy użyciu metody CardService.newEditorFileScopeActionResponseBuilder().requestFileScopeForActiveDocument().build();.
  • Dodatek zawiera w pliku manifestu zakres edytora https://www.googleapis.com/auth/drive.file i aktywację onFileScopeGranted.

Poproś o dostęp do pliku dla bieżącego dokumentu

Aby poprosić o dostęp do pliku dla bieżącego dokumentu, wykonaj te czynności:

  1. Utwórz kartę na stronie głównej, która sprawdza, czy dodatek ma zakres drive.file.
  2. W przypadkach, w których dodatek nie ma zakresu drive.file, utwórz sposób, w jaki użytkownicy mogą poprosić użytkowników o przyznanie zakresu drive.file dla bieżącego dokumentu.

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

Poniższy przykład umożliwia tworzenie interfejsu Dokumentów Google, który wyświetla rozmiar bieżącego dokumentu. Jeśli dodatek nie ma autoryzacji drive.file, wyświetla się przycisk rozpoczynania autoryzacji zakresu plików.

/**
 * 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 document’s ID
 * @return {editorFileScopeActionResponse}
 */
function onRequestFileScopeButtonClicked(e) {
  return CardService.newEditorFileScopeActionResponseBuilder()
      .requestFileScopeForActiveDocument().build();
}