Na tej stronie dowiesz się, jak Twoja aplikacja Google Chat może otwierać okna dialogowe na reakcję użytkownikom.
Okna to okna, interfejsy oparte na kartach. otwieranych z poziomu pokoju lub wiadomości. Okno i elementy treść jest widoczna tylko dla użytkownika, który ją otworzył.
Aplikacje do obsługi czatu mogą używać okien do wysyłania próśb o informacje i zbierania z nich informacji Użytkownicy czatu, w tym formularze wieloetapowe. Więcej informacji o tworzeniu danych wejściowych do formularza przeczytaj artykuł Zbieranie i przetwarzanie informacji od użytkowników.
Wymagania wstępne
Node.js
- Aplikacja Google Chat, w której można korzystać z funkcji interaktywnych. Aby utworzyć interaktywna aplikacja do obsługi czatu przy użyciu usługi HTTP zapoznaj się z tym krótkim wprowadzeniem.
Python
- Aplikacja Google Chat, w której można korzystać z funkcji interaktywnych. Aby utworzyć interaktywna aplikacja do obsługi czatu przy użyciu usługi HTTP zapoznaj się z tym krótkim wprowadzeniem.
Google Apps Script
- Aplikacja Google Chat, w której można korzystać z funkcji interaktywnych. Aby utworzyć z interaktywną aplikacją Google Chat w Apps Script, zapoznaj się z tym krótkim wprowadzeniem.
Otwórz okno
W tej sekcji dowiesz się, jak odpowiadać i skonfigurować okno dialogowe, wykonując te czynności:
- Powoduje wywołanie żądania okna na podstawie interakcji użytkownika.
- Aby przetworzyć żądanie, wróć i otwórz okno.
- Gdy użytkownicy prześlą informacje, przetwórz zgłoszenie, zamykając lub zwrócenie innego okna.
Wywołaj żądanie wyświetlenia okna
Aplikacja do obsługi czatu może otwierać tylko okna, aby odpowiedzieć użytkownikowi np. polecenie po ukośniku lub kliknięcie przycisku z wiadomości na karcie.
Aby umożliwić użytkownikom odpowiadanie w oknie, aplikacja Google Chat musi utworzyć interakcję, która wyzwala żądanie wyświetlenia, na przykład:
- Odpowiedz na polecenie po ukośniku. Aby aktywować żądanie za pomocą polecenia po ukośniku: musisz zaznaczyć pole wyboru Otwiera okno podczas konfigurowania polecenia.
- Reaguj na kliknięcie przycisku w
wiadomość,
na karcie lub u dołu wiadomości. Aby uruchomić
żądania za pomocą przycisku w wiadomości, skonfigurujesz
onClick
przycisku działanie przez ustawienieinteraction
naOPEN_DIALOG
. - Reagowanie na kliknięcie przycisku na stronie głównej aplikacji Google Chat Więcej informacji o otwieraniu okien dialogowych na stronach głównych znajdziesz w artykule Tworzenie strony głównej aplikacji Google Chat
Poniższy kod JSON pokazuje, jak wyzwalać żądanie okna za pomocą przycisku w
wiadomości z karty. Aby otworzyć to okno,
button.interaction
pole jest ustawione na OPEN_DIALOG
:
{
"buttonList": { "buttons": [{
"text": "BUTTON_TEXT",
"onClick": { "action": {
"function": "FUNCTION_NAME",
"interaction": "OPEN_DIALOG"
}}
}]}
}
Gdzie BUTTON_TEXT to tekst wyświetlany na przycisku a FUNCTION_NAME to funkcja uruchamiana w celu otwarcia początkowego .
Otwórz pierwsze okno
Gdy użytkownik wywoła żądanie w oknie, aplikacja Google Chat
odbiera zdarzenie interakcji, reprezentowane przez
event
wpisz
Interfejs Chat API. Jeśli interakcja wyzwala żądanie wyświetlenia okna, tag zdarzenia
Pole dialogEventType
jest ustawione na REQUEST_DIALOG
.
Aby otworzyć okno, aplikacja Google Chat może odpowiedzieć na
przez zwrócenie
actionResponse
obiekt z type
ustawionym na DIALOG
i
Message
obiektu. Aby określić zawartość okna dialogowego, uwzględnij następujące elementy:
obiekty:
actionResponse
z wartościątype
ustawioną naDIALOG
.dialogAction
obiektu. Polebody
zawiera elementy interfejsu, dzięki którym wyświetlane na karcie, w tymsections
widżetów. Aby zbierać informacje od użytkowników, możesz określić widżety do wprowadzania formularzy widżetem przycisku. Aby dowiedzieć się więcej o projektowaniu danych wejściowych w formularzu, zobacz Zbieranie i przetwarzanie informacji od użytkowników
Ten kod JSON pokazuje, jak zwraca się aplikacja Google Chat odpowiedź otwierającą okno:
{ "actionResponse": {
"type": "DIALOG",
"dialogAction": { "dialog": { "body": { "sections": [{
"widgets": [{
WIDGETS,
{ "buttonList": { "buttons": [{
"text": "BUTTON_TEXT",
"onClick": {
"action": {"function": "FUNCTION_NAME"}
}
}]}}
}]
}]}}}
}}
Gdzie BUTTON_TEXT to tekst, który wyświetla się na przycisku (np.
Next
lub Submit
), WIDGETS oznacza co najmniej jeden
widżety do wprowadzania danych oraz
FUNCTION_NAME to funkcja uruchamiana po kliknięciu przycisku przez użytkownika.
Obsługa przesyłania okien
Gdy użytkownik kliknie przycisk powodujący wyświetlenie okna,
Aplikacja do obsługi czatu otrzymuje
interakcja CARD_CLICKED
wydarzenie, w którym dialogEventType
jest SUBMIT_DIALOG
.
Aplikacja Google Chat musi obsłużyć zdarzenie interakcji do wykonując jedną z tych czynności:
- Zwróć kolejne okno, aby wypełnić inną kartę lub formularza.
- Po sprawdzeniu danych przesłanych przez użytkownika zamknij okno. opcjonalnie możesz wysłać wiadomość z potwierdzeniem.
Opcjonalnie: zwróć kolejne okno
Gdy użytkownicy prześlą pierwsze okno, aplikacje Google Chat będą zwraca co najmniej jedno dodatkowe okno, aby ułatwić użytkownikom przesyłać, wypełniać wieloetapowe formularze lub dynamicznie wypełniać zawartość formularzy.
Aby wczytać dane wprowadzone przez użytkowników w pierwszym oknie, musisz dodać
do przycisku otwierającego następne okno lub przekazać pierwotną
CARD_CLICKED
zdarzenie interakcji z początkowego okna. Więcej informacji:
Przenoszenie danych na inną kartę
W tym przykładzie aplikacja Google Chat otwiera okno, które
zwraca drugie okno dialogowe przed przesłaniem. Aby wczytać dane wejściowe, funkcja
Aplikacja do obsługi czatu przekazuje zdarzenie interakcji CARD_CLICKED
jako parametr funkcji, która otwiera następne okno:
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"
}}
}]}
}
]}]}}}
}}
Google Apps Script
Ten przykładowy kod karty wysyła wiadomość przez zwrócenie card JSON. Możesz też użyć usługi Usługa karty 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"
}}
}]}
}
]}]}}}
}};
}
Gdzie WIDGETS reprezentuje co najmniej jeden widżety do wprowadzania danych.
Zamknij okno
Gdy użytkownik kliknie przycisk w oknie, Aplikacja do obsługi czatu odbiera zdarzenie interakcji z urządzeniem następujące informacje:
eventType
jestCARD_CLICKED
.dialogEventType
jestSUBMIT_DIALOG
.common.formInputs
zawiera wszelkie dane wprowadzane przez użytkowników za pomocą widżetów.
W sekcjach poniżej wyjaśniamy, jak sprawdzać dane wprowadzane przez użytkowników Zamknij to okno.
Sprawdź dane wejściowe użytkownika i zamknij okno
Do przetwarzania danych wprowadzonych przez użytkowników aplikacja Google Chat
korzysta z funkcji
event.common.formInputs
obiektu. Więcej informacji o pobieraniu wartości z widżetów wejściowych znajdziesz w artykule
Zbieranie i przetwarzanie informacji od użytkowników
Jeśli użytkownik pominie wymagane pole lub wpisze nieprawidłowe wartości,
Aplikacja do obsługi czatu może odpowiedzieć z błędem, zwracając
ActionResponse
który zawiera "actionStatus": "ERROR MESSAGE"
.
W tym przykładzie sprawdzamy, czy użytkownik wpisał wartość dla widżetu, który
akceptuje ciągi tekstowe (stringInputs
), takie jak widżet textInput
. Jeśli go nie podasz,
Aplikacja do obsługi czatu zwraca błąd. Jeśli istnieje,
aplikacja Google Chat potwierdzi przesłanie okna i
zamyka okno dialogowe:
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'
}
}
}
Google Apps Script
Ten przykładowy kod karty wysyła wiadomość przez zwrócenie card JSON. Możesz też użyć usługi Usługa karty 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"
}
}
};
}
}
W tym przykładzie WIDGET_NAME reprezentuje pole name
parametru
(takie jak contactName
), a ERROR_MESSAGE reprezentuje
treść komunikatu o błędzie (np. Don't forget to name your contact
).
Szczegółowe informacje na temat przetwarzania danych wejściowych z widżetów znajdziesz w sekcji
Otrzymywanie danych z interaktywnych widżetów.
Opcjonalnie: wyślij wiadomość z potwierdzeniem
Po zamknięciu okna możesz też wysłać nową wiadomość lub zaktualizować już istnieje.
Aby wysłać nową wiadomość, zwróć
ActionResponse
obiekt z type
ustawionym na NEW_MESSAGE
. Aby na przykład zamknąć okno
i wyślij SMS-a, zwróć:
{
"actionResponse": {
"type": "NEW_MESSAGE",
},
"text": "Your information has been submitted."
}
Aby zaktualizować wiadomość, zwróć obiekt actionResponse
zawierający
zaktualizowany komunikat i ustawia type
na jedną z tych wartości:
UPDATE_MESSAGE
: aktualizuje wiadomość wywołał żądanie wyświetlenia okna.UPDATE_USER_MESSAGE_CARDS
: aktualizuje kartę z podgląd linku.
Rozwiązywanie problemów
Gdy aplikacja Google Chat lub card zwraca błąd, Interfejs czatu wyświetla komunikat „Coś poszło nie tak”. lub „Nie można przetworzyć żądania”. Czasami interfejs Google Chat nie wyświetla się żaden komunikat o błędzie, ale aplikacja Google Chat lub zwraca nieoczekiwany wynik; na przykład wiadomość w formie karty .
Komunikat o błędzie może nie wyświetlać się w interfejsie Google Chat, opisowe komunikaty o błędach i dane dziennika, które pomogą Ci w naprawianiu błędów gdy logowanie błędów aplikacji Google Chat jest włączone. Aby uzyskać pomoc w wyświetlaniu, debugowania i naprawiania błędów, zapoznaj się z artykułem Rozwiązywanie problemów z błędami w Google Chat
Powiązane artykuły
- Otwieranie okien na stronie głównej aplikacji Google Chat
- Zobacz przykłady aplikacji Google Chat, które używają okien
- Linki do podglądu
- Konfigurowanie poleceń po ukośniku i reagowanie na nie
- Informacje o procesie podawane przez użytkowników