Объекты Action позволяют добавлять интерактивное поведение в дополнения Google Workspace. Они определяют, что происходит, когда пользователь взаимодействует с виджетом (например, кнопкой) в пользовательском интерфейсе дополнения.
Действие прикрепляется к заданному виджету с помощью функции обработчика виджета , которая также определяет условие, запускающее это действие. При запуске действие выполняет указанную функцию обратного вызова . Функция обратного вызова получает объект события , содержащий информацию о взаимодействиях пользователя на стороне клиента. Необходимо реализовать функцию обратного вызова и обеспечить возврат ею определенного объекта ответа.
Например, предположим, вам нужна кнопка, которая при нажатии создает и отображает новую карточку. Для этого необходимо создать новый виджет кнопки и использовать функцию обработчика виджета кнопки setOnClickAction(action) , чтобы задать Action для создания карточки. Определенное вами Action задает функцию обратного вызова Apps Script, которая выполняется при нажатии кнопки. В данном случае вы реализуете функцию обратного вызова для создания нужной карточки и возвращаете объект ActionResponse . Объект ответа сообщает дополнению, что нужно отобразить карточку, созданную функцией обратного вызова.
На этой странице описаны действия виджета, специфичные для Google Диска, которые вы можете включить в свое дополнение.
Управление взаимодействиями
Дополнения Google Workspace, расширяющие функциональность Drive, могут включать дополнительное действие виджета, специфичное для Drive. Для этого действия требуется, чтобы связанная функция обратного вызова возвращала специализированный объект ответа:
| Предпринятые действия | Функция обратного вызова должна возвращать |
|---|---|
| Запросить доступ к выбранным файлам | DriveItemsSelectedActionResponse |
Для использования действий виджета и объектов ответа необходимо выполнение всех следующих условий:
- Действие запускается, когда у пользователя выбран один или несколько элементов в Google Диске.
- В манифест дополнения включена область действия Google Drive
https://www.googleapis.com/auth/drive.file.
Запросить доступ к выбранным файлам
В следующем примере показано, как создать контекстный интерфейс для Google Drive, который срабатывает, когда пользователь выбирает один или несколько элементов Drive. В примере проверяется каждый элемент, чтобы убедиться, что надстройке предоставлены права доступа; если нет, используется объект DriveItemsSelectedActionResponse для запроса этих прав у пользователя. После предоставления прав доступа к элементу надстройка отображает использованную квоту Drive для этого элемента.
/**
* 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 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 allows the user to 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 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")
.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;
}
}