اکشنهای عمومی، عناصری از آیتمهای منو هستند که به کاربر اجازه میدهند هنگام انتخاب، یک صفحه وب جدید باز کند، کارتهای رابط کاربری جدید نمایش دهد یا یک تابع اسکریپت برنامههای خاص را اجرا کند. در عمل، آنها بسیار شبیه به اکشنهای کارت هستند، با این تفاوت که اکشنهای عمومی همیشه روی هر کارت در افزونه شما، صرف نظر از زمینه افزونه فعلی، قرار میگیرند.
با استفاده از اقدامات جهانی، میتوانید مطمئن شوید که کاربر همیشه به عملکردهای خاصی دسترسی دارد، صرف نظر از اینکه با کدام بخش از افزونه شما تعامل دارد. در اینجا چند نمونه از موارد استفاده برای اقدامات جهانی آورده شده است:
- یک صفحه وب تنظیمات را باز کنید (یا یک کارت تنظیمات را نمایش دهید).
- اطلاعات راهنما را به کاربر نشان دهید.
- یک گردش کار جدید، مانند «افزودن مشتری جدید» را شروع کنید.
- کارتی را نمایش دهید که به کاربر اجازه میدهد درباره افزونه بازخورد ارسال کند.
هر زمان که عملی دارید که به زمینه فعلی بستگی ندارد، باید آن را به یک عمل جهانی تبدیل کنید.
استفاده از اقدامات جهانی
اقدامات جهانی در مانیفست پروژه افزونه شما پیکربندی میشوند. پس از پیکربندی یک اقدام جهانی، همیشه برای کاربران افزونه شما در دسترس است. اگر کاربر در حال مشاهده یک کارت باشد، مجموعه اقدامات جهانی که تعریف کردهاید همیشه در منوی کارت، پس از هر اقدام کارتی که برای آن کارت تعریف کردهاید، ظاهر میشود. اقدامات جهانی در منوهای کارت به همان ترتیبی که در مانیفست افزونه تعریف شدهاند، ظاهر میشوند.
پیکربندی اقدامات جهانی
شما اقدامات عمومی را در مانیفست افزونه خود پیکربندی میکنید؛ برای جزئیات بیشتر به مانیفستها مراجعه کنید.
برای هر اقدام، متنی را که باید در منوی مربوط به آن اقدام ظاهر شود، مشخص میکنید. سپس میتوانید یک فیلد 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 را در یک تب جدید باز میکند.
- Open contact URL تابعی را اجرا میکند که تعیین میکند چه URL ای باید باز شود و سپس آن را با استفاده از شیء
OpenLinkدر یک تب جدید باز میکند. این کد، URL را با استفاده از آدرس ایمیل فرستنده میسازد. - تنظیمات باز، تابع
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.
}