פתיחה של תיבות דו-שיח אינטראקטיביות

בדף הזה מוסבר איך אפליקציית Chat יכולה לפתוח תיבות דו-שיח כדי להגיב למשתמשים.

תיבות דו-שיח הן ממשקים מבוססי כרטיסים עם חלון שנפתחים ממרחב משותף או מהודעה ב-Chat. תיבת הדו-שיח תכנים גלויים רק למשתמש שפתח אותם.

אפליקציות ל-Chat יכולות להשתמש בתיבות דו-שיח כדי לבקש ולאסוף מידע מ- משתמשי Chat, כולל טפסים עם מספר שלבים. אפשר לקרוא פרטים נוספים מידע על יצירת קלט לטפסים מופיע במאמר איסוף ועיבוד של מידע ממשתמשים.

דרישות מוקדמות

Node.js

  • אפליקציית Google Chat שמופעלת בה תכונות אינטראקטיביות. כדי ליצור להשתמש בשירות HTTP באפליקציית Chat האינטראקטיבית. במדריך למתחילים מוסבר איך עושים את זה.

Python

  • אפליקציית Google Chat שמופעלת בה תכונות אינטראקטיביות. כדי ליצור להשתמש בשירות HTTP באפליקציית Chat האינטראקטיבית. במדריך למתחילים מוסבר איך עושים את זה.

Apps Script

  • אפליקציית Google Chat שמופעלת בה תכונות אינטראקטיביות. כדי ליצור כדי להשתמש באפליקציית Chat האינטראקטיבית ב-Apps Script, צריך להשלים את המדריך למתחילים.

פתיחה של תיבת דו-שיח

תיבת דו-שיח עם מגוון ווידג'טים שונים.
איור 1: תיבת דו-שיח שאוספת פרטים ליצירת קשר.

בקטע הזה נסביר איך להשיב ולהגדיר תיבת דו-שיח באמצעות הפעולות הבאות:

  1. מפעילים את הבקשה לתיבת הדו-שיח בעקבות אינטראקציה של המשתמש.
  2. כדי לטפל בבקשה, חוזרים ופותחים תיבת דו-שיח.
  3. לאחר שמשתמשים שולחים מידע, אפשר לעבד את השליחה על ידי סגירת או חזרה תיבת דו-שיח אחרת.

שליחת בקשה לתיבת דו-שיח

אפליקציית Chat יכולה לפתוח רק תיבות דו-שיח כדי להשיב למשתמש אינטראקציה, כמו פקודה של קו נטוי או לחיצה על לחצן מהודעה בכרטיס.

כדי לענות למשתמשים באמצעות תיבת דו-שיח, אפליקציית Chat צריכה ליצור אינטראקציה שמפעילה את הבקשה לתיבת הדו-שיח, למשל:

  • תגובה לפקודה של קו נטוי. כדי להפעיל את הבקשה מפקודה לוכסן, צריך לסמן את התיבה פתיחה של תיבת דו-שיח בזמן הגדרת הפקודה.
  • להגיב ללחיצה על לחצן message, כחלק מכרטיס או בחלק התחתון של ההודעה. כדי להפעיל את מלחצן בהודעה, אתם מגדירים את לחצן onClick על ידי הגדרה של interaction ל-OPEN_DIALOG שלו.
  • לענות על לחיצה על לחצן בדף הבית של אפליקציית Chat. למידע נוסף על פתיחה של תיבות דו-שיח מדפי הבית: איך יוצרים דף בית לאפליקציית Google Chat?
לחצן שמפעיל תיבת דו-שיח
איור 2: אפליקציית Chat שולחת הודעה עם הנחיה למשתמשים להשתמש בפקודה /addContact.
ההודעה כוללת גם לחצן שהמשתמשים יכולים ללחוץ עליו כדי להפעיל את הפקודה.

קובץ ה-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 מקבלת אירוע אינטראקציה עם הבאים:

בקטעים הבאים מוסבר איך לאמת את הנתונים שמשתמשים מזינים סוגרים את תיבת הדו-שיח.

אימות נתוני הקלט של המשתמשים וסגירה של תיבת הדו-שיח

כדי לעבד את הנתונים שהמשתמשים מזינים, אפליקציית 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 לאחת מהאפשרויות הבאות:

פתרון בעיות

כשאפליקציית Google Chat או אפליקציית Google Chat הפונקציה card מחזירה שגיאה, בממשק של Chat מוצגת ההודעה "משהו השתבש". או "לא ניתן לעבד את הבקשה שלך". לפעמים בממשק המשתמש של Chat לא מציגה הודעות שגיאה, אבל אפליקציית Chat או והכרטיס מפיק תוצאה לא צפויה: לדוגמה, הודעה בכרטיס יופיעו.

יכול להיות שלא תופיע הודעת שגיאה בממשק המשתמש של Chat, אבל יש הודעות שגיאה תיאוריות ונתוני יומן זמינים כדי לעזור לכם לתקן שגיאות כשמופעלת רישום שגיאות ביומן של אפליקציות ל-Chat. כדי לקבל עזרה בצפייה: לניפוי באגים ולתיקון שגיאות: פתרון בעיות ותיקון שגיאות ב-Google Chat