בדף הזה מוסבר איך אפליקציית Chat יכולה לפתוח תיבות דו-שיח כדי להגיב למשתמשים.
תיבות דו-שיח הן ממשקים מבוססי כרטיסים עם חלון שנפתחים ממרחב משותף או מהודעה ב-Chat. תיבת הדו-שיח תכנים גלויים רק למשתמש שפתח אותם.
אפליקציות ל-Chat יכולות להשתמש בתיבות דו-שיח כדי לבקש ולאסוף מידע מ- משתמשי Chat, כולל טפסים עם מספר שלבים. אפשר לקרוא פרטים נוספים מידע על יצירת קלט לטפסים מופיע במאמר איסוף ועיבוד של מידע ממשתמשים.
דרישות מוקדמות
Node.js
- אפליקציית Google Chat שמופעלת בה תכונות אינטראקטיביות. כדי ליצור להשתמש בשירות HTTP באפליקציית Chat האינטראקטיבית. במדריך למתחילים מוסבר איך עושים את זה.
Python
- אפליקציית Google Chat שמופעלת בה תכונות אינטראקטיביות. כדי ליצור להשתמש בשירות HTTP באפליקציית Chat האינטראקטיבית. במדריך למתחילים מוסבר איך עושים את זה.
Apps Script
- אפליקציית Google Chat שמופעלת בה תכונות אינטראקטיביות. כדי ליצור כדי להשתמש באפליקציית Chat האינטראקטיבית ב-Apps Script, צריך להשלים את המדריך למתחילים.
פתיחה של תיבת דו-שיח
בקטע הזה נסביר איך להשיב ולהגדיר תיבת דו-שיח באמצעות הפעולות הבאות:
- מפעילים את הבקשה לתיבת הדו-שיח בעקבות אינטראקציה של המשתמש.
- כדי לטפל בבקשה, חוזרים ופותחים תיבת דו-שיח.
- לאחר שמשתמשים שולחים מידע, אפשר לעבד את השליחה על ידי סגירת או חזרה תיבת דו-שיח אחרת.
שליחת בקשה לתיבת דו-שיח
אפליקציית Chat יכולה לפתוח רק תיבות דו-שיח כדי להשיב למשתמש אינטראקציה, כמו פקודה של קו נטוי או לחיצה על לחצן מהודעה בכרטיס.
כדי לענות למשתמשים באמצעות תיבת דו-שיח, אפליקציית Chat צריכה ליצור אינטראקציה שמפעילה את הבקשה לתיבת הדו-שיח, למשל:
- תגובה לפקודה של קו נטוי. כדי להפעיל את הבקשה מפקודה לוכסן, צריך לסמן את התיבה פתיחה של תיבת דו-שיח בזמן הגדרת הפקודה.
- להגיב ללחיצה על לחצן
message,
כחלק מכרטיס או בחלק התחתון של ההודעה. כדי להפעיל את
מלחצן בהודעה, אתם מגדירים את
לחצן
onClick
על ידי הגדרה שלinteraction
ל-OPEN_DIALOG
שלו. - לענות על לחיצה על לחצן בדף הבית של אפליקציית Chat. למידע נוסף על פתיחה של תיבות דו-שיח מדפי הבית: איך יוצרים דף בית לאפליקציית Google Chat?
קובץ ה-JSON הבא מראה איך להפעיל בקשת תיבת דו-שיח מלחצן
הודעה בכרטיס. כדי לפתוח את תיבת הדו-שיח,
button.interaction
השדה מוגדר ל-OPEN_DIALOG
:
{
"buttonList": { "buttons": [{
"text": "BUTTON_TEXT",
"onClick": { "action": {
"function": "FUNCTION_NAME",
"interaction": "OPEN_DIALOG"
}}
}]}
}
כאשר BUTTON_TEXT הוא הטקסט שמוצג בלחצן ו-FUNCTION_NAME היא הפונקציה שרצה לפתוח את
פתיחת תיבת הדו-שיח הראשונית
כשמשתמש מפעיל בקשה לתיבת דו-שיח, אפליקציית Chat
מקבל אירוע אינטראקציה, שמיוצג בתור
event
מקלידים את
Chat API. אם האינטראקציה מפעילה בקשה בתיבת דו-שיח, הפרמטר
השדה dialogEventType
מוגדר ל-REQUEST_DIALOG
.
כדי לפתוח תיבת דו-שיח, אפליקציית Chat יכולה לענות
בקשה באמצעות החזרת
actionResponse
כש-type
מוגדר ל-DIALOG
ו-
Message
לאובייקט. כדי לציין את התוכן של תיבת הדו-שיח, צריך לכלול את הפרטים הבאים:
אובייקטים:
actionResponse
כש-type
מוגדר ל-DIALOG
.dialogAction
לאובייקט. השדהbody
מכיל את רכיבי ממשק המשתמש (UI) כדי להציג בכרטיס, כולל תווית אחת או יותר.sections
מהווידג'טים. כדי לאסוף מידע ממשתמשים, ניתן לציין ווידג'טים של קלט טופס ווידג'ט הלחצנים. למידע נוסף על עיצוב קלט בטופס, אפשר לעיין במאמר איסוף ועיבוד של מידע ממשתמשים.
קובץ ה-JSON הבא מראה איך אפליקציית Chat מחזירה תשובה שפותחת תיבת דו-שיח:
{ "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{
"widgets": [{
WIDGETS,
{ "buttonList": { "buttons": [{
"text": "BUTTON_TEXT",
"onClick": {
"action": {"function": "FUNCTION_NAME"}
}
}]}}
}]
}]}}}
}}
כאשר BUTTON_TEXT הוא הטקסט שמוצג בלחצן (למשל
Next
או Submit
), WIDGETS מייצג אחד או יותר
ווידג'טים של קלט טפסים
FUNCTION_NAME היא הפונקציה שרצה כשמשתמשים לוחצים על לחצן.
טיפול בשליחה של תיבת הדו-שיח
כשמשתמשים לוחצים על לחצן ששולח תיבת דו-שיח, הפרמטר
אפליקציית Chat מקבלת
אינטראקציה ב-CARD_CLICKED
אירוע שבו dialogEventType
היא SUBMIT_DIALOG
.
אפליקציית Chat צריכה לטפל באירוע האינטראקציה עד לבצע אחת מהפעולות הבאות:
- החזרת תיבת דו-שיח אחרת כדי לאכלס כרטיס אחר או את הטופס.
- סוגרים את תיבת הדו-שיח אחרי אימות הנתונים שהמשתמש שלח. אם רוצים, אפשר לשלוח הודעת אישור.
אופציונלי: החזרת תיבת דו-שיח נוספת
אחרי שהמשתמשים ישלחו את תיבת הדו-שיח הראשונית, אפליקציות Chat יוכלו להחזיר תיבת דו-שיח נוספת אחת או יותר כדי לעזור למשתמשים לעיין במידע לפני כן לשלוח, למלא טפסים רב-שלביים או לאכלס את תוכן הטופס באופן דינמי.
כדי לטעון נתונים שהמשתמשים מזינים בתיבת הדו-שיח הראשונית, צריך להוסיף
פרמטרים ללחצן שפותח את תיבת הדו-שיח הבאה, או להעביר את
אירוע האינטראקציה CARD_CLICKED
בתיבת הדו-שיח הראשונית. פרטים נוספים זמינים במאמר
העברת נתונים לכרטיס אחר.
בדוגמה הזו, באפליקציית Chat נפתחת תיבת דו-שיח
מחזירה תיבת דו-שיח שנייה לפני השליחה. כדי לטעון את נתוני הקלט,
אפליקציית Chat עוברת בהצלחה את אירוע האינטראקציה CARD_CLICKED
בתור פרמטר לפונקציה פותחת את תיבת הדו-שיח הבאה:
Node.js
// Respond to button clicks on attached cards
if (event.type === "CARD_CLICKED") {
// Open the first dialog.
if (event.common.invokedFunction === "openDialog") {
openDialog(event);
}
// Open the second dialog.
if (event.common.invokedFunction === "openNextDialog") {
openNextDialog(event);
}
}
/**
* Opens and starts a dialog that lets users add details about a contact.
*
* @param {object} event the event object from Google Chat.
*
* @return {object} open a dialog.
*/
function openDialog(event) {
res.json({ "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{ "widgets": [
WIDGETS,
{ "buttonList": { "buttons": [{
"text": "Next",
"onClick": { "action": {
"function": "openNextDialog"
}}
}]}}
]}]}}}
}});
};
/**
* Opens a second dialog that lets users add more contact details.
*
* @param {object} event the event object from Google Chat.
*
* @return {object} open a dialog.
*/
function openNextDialog(event) {
res.json({ "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{ "widgets": [
WIDGETS,
{
"horizontalAlignment": "END",
"buttonList": { "buttons": [{
"text": "Submit",
"onClick": { "action": {
"function": "submitDialog"
}}
}]}
}
]}]}}}
}});
}
Python
from typing import Any, Mapping
import flask
import functions_framework
@functions_framework.http
def main(req: flask.Request) -> Mapping[str, Any]:
"""Responds to a MESSAGE event in Google Chat that includes the /createContact
slash command by opening a dialog.
Args:
req (flask.Request): the event object from Chat API.
Returns:
Mapping[str, Any]: open a Dialog in response to a card's button click.
"""
if req.method == 'GET':
return 'Sorry, this function must be called from a Google Chat.'
request = req.get_json(silent=True)
if request.get('type') == 'CARD_CLICKED':
if invoked_function := request.get('common', dict()).get('invokedFunction'):
if invoked_function == 'open_dialog':
return open_dialog(request)
elif invoked_function == 'open_next_dialog':
return open_dialog(request)
def open_dialog(request: Mapping[str, Any]) -> Mapping[str, Any]:
"""Opens a dialog in Google Chat.
Args:
request (Mapping[str, Any]): the event object from Chat API.
Returns:
Mapping[str, Any]: open a Dialog in response to a card's button click.
"""
return { "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{ "widgets": [
WIDGETS,
{ "buttonList": { "buttons": [{
"text": "Next",
"onClick": { "action": {
"function": "open_next_dialog"
}}
}]}}
]}]}}}
}}
def open_next_dialog(request: Mapping[str, Any]) -> Mapping[str, Any]:
"""Opens a second dialog that lets users add more contact details.
Args:
request (Mapping[str, Any]): the event object from Chat API.
Returns:
Mapping[str, Any]: open a Dialog in response to a card's button click.
"""
return { "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{ "widgets": [
WIDGETS,
{
"horizontalAlignment": "END",
"buttonList": { "buttons": [{
"text": "Submit",
"onClick": { "action": {
"function": "submit_dialog"
}}
}]}
}
]}]}}}
}}
Apps Script
בדוגמה הזו, נשלחת הודעה בכרטיס על ידי חזרה כרטיס JSON. אפשר גם להשתמש שירות הכרטיסים של Apps Script.
/**
* Responds to a CARD_CLICKED event in Google Chat.
*
* @param {Object} event the event object from Google Chat
*/
function onCardClick(event) {
// When a user clicks a card, the Chat app checks to see which function to run.
if (event.common.invokedFunction === "openDialog") {
return openDialog(event);
}
if (event.common.invokedFunction === "openNextDialog") {
return openNextDialog(event);
}
}
/**
* Opens and starts a dialog that lets users add details about a contact.
*
* @param {object} event the event object from Google Chat.
*
* @return {object} open a dialog.
*/
function openDialog(event) {
return { "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{ "widgets": [
WIDGETS,
{ "buttonList": { "buttons": [{
"text": "Next",
"onClick": { "action": {
"function": "openNextDialog"
}}
}]}}
]}]}}}
}};
}
/**
* Opens a second dialog that lets users add more contact details.
*
* @param {object} event the event object from Google Chat.
*
* @return {object} open a dialog.
*/
function openNextDialog(event) {
return { "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{ "widgets": [
WIDGETS,
{
"horizontalAlignment": "END",
"buttonList": { "buttons": [{
"text": "Submit",
"onClick": { "action": {
"function": "submitDialog"
}}
}]}
}
]}]}}}
}};
}
כאשר WIDGETS מייצג אחד או יותר ווידג'טים של קלט בטופס.
סגור את תיבת הדו-שיח
כשמשתמשים לוחצים על לחצן בתיבת דו-שיח, הפרמטר אפליקציית Chat מקבלת אירוע אינטראקציה עם הבאים:
eventType
CARD_CLICKED
.dialogEventType
SUBMIT_DIALOG
.common.formInputs
מכיל את כל הנתונים שמשתמשים מזינים באמצעות ווידג'טים.
בקטעים הבאים מוסבר איך לאמת את הנתונים שמשתמשים מזינים סוגרים את תיבת הדו-שיח.
אימות נתוני הקלט של המשתמשים וסגירה של תיבת הדו-שיח
כדי לעבד את הנתונים שהמשתמשים מזינים, אפליקציית Chat
משתמשת ב
event.common.formInputs
לאובייקט. לקבלת מידע נוסף על אחזור ערכים מווידג'טים של קלט, ראו
איסוף ועיבוד של מידע ממשתמשים.
אם המשתמש לא ימלא שדה חובה או יזין ערכים שגויים, הפונקציה
אפליקציית Chat יכולה להגיב עם שגיאה על ידי החזרת
ActionResponse
שיש לו "actionStatus": "ERROR MESSAGE"
.
הדוגמה הבאה מוודאת שמשתמש מזין ערך לווידג'ט
מקבל מחרוזות (stringInputs
), כמו ווידג'ט textInput
. אם השדה חסר,
הודעת השגיאה תופיע באפליקציית Chat. אם יש כזו,
אפליקציית Chat מאשרת שליחה של תיבת דו-שיח
סוגר את תיבת הדו-שיח:
Node.js
/**
* Checks for a form input error, the absence of
* a "name" value, and returns an error if absent.
* Otherwise, confirms successful receipt of a dialog.
*
* Confirms successful receipt of a dialog.
*
* @param {Object} event the event object from Chat API.
*
* @return {Object} open a Dialog in Google Chat.
*/
function submitDialog(event) {
// Checks to make sure the user entered a value
// in a dialog. If no value detected, returns
// an error message. Any "actionStatus" value other than "OK"
// gets returned as an error.
if (event.common.formInputs.WIDGET_NAME.stringInputs.value[0] === "") {
res.json({
"actionResponse": {
"type": "DIALOG",
"dialogAction": {
"actionStatus": "ERROR_MESSAGE"
}
}
});
// Otherwise the Chat app indicates that it received
// form data from the dialog. An "actionStatus" of "OK" is
// interpreted as code 200, and the dialog closes.
} else {
res.json({
"actionResponse": {
"type": "DIALOG",
"dialogAction": {
"actionStatus": "OK"
}
}
});
}
}
Python
def receive_dialog(event: Mapping[str, Any]) -> Mapping[str, Any]:
"""Checks for a form input error, the absence of a "name" value, and returns
an error if absent. Otherwise, confirms successful receipt of a dialog.
Args:
event (Mapping[str, Any]): the event object from Chat API.
Returns:
Mapping[str, Any]: the response.
"""
if common := event.get('common'):
if form_inputs := common.get('formInputs'):
if contact_name := form_inputs.get('WIDGET_NAME'):
if string_inputs := contact_name.get('stringInputs'):
if name := string_inputs.get('value')[0]:
return {
'actionResponse': {
'type': 'DIALOG',
'dialogAction': {
'actionStatus': 'OK'
}
}
}
else:
return {
'actionResponse': {
'type': 'DIALOG',
'dialogAction': {
'actionStatus': 'ERROR_MESSAGE'
}
}
}
Apps Script
בדוגמה הזו, נשלחת הודעה בכרטיס על ידי חזרה כרטיס JSON. אפשר גם להשתמש שירות הכרטיסים של Apps Script.
/**
* Checks for a form input error, the absence of
* a "name" value, and returns an error if absent.
* Otherwise, confirms successful receipt of a dialog.
*
* Confirms successful receipt of a dialog.
*
* @param {Object} event the event object from Chat API.
*
* @return {object} open a Dialog in Google Chat.
*/
function submitDialog(event) {
// Checks to make sure the user entered a value
// in a dialog. If no value detected, returns
// an error message. Any "actionStatus" value other than "OK"
// gets returned as an error.
if (event.common.formInputs.WIDGET_NAME[""].stringInputs.value[0] === "") {
return {
"actionResponse": {
"type": "DIALOG",
"dialogAction": {
"actionStatus": "ERROR_MESSAGE"
}
}
};
// Otherwise the Chat app indicates that it received
// form data from the dialog. An "actionStatus" of "OK" is
// interpreted as code 200, and the dialog closes.
} else {
return {
"actionResponse": {
"type": "DIALOG",
"dialogAction": {
"actionStatus": "OK"
}
}
};
}
}
בדוגמה הזו, WIDGET_NAME מייצג את השדה name
של
הווידג'ט (כמו contactName
) וה-ERROR_MESSAGE מייצג את
של הודעת השגיאה (למשל Don't forget to name your contact
).
לפרטים על עיבוד נתוני קלט מווידג'טים, ראו
קבלת נתונים מווידג'טים אינטראקטיביים.
אופציונלי: שליחת הודעת אישור
כשתסגרו את תיבת הדו-שיח, תוכלו גם לשלוח הודעה חדשה, או לעדכן קיים.
כדי לשלוח הודעה חדשה, צריך להחזיר את
ActionResponse
כאשר type
מוגדר ל-NEW_MESSAGE
. לדוגמה, כדי לסגור את תיבת הדו-שיח
ולשלוח הודעת טקסט, ולהחזיר את הפקודה הבאה:
{
"actionResponse": {
"type": "NEW_MESSAGE",
},
"text": "Your information has been submitted."
}
כדי לעדכן הודעה, צריך להחזיר אובייקט actionResponse
שמכיל את התחילית
ומגדירה את type
לאחת מהאפשרויות הבאות:
UPDATE_MESSAGE
: מעדכן את ההודעה הפעילו את הבקשה לתיבת הדו-שיח.UPDATE_USER_MESSAGE_CARDS
: עדכון הכרטיס תצוגה מקדימה של הקישור.
פתרון בעיות
כשאפליקציית Google Chat או אפליקציית Google Chat הפונקציה card מחזירה שגיאה, בממשק של Chat מוצגת ההודעה "משהו השתבש". או "לא ניתן לעבד את הבקשה שלך". לפעמים בממשק המשתמש של Chat לא מציגה הודעות שגיאה, אבל אפליקציית Chat או והכרטיס מפיק תוצאה לא צפויה: לדוגמה, הודעה בכרטיס יופיעו.
יכול להיות שלא תופיע הודעת שגיאה בממשק המשתמש של Chat, אבל יש הודעות שגיאה תיאוריות ונתוני יומן זמינים כדי לעזור לכם לתקן שגיאות כשמופעלת רישום שגיאות ביומן של אפליקציות ל-Chat. כדי לקבל עזרה בצפייה: לניפוי באגים ולתיקון שגיאות: פתרון בעיות ותיקון שגיאות ב-Google Chat
נושאים קשורים
- לפתוח תיבות דו-שיח מדף הבית של אפליקציית Google Chat.
- הצגת דוגמאות של אפליקציות ל-Chat שמשתמשות בתיבות דו-שיח
- תצוגה מקדימה של קישורים
- איך מגדירים פקודות קוליות ועונים עליהן
- פרטי עיבוד שהוזנו על ידי משתמשים