このガイドでは、Google Chat アプリがカードベースのインターフェースでフォーム入力を構築して、ユーザーから情報を収集して処理する方法について説明します。
Chat 用アプリは、Chat 内外でアクションを実行するために、ユーザーに情報をリクエストします。これには、次の方法があります。
- 設定を構成します。たとえば、ユーザーが通知設定をカスタマイズしたり、Chat アプリを構成して 1 つ以上のスペースに追加したりできるようにします。
- 他の Google Workspace アプリケーションで情報を作成または更新する。たとえば、ユーザーが Google カレンダーの予定を作成できるようにします。
- ユーザーが他のアプリやウェブサービスのリソースにアクセスして更新できるようにします。たとえば、Chat アプリを使用すると、ユーザーは Chat スペースから直接サポート チケットのステータスを更新できます。
前提条件
HTTP
ユーザー インタラクションを受信して応答する Google Chat アプリ。作成するには、HTTP クイックスタートを完了します。
Apps Script
ユーザー インタラクションを受信して応答する Google Chat アプリ。作成するには、Apps Script のクイックスタートを完了してください。
カードを使用してフォームを作成する
情報を収集するために、Chat 用アプリはフォームとその入力を設計し、カードに組み込みます。ユーザーにカードを表示するために、Chat 用アプリは次の Chat インターフェースを使用できます。
- 1 つ以上のカードを含むメッセージ。
- ホームページ。Chat アプリとのダイレクト メッセージの [ホーム] タブに表示されるカードです。
- ダイアログ。メッセージやホームページから新しいウィンドウで開くカードです。
Chat 用アプリは、次のウィジェットを使用してカードを作成できます。
ユーザーに情報の入力を求めるフォーム入力ウィジェット。必要に応じて、フォーム入力ウィジェットに検証を追加して、ユーザーが情報を正しく入力し、フォーマットできるようにすることもできます。Chat 用アプリでは、次のフォーム入力ウィジェットを使用できます。
- テキスト入力(
textInput): 自由形式のテキストまたは候補テキスト。 - 選択入力(
selectionInput)は、チェックボックス、ラジオボタン、プルダウン メニューなどの選択可能な UI 要素です。選択入力ウィジェットは、Google Workspace データ(Chat スペースなど)や動的データソースからアイテムを入力して提案することもできます。詳しくは、プルダウン メニューを追加すると複数選択メニューを追加するをご覧ください。 - 日時選択ツール(
dateTimePicker): 日時を入力します。
- テキスト入力(
ボタン ウィジェット。ユーザーがカードに入力した値を送信できるようにします。ユーザーがボタンをクリックすると、Chat 用アプリは受信した情報を処理できます。
次の例では、カードがテキスト入力、日時選択ツール、選択入力を使用して連絡先情報を収集します。
情報の収集に使用できるインタラクティブなウィジェットのその他の例については、インタラクティブなカードやダイアログを設計するをご覧ください。
プルダウン メニューを追加する
選択項目をカスタマイズしたり、ユーザーが動的データソースから 1 つの項目を選択できるようにしたりするには、Chat 用アプリでプルダウン メニューを使用します。これは SelectionInput ウィジェットの一種です。たとえば、次のカードには、ユーザーが連絡先のリストから動的に選択できるプルダウン メニューが表示されます。
プルダウン メニューの項目は、次のデータソースから入力できます。
- Google Workspace データ。これには、ユーザーや Chat スペースが含まれます。
- リレーショナル データベースなどの外部データソース。
Google Workspace データソースからアイテムを入力する
Google Workspace ユーザーなどの Google Workspace データソースからアイテムを入力するには、DataSourceConfig オブジェクト内の platformDataSource フィールドを指定します。他の選択入力タイプとは異なり、SelectionItem オブジェクトは省略します。これらの選択項目は Google Workspace から動的に取得されるためです。
次のコードは、Google Workspace ユーザーのプルダウン メニューを示しています。
JSON
{
"sections": [
{
"header": "Section Header",
"widgets": [
{
"selectionInput": {
"name": "contacts",
"type": "DROPDOWN",
"label": "Select contact from organization",
"dataSourceConfigs": [
{
"platformDataSource": {
"commonDataSource": "USER"
},
"minCharactersTrigger": 1
}
]
}
}
]
}
]
}
外部データソースからアイテムを入力する
プルダウン メニューでは、サードパーティまたは外部のデータソースからアイテムを入力することもできます。外部データソースを使用するには、DataSourceConfig オブジェクト内の remoteDataSource フィールドを指定します。このオブジェクトには、データソースからアイテムをクエリして返す関数が含まれています。
外部データソースへのリクエストを減らすには、ユーザーがメニューに入力する前にプルダウン メニューに表示される候補アイテムを含めます。外部データソースから候補アイテムを入力するには、静的な SelectionItem オブジェクトを指定します。
次のコードは、外部データソースからアイテムをクエリして入力するプルダウン メニューを示しています。
JSON
{
"sections": [
{
"header": "Section Header",
"widgets": [
{
"selectionInput": {
"name": "crm_leads",
"type": "DROPDOWN",
"label": "Select CRM Lead",
"dataSourceConfigs": [
{
"remoteDataSource": {
"function": "getCrmLeads"
},
"minCharactersTrigger": 2
}
],
"items": [
{
"text": "Suggested Lead 1",
"value": "lead-1"
}
]
}
}
]
}
]
}
提案されたアイテムを返す方法を示す実証済みの例については、選択アイテムを提案するセクションをご覧ください。
複数選択メニューを追加する
選択項目をカスタマイズしたり、ユーザーが動的データソースから項目を選択できるようにしたりするには、Chat 用アプリで複数選択メニューを使用します。これは SelectionInput ウィジェットの一種です。たとえば、次のカードには、ユーザーが連絡先のリストから動的に選択できる複数選択メニューが表示されます。
複数選択メニューの項目は、次のデータソースから入力できます。
- Google Workspace データ。これには、ユーザーまたはユーザーがメンバーである Chat スペースが含まれます。メニューには、同じ Google Workspace 組織のアイテムのみが表示されます。
- リレーショナル データベースなどの外部データソース。たとえば、複数選択メニューを使用すると、ユーザーが顧客管理(CRM)システムの見込み顧客のリストから選択できます。
Google Workspace データソースからアイテムを入力する
Google Workspace データソースを使用するには、SelectionInput ウィジェットで platformDataSource フィールドを指定します。他の選択入力タイプとは異なり、SelectionItem オブジェクトは省略します。これらの選択項目は Google Workspace から動的に取得されるためです。
次のコードは、Google Workspace ユーザーの複数選択メニューを示しています。ユーザーを入力するために、選択インプット セットで commonDataSource を USER に設定します。
JSON
{
"selectionInput": {
"name": "contacts",
"type": "MULTI_SELECT",
"label": "Selected contacts",
"multiSelectMaxSelectedItems": 5,
"multiSelectMinQueryLength": 1,
"platformDataSource": {
"commonDataSource": "USER"
}
}
}
次のコードは、Chat スペースの複数選択メニューを示しています。スペースにデータを入力するために、選択入力で hostAppDataSource フィールドを指定します。複数選択メニューでは、defaultToCurrentSpace が true に設定され、現在のスペースがメニューのデフォルトの選択になります。
JSON
{
"selectionInput": {
"name": "spaces",
"type": "MULTI_SELECT",
"label": "Selected contacts",
"multiSelectMaxSelectedItems": 3,
"multiSelectMinQueryLength": 1,
"platformDataSource": {
"hostAppDataSource": {
"chatDataSource": {
"spaceDataSource": {
"defaultToCurrentSpace": true
}
}
}
}
}
}
外部データソースからアイテムを入力する
複数選択メニューでは、サードパーティまたは外部のデータソースからアイテムを入力することもできます。外部データソースを使用するには、SelectionInput ウィジェットの externalDataSource フィールドに、データソースからアイテムをクエリして返す関数を指定します。
外部データソースへのリクエストを減らすには、ユーザーがメニューに入力する前に、複数選択メニューに表示される候補アイテムを含めることができます。たとえば、ユーザーが最近検索した連絡先を入力できます。外部データソースから候補アイテムを入力するには、静的な SelectionItem オブジェクトを指定します。
次のコードサンプルは、外部データソースからアイテムをクエリして入力する複数選択メニューを示しています。
Node.js
FUNCTION_URL は、外部データソースをクエリする HTTP エンドポイントに置き換えます。
Python
FUNCTION_URL は、外部データソースをクエリする HTTP エンドポイントに置き換えます。
Java
FUNCTION_URL は、外部データソースをクエリする HTTP エンドポイントに置き換えます。
Apps Script
この例では、カード JSON を返すことでカード メッセージを送信します。Apps Script カードサービスを使用することもできます。
提案されたアイテムを返す方法を示す実証済みの例については、選択アイテムを提案するセクションをご覧ください。
インタラクティブ ウィジェットからデータを受信する
ユーザーがボタンをクリックするたびに、インタラクションに関する情報を含む Chat 用アプリのアクションがトリガーされます。イベント ペイロードの commonEventObject で、formInputs オブジェクトにはユーザーが入力した値が含まれます。
値はオブジェクト event.commonEventObject.formInputs.WIDGET_NAME から取得できます。ここで、WIDGET_NAME はウィジェットに指定した name フィールドです。値は、ウィジェットの特定のデータ型として返されます。
以下に、ユーザーが各ウィジェットに値を入力したイベント オブジェクトの一部を示します。
{
"commonEventObject": { "formInputs": {
"contactName": { "stringInputs": {
"value": ["Kai 0"]
}},
"contactBirthdate": { "dateInput": {
"msSinceEpoch": 1000425600000
}},
"contactType": { "stringInputs": {
"value": ["Personal"]
}}
}}
}
データを受信するために、Chat 用アプリはイベント オブジェクトを処理して、ユーザーがウィジェットに入力した値を取得します。次の表に、特定のフォーム入力ウィジェットの値を取得する方法を示します。各ウィジェットについて、ウィジェットが受け入れるデータ型、イベント オブジェクトに値が格納される場所、値の例を示します。
| フォーム入力ウィジェット | 入力データの種類 | イベント オブジェクトからの入力値 | 値の例 |
|---|---|---|---|
textInput |
stringInputs |
event.commonEventObject.formInputs.contactName.stringInputs.value[0] |
Kai O |
selectionInput |
stringInputs |
最初の値または唯一の値を取得するには、event.commonEventObject.formInputs.contactType.stringInputs.value[0] |
Personal |
日付のみを受け入れる dateTimePicker。 |
dateInput |
event.commonEventObject.formInputs.contactBirthdate.dateInput.msSinceEpoch。 |
1000425600000 |
Chat 用アプリは、データを受信すると、次のいずれかを行うことができます。
- 複数選択メニューを含むカードの場合、ユーザーがメニューに入力した内容に基づいてアイテムを入力または提案します。
- データを別のカードに転送して、ユーザーが情報を確認したり、フォームの次のセクションに進んだりできるようにします。
- お客様に返信して、フォームへの記入が完了したことを確認します。
選択項目の提案
カードに、外部データソースからアイテムを入力する複数選択メニューまたはプルダウン メニューが含まれている場合、Chat アプリは、ユーザーがメニューに入力した内容に基づいて、おすすめのアイテムを返すことができます。たとえば、ユーザーが米国の都市を入力するメニューで「Atl」と入力し始めると、Chat 用アプリはユーザーが入力し終える前に「Atlanta」を自動的に提案できます。Chat 用アプリは最大 100 個のアイテムを提案できます。
選択入力で項目を提案して動的に入力するには、カードの SelectionInput ウィジェットで、外部データソースをクエリする関数を指定する必要があります。複数選択メニューの場合は、externalDataSource フィールドを指定します。プルダウン メニューの場合は、DataSourceConfig オブジェクト内の remoteDataSource フィールドを指定します。
また、メニューに候補が表示されるまでに入力する文字数を構成することもできます。複数選択メニューの場合は、multiSelectMinQueryLength フィールドを設定します。プルダウン メニューの場合は、DataSourceConfig 内の min_characters_trigger フィールドを設定します。
提案されたアイテムを返すには、関数で次の操作を行う必要があります。
- ユーザーがメニューに入力したときに Chat アプリが受信するイベント オブジェクトを処理します。
- イベント オブジェクトから、ユーザーが入力した値(
event.commonEventObject.parameters["autocomplete_widget_query"]フィールドに表示される値)を取得します。 - ユーザー入力値を使用してデータソースにクエリを実行し、ユーザーに提案する 1 つ以上の
SelectionItemsを取得します。 modifyCardオブジェクトを含むアクションRenderActionsを返すことで、おすすめのアイテムを返します。
次のコードサンプルは、Chat アプリがカードの複数選択メニューでアイテムを動的に提案する方法を示しています。ユーザーがメニューに入力すると、ウィジェットの externalDataSource フィールドで指定された関数またはエンドポイントが外部データソースにクエリを実行し、ユーザーが選択できる項目を提案します。
Node.js
FUNCTION_URL は、外部データソースをクエリする HTTP エンドポイントに置き換えます。
Python
FUNCTION_URL は、外部データソースをクエリする HTTP エンドポイントに置き換えます。
Java
FUNCTION_URL は、外部データソースをクエリする HTTP エンドポイントに置き換えます。
Apps Script
この例では、カード JSON を返すことでカード メッセージを送信します。Apps Script カードサービスを使用することもできます。
別のカードにデータを転送する
ユーザーがカードから情報を送信した後、次のいずれかを行うために、追加のカードを返すことが必要になる場合があります。
- 長いフォームを完成させやすくするために、個別のセクションを作成します。
- ユーザーが最初のカードから情報をプレビューして確認できるようにして、送信前に回答を確認できるようにします。
- フォームの残りの部分に動的に入力します。たとえば、ユーザーに予約の作成を促すために、Chat 用アプリは、予約の理由をリクエストする最初のカードを表示し、予約の種類に基づいて利用可能な時間を表示する別のカードを表示できます。
最初のカードから入力されたデータを転送するには、次の例に示すように、ウィジェットの name とユーザーが入力した値を含む actionParameters を使用して button ウィジェットを構築します。
Node.js
FUNCTION_URL は、ボタンクリックを処理する HTTP エンドポイントに置き換えます。
Python
FUNCTION_URL は、ボタンクリックを処理する HTTP エンドポイントに置き換えます。
Java
FUNCTION_URL は、ボタンクリックを処理する HTTP エンドポイントに置き換えます。
Apps Script
この例では、カード JSON を返すことでカード メッセージを送信します。Apps Script カードサービスを使用することもできます。
ユーザーがボタンをクリックすると、Chat 用アプリはイベント オブジェクトを受け取り、そこからデータを受信できます。
フォームの送信に対応する
カード メッセージまたはダイアログからデータを受信すると、Chat 用アプリは受信確認またはエラーを返します。
次の例では、Chat 用アプリがテキスト メッセージを送信して、カード メッセージから送信されたフォームが正常に受信されたことを確認します。
Node.js
Python
Java
Apps Script
この例では、カード JSON を返すことでカード メッセージを送信します。Apps Script カードサービスを使用することもできます。
ダイアログを処理して閉じるには、確認メッセージを送信するか、元のメッセージまたはカードを更新するか、ダイアログを閉じるかを指定する RenderActions オブジェクトを返します。手順については、ダイアログを閉じるをご覧ください。
トラブルシューティング
このセクションでは、Chat でダイアログを操作する際のエラーコードとランタイム動作のトラブルシューティング手順について説明します。
ダイアログの操作で「アドオンの呼び出し中に不明なエラーが発生しました」と返される
ダイアログを操作しているときに、メッセージ「Unspecified error invoking the add-on.」とコード 13 のエラーログが表示された場合は、通常、内部エラーが発生しているか、Chat アプリの HTTP エンドポイントがリクエストの処理に失敗したか、有効なレスポンスを返さなかったことを示しています。
このエラーを解決する方法は以下のとおりです。
- HTTP エンドポイントのログで、未処理の例外やクラッシュがないか確認します。
- エンドポイントが 30 秒以内にリクエストに応答することを確認します。エンドポイントの実行に 30 秒以上かかると、Chat はレスポンスを処理できず、インタラクションは失敗します。詳細については、レート制限とベスト プラクティスをご覧ください。
- エンドポイントが有効なレスポンスを返すことを確認します。ダイアログの送信の場合、エンドポイントは正しい JSON 形式の
RenderActionsオブジェクトを返す必要があります。レスポンスの形式が正しくないか、必須フィールドが含まれていない場合、ダイアログの操作が失敗することがあります。
Google Chat アプリまたはカードからエラーが返されると、Chat インターフェースに「エラーが発生しました」というメッセージが表示されます。または「リクエストを処理できません。」Chat UI にエラー メッセージが表示されない場合でも、Chat アプリやカードで予期しない結果が生じることがあります。たとえば、カード メッセージが表示されないことがあります。
Chat UI にエラー メッセージが表示されない場合でも、Chat 用アプリのエラー ロギングが有効になっていると、エラーの修正に役立つ詳細なエラー メッセージとログデータを利用できます。エラーの表示、デバッグ、修正については、Google Chat のエラーのトラブルシューティングと修正をご覧ください。
関連トピック
- Contact Manager のサンプルを表示する。これは、カード メッセージとダイアログからお問い合わせフォームに入力するようユーザーに求める Chat アプリです。
- インタラクティブなダイアログをサポートする
アドオンではない Chat 用アプリ: ユーザーがカードに入力したフォームデータを読み取る
以下のドキュメントは、Google Workspace アドオンではない Chat アプリに適用されます。アドオンではない Chat アプリを移行するには、Google Chat アプリを Google Workspace アドオンに変換するをご覧ください。
カードを使用してフォームを作成する
テキスト入力、日時選択ツール、選択入力を使用するお問い合わせフォームを使用するアドオンではない Chat 用アプリの例については、次のコードをご覧ください。
Node.js
Python
Java
Apps Script
インタラクティブ ウィジェットからデータを受信する
ユーザーがボタンをクリックすると、アドオンではない Chat 用アプリは、ボタンの場所に応じてインタラクション イベントを受け取ります。
ボタンがメッセージまたはダイアログにある場合、アドオンではない Chat アプリは、インタラクションに関する情報を含む
CARD_CLICKEDインタラクション イベントを受け取ります。CARD_CLICKEDインタラクション イベントのペイロードには、ユーザーが入力した値を含むcommon.formInputsオブジェクト(event.common.formInputs)が含まれています。値はオブジェクト
common.formInputs.WIDGET_NAMEから取得できます。ここで、WIDGET_NAME はウィジェットに指定したnameフィールドです。値は、ウィジェットの特定のデータ型(Inputsオブジェクトとして表される)として返されます。以下は、ユーザーが各ウィジェットに値を入力した
CARD_CLICKEDインタラクション イベントの一部を示しています。HTTP
{ "type": "CARD_CLICKED", "common": { "formInputs": { "contactName": { "stringInputs": { "value": ["Kai 0"] }}, "contactBirthdate": { "dateInput": { "msSinceEpoch": 1000425600000 }}, "contactType": { "stringInputs": { "value": ["Personal"] }} }} }Apps Script
{ "type": "CARD_CLICKED", "common": { "formInputs": { "contactName": { "": { "stringInputs": { "value": ["Kai 0"] }}}, "contactBirthdate": { "": { "dateInput": { "msSinceEpoch": 1000425600000 }}}, "contactType": { "": { "stringInputs": { "value": ["Personal"] }}} }} }ボタンがホームページにある場合、アドオンではない Chat アプリは
SUBMIT_FORMインタラクション イベントを受け取ります。インタラクション イベントのペイロードには、ユーザーが入力した値を含むcommonEventObject.formInputsオブジェクト(event.commonEventObject.formInputs)が含まれています。値はオブジェクト
commonEventObject.formInputs.WIDGET_NAMEから取得できます。ここで、WIDGET_NAME はウィジェットに指定したnameフィールドです。値は、ウィジェットの特定のデータ型(Inputsオブジェクトとして表される)として返されます。以下は、ユーザーが各ウィジェットに値を入力した
SUBMIT_FORMインタラクション イベントの一部を示しています。HTTP
{ "type": "SUBMIT_FORM", "commonEventObject": { "formInputs": { "contactName": { "stringInputs": { "value": ["Kai 0"] }}, "contactBirthdate": { "dateInput": { "msSinceEpoch": 1000425600000 }}, "contactType": { "stringInputs": { "value": ["Personal"] }} }} }Apps Script
{ "type": "SUBMIT_FORM", "commonEventObject": { "formInputs": { "contactName": { "": { "stringInputs": { "value": ["Kai 0"] }}}, "contactBirthdate": { "": { "dateInput": { "msSinceEpoch": 1000425600000 }}}, "contactType": { "": { "stringInputs": { "value": ["Personal"] }}} }} }
データを受信するために、アドオンではない Chat アプリは、インタラクション イベントを処理して、ユーザーがウィジェットに入力した値を取得します。次の表に、特定のフォーム入力ウィジェットの値を取得する方法を示します。この表には、ウィジェットごとに、ウィジェットが受け入れるデータ型、インタラクション イベントに値が保存される場所、値の例が示されています。
| フォーム入力ウィジェット | 入力データの種類 | インタラクション イベントからの入力値 | 値の例 |
|---|---|---|---|
textInput |
stringInputs |
event.common.formInputs.contactName.stringInputs.value[0] |
Kai O |
selectionInput |
stringInputs |
最初の値または唯一の値を取得するには、event.common.formInputs.contactType.stringInputs.value[0] |
Personal |
日付のみを受け入れる dateTimePicker。 |
dateInput |
event.common.formInputs.contactBirthdate.dateInput.msSinceEpoch。 |
1000425600000 |
別のカードにデータを転送する
アドオンではない Chat アプリの最初のカードからデータ入力を転送するには、次の例に示すように、ウィジェットの name とユーザーが入力した値を含む actionParameters を使用して button ウィジェットをビルドします。
Node.js
Python
Java
Apps Script
ユーザーがボタンをクリックすると、アドオンではない Chat 用アプリは CARD_CLICKED インタラクション イベントを受信します。このイベントからデータを受信できます。
フォームの送信に対応する
次の例では、アドオンではない Chat アプリが、ダイアログまたはカード メッセージから送信されたフォームを正常に受信したことを確認するテキスト メッセージを送信します。
Node.js
Python
Java
Apps Script
アドオンではない Chat 用アプリでダイアログを処理して閉じるには、確認メッセージを送信するか、元のメッセージまたはカードを更新するか、ダイアログを閉じるかを指定する ActionResponse オブジェクトを返します。手順については、ダイアログを閉じるをご覧ください。