Действия Google Диска

Объекты Action позволяют добавлять интерактивное поведение в дополнения Google Workspace. Они определяют, что происходит, когда пользователь взаимодействует с виджетом (например, кнопкой) в пользовательском интерфейсе дополнения.

Действие прикрепляется к заданному виджету с помощью функции обработчика виджета , которая также определяет условие, запускающее это действие. При запуске действие выполняет указанную функцию обратного вызова . Функция обратного вызова получает объект события , содержащий информацию о взаимодействиях пользователя на стороне клиента. Необходимо реализовать функцию обратного вызова и обеспечить возврат ею определенного объекта ответа.

Например, предположим, вам нужна кнопка, которая при нажатии создает и отображает новую карточку. Для этого необходимо создать новый виджет кнопки и использовать функцию обработчика виджета кнопки setOnClickAction(action) , чтобы задать Action для создания карточки. Определенное вами Action задает функцию обратного вызова Apps Script, которая выполняется при нажатии кнопки. В данном случае вы реализуете функцию обратного вызова для создания нужной карточки и возвращаете объект ActionResponse . Объект ответа сообщает дополнению, что нужно отобразить карточку, созданную функцией обратного вызова.

На этой странице описаны действия виджета, специфичные для Google Drive, которые вы можете добавить в свое дополнение.

Управление взаимодействиями

Дополнения Google Workspace, расширяющие функциональность Drive, могут включать дополнительное действие виджета, специфичное для Drive. Для этого действия требуется, чтобы связанная функция обратного вызова возвращала специализированный объект ответа:

Предпринятые действия Функция обратного вызова должна возвращать
Запросить доступ к выбранным файлам DriveItemsSelectedActionResponse

Для использования действий виджета и объектов ответа необходимо выполнение всех следующих условий:

  • Действие запускается, когда у пользователя выбран один или несколько элементов в Google Диске.
  • В манифест дополнения включена область действия Google Drive https://www.googleapis.com/auth/drive.file .

Запросить доступ к выбранным файлам

В следующем примере показано, как создать контекстный интерфейс для Google Диска, который срабатывает, когда пользователь выбирает один или несколько элементов Диска. В примере проверяется каждый элемент, чтобы убедиться, что надстройке предоставлены права доступа; если нет, используется объект DriveItemsSelectedActionResponse для запроса этих прав у пользователя. После предоставления прав доступа к элементу надстройка отображает использованную квоту Google Диска для этого элемента.

/**
 * Builds a 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 contextual information about
 *    the Drive items selected.
 * @return {Card}
 */
function onDriveItemsSelected(e) {
  var builder =  CardService.newCardBuilder();

  // For each item the user has selected in Drive, display
  // either its quota information or a button that lets the user provide
  // permission to access that file to retrieve its quota details.
  e['drive']['selectedItems'].forEach(
    function(item){
      var cardSection = CardService.newCardSection()
          .setHeader(item['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 (item['addonHasFileScopePermission']) {
        // If the add-on has access permission, read and display its
        // quota.
        cardSection.addWidget(
          CardService.newTextParagraph().setText(
              "This file takes up: " + getQuotaBytesUsed(item['id'])));
      } else {
        // If the add-on doesn't have access permission, add a button
        // that lets the user 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")
          .setParameters({id: item.id});

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

        cardSection.addWidget(button);
      }

      builder.addSection(cardSection);
    });

  return builder.build();
}

/**
 * Callback function for a button action. Instructs Drive to
 * display a permissions dialog to the user, requesting `drive.file` scope
 * for a specific item on behalf of this add-on.
 *
 * @param {Object} e The parameters object that contains the item's
 *   Drive ID.
 * @return {DriveItemsSelectedActionResponse}
 */
function onRequestFileScopeButtonClicked (e) {
  var idToRequest = e.parameters.id;
  return CardService.newDriveItemsSelectedActionResponseBuilder()
      .requestFileScope(idToRequest).build();
}

/**
 * Use the Advanced Drive Service (See
 * https://developers.google.com/apps-script/advanced/drive), with
 * `drive.file` scope permissions to request the quota usage of a specific
 * Drive item.
 *
 * @param {string} itemId The ID of the item to check.
 * @return {string} A description of the item's quota usage, in bytes.
 */
function getQuotaBytesUsed(itemId) {
  try {
    return Drive.Files.get(itemId,{fields: "quotaBytesUsed"})
        .quotaBytesUsed + " bytes";
  } catch (e) {
    return "Error fetching how much quota this item uses. Error: " + e;
  }
}