การดําเนินการทั่วไปคือองค์ประกอบของรายการเมนูที่อนุญาตให้ผู้ใช้เปิดหน้าเว็บใหม่ แสดงการ์ด UI ใหม่หรือเรียกใช้ฟังก์ชัน Apps Script ที่ต้องการเมื่อเลือก ในวิธีเหล่านี้ การดําเนินการจะคล้ายกับการดําเนินการของบัตร
การใช้การดําเนินการทั่วไปจะช่วยให้แน่ใจได้ว่าผู้ใช้จะสามารถเข้าถึงฟังก์ชันการทํางานบางอย่างได้เสมอ ไม่ว่าส่วนเสริมใดจะทํางานด้วยหรือไม่ก็ตาม ตัวอย่างการใช้งานสําหรับการดําเนินการทั่วไปมีดังนี้
- เปิดหน้าเว็บการตั้งค่า (หรือแสดงการ์ดการตั้งค่า)
- แสดงข้อมูลความช่วยเหลือแก่ผู้ใช้
- เริ่มเวิร์กโฟลว์ใหม่ เช่น "เพิ่มลูกค้าใหม่"
- แสดงการ์ดที่อนุญาตให้ผู้ใช้ส่งความคิดเห็นเกี่ยวกับส่วนเสริม
เมื่อใดก็ตามที่มีการกระทําที่ไม่ได้ขึ้นอยู่กับบริบทปัจจุบัน คุณควรลองทําให้เป็นการดําเนินการทั่วไป
การใช้การดําเนินการส่วนกลาง
การดําเนินการสากลได้รับการกําหนดค่าในโปรเจ็กต์ไฟล์ Manifest ของส่วนเสริม เมื่อกําหนดค่าการดําเนินการส่วนกลางแล้ว การดําเนินการดังกล่าวจะมีผลกับผู้ใช้ส่วนเสริมเสมอ หากผู้ใช้ดูการ์ด ชุดการดําเนินการสากลที่คุณกําหนดไว้จะปรากฏในเมนูการ์ดเสมอหลังจากที่การดําเนินการของการ์ดที่คุณกําหนดไว้สําหรับการ์ดนั้นๆ การดําเนินการทั่วไปจะปรากฏในเมนูของการ์ดตามลําดับเดียวกับที่กําหนดไว้ในไฟล์ Manifest ของส่วนเสริม
การกําหนดค่าการดําเนินการส่วนกลาง
คุณกําหนดค่าการดําเนินการทั่วไปในไฟล์ Manifest ของส่วนเสริมได้ โปรดดูรายละเอียดเพิ่มเติมในไฟล์ Manifest
สําหรับการดําเนินการแต่ละรายการ ให้ระบุข้อความที่ควรจะปรากฏในเมนูของการดําเนินการนั้น จากนั้นคุณสามารถระบุช่อง openLink
ซึ่งระบุว่าการดําเนินการควรเปิดหน้าเว็บในแท็บใหม่โดยตรง หรือจะระบุช่อง runFunction
ที่ระบุฟังก์ชันเรียกกลับของ Apps Script เพื่อเรียกใช้เมื่อเลือกการดําเนินการทั่วไปแล้ว
เมื่อใช้ runFunction
ฟังก์ชันเรียกกลับที่ระบุมักจะทําอย่างใดอย่างหนึ่งต่อไปนี้
- สร้างการ์ด UI เพื่อแสดงโดยทันทีด้วยการส่งคืนออบเจ็กต์
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"
}
]
},
...
},
...
การดําเนินการทั่วไป 3 ข้อที่กําหนดไว้ในตัวอย่างก่อนหน้านี้จะดําเนินการต่อไปนี้
- เปิด google.com เปิด https://www.google.com ในแท็บใหม่
- URL สําหรับติดต่อแบบเปิดจะเรียกใช้ฟังก์ชันที่กําหนด URL ที่จะเปิด แล้วเปิดในแท็บใหม่โดยใช้ออบเจ็กต์
OpenLink
รหัสจะสร้าง URL โดยใช้อีเมลของผู้ส่ง - การตั้งค่าแบบเปิดจะเรียกใช้ฟังก์ชัน
createSettingsCards()
ที่กําหนดไว้ในโปรเจ็กต์สคริปต์ส่วนเสริม ฟังก์ชันนี้จะแสดงผลออบเจ็กต์UniversalActionResponse
ที่ถูกต้องซึ่งมีชุดการ์ดที่มีการตั้งค่าส่วนเสริมและข้อมูลอื่นๆ หลังจากที่ฟังก์ชันสร้างออบเจ็กต์นี้เสร็จแล้ว UI จะแสดงรายการการ์ด (ดูการแสดงการ์ดหลายใบ) - เรียกใช้การเล่นขณะล็อกหน้าจอหรือขณะใช้แอปอื่นจะเรียกใช้ฟังก์ชัน
runBackgroundSync()
ที่ระบุไว้ในโปรเจ็กต์สคริปต์ส่วนเสริม ฟังก์ชันนี้จะไม่สร้างการ์ด แต่จะทํางานในเบื้องหลังอื่นๆ ที่ไม่เปลี่ยน UI เนื่องจากฟังก์ชันไม่แสดงผลUniversalActionResponse
UI จะไม่แสดงการ์ดใหม่เมื่อฟังก์ชันทํางานเสร็จสิ้น แต่ UI จะแสดงไอคอนหมุนแสดงการโหลดขณะที่ฟังก์ชันทํางาน
ตัวอย่างวิธีสร้างฟังก์ชัน 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.
}