Универсальные действия — это элементы меню, которые позволяют пользователю открывать новую веб-страницу, отображать новые карточки пользовательского интерфейса или запускать определенную функцию Apps Script при выборе. По принципу работы они очень похожи на действия с карточками , за исключением того, что универсальные действия всегда размещаются на каждой карточке в вашем дополнении, независимо от текущего контекста дополнения.
Используя универсальные действия, вы можете гарантировать, что пользователь всегда будет иметь доступ к определенной функциональности, независимо от того, с какой частью вашего дополнения он взаимодействует. Вот несколько примеров использования универсальных действий:
- Откройте веб-страницу настроек (или отобразите карточку настроек).
- Показать пользователю справочную информацию.
- Запустите новый рабочий процесс, например, «Добавить нового клиента».
- Отобразите карточку, позволяющую пользователю оставить отзыв о дополнении.
Если какое-либо действие не зависит от текущего контекста, следует рассмотреть возможность сделать его универсальным.
Использование универсальных действий
Универсальные действия настраиваются в манифесте проекта вашего дополнения. После настройки универсального действия оно всегда доступно пользователям вашего дополнения. Если пользователь просматривает карточку, набор определенных вами универсальных действий всегда отображается в меню карточки ( ) после любых действий, определенных для этой карточки. Универсальные действия отображаются в меню карточек в том же порядке, в котором они определены в манифесте дополнения.
Настройка универсальных действий
Универсальные действия настраиваются в манифесте вашего дополнения; подробности см. в разделе «Манифесты» .
Для каждого действия вы указываете текст, который должен отображаться в меню для этого действия. Затем вы можете указать поле openLink указывающее, что действие должно напрямую открывать веб-страницу в новой вкладке. В качестве альтернативы вы можете указать поле runFunction , которое задает функцию обратного вызова Apps Script, выполняемую при выборе универсального действия.
При использовании runFunction указанная функция обратного вызова обычно выполняет одно из следующих действий:
- Создает карточки пользовательского интерфейса для немедленного отображения, возвращая созданный объект
UniversalActionResponse. - Открывает URL-адрес, возможно, после выполнения других задач, возвращая созданный объект
UniversalActionResponse. - Выполняет фоновые задачи, которые не переключаются на новую карточку и не открывают URL-адрес. В этом случае функция обратного вызова ничего не возвращает.
При вызове функции обратного вызова ей передается объект события , содержащий информацию об открытой карте и контексте дополнения.
Пример
Приведённый ниже фрагмент кода демонстрирует пример манифеста для дополнения Google Workspace, использующего универсальные действия и расширяющего функциональность Gmail. Код явно задаёт область действия метаданных, чтобы дополнение могло определить, кто отправил открытое сообщение.
"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"
}
]
},
...
},
...
Три универсальных действия, описанные в предыдущем примере, выполняют следующие функции:
- При открытии google.com открывается https://www.google.com в новой вкладке.
- Функция OpenContact URL определяет, какой URL-адрес открыть, и затем открывает его в новой вкладке, используя объект
OpenLink. Код формирует URL-адрес, используя адрес электронной почты отправителя. - Функция `open settings` запускает функцию
createSettingsCards(), определенную в проекте скрипта дополнения. Эта функция возвращает действительный объектUniversalActionResponse, содержащий набор карточек с настройками дополнения и другой информацией. После завершения создания объекта функция отображает список карточек в пользовательском интерфейсе (см. раздел «Возвращение нескольких карточек »). - Функция
runBackgroundSync()определенная в проекте скрипта дополнения, запускает фоновую синхронизацию . Эта функция не создает карточки; вместо этого она выполняет некоторые другие фоновые задачи, которые не изменяют пользовательский интерфейс. Поскольку функция не возвращает объектUniversalActionResponse, пользовательский интерфейс не отображает новую карточку после завершения функции. Вместо этого во время выполнения функции отображается индикатор загрузки.
Вот пример того, как можно создать функции openContactURL() , createSettingsResponse() и 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.
}