設計互動式資訊卡或對話方塊

本頁說明如何在資訊卡或對話方塊訊息中加入小工具和 UI 元素 方便使用者與 Google Chat 應用程式互動,例如: 當使用者按下按鈕或提交資訊時


您可以使用 Card Builder 設計及預覽即時通訊應用程式的 JSON 資訊卡訊息:

開啟資訊卡建立工具

必要條件

  • Google Workspace 帳戶 有權存取 Google Chat
  • 已發布的 Chat 應用程式。如要建立 即時通訊應用程式,請追蹤這個 快速入門導覽課程
  • 新增按鈕

    ButtonList小工具 會顯示一組按鈕按鈕可以顯示文字 圖示,或使用文字和圖示每項 Button敬上 支援 OnClick 個動作 發生在使用者點擊按鈕時產生的狀況例如:

    • 使用以下應用程式開啟超連結: OpenLink、 為使用者提供額外資訊。
    • 執行 action敬上 執行自訂函式,例如呼叫 API

    針對無障礙功能,按鈕支援替代文字。

    新增可執行自訂函式的按鈕

    以下資訊卡包含包含兩個按鈕的 ButtonList 小工具。 點選一個按鈕,即可在新分頁中開啟 Google Chat 開發人員說明文件。 其他按鈕會執行名為 goToView() 的自訂函式,並傳遞 viewType="BIRD EYE VIEW" 參數。

    新增自訂顏色和已停用的按鈕

    您可以透過設定 "disabled": "true" 來避免使用者點選按鈕。

    以下內容顯示包含兩個 ButtonList 小工具的資訊卡 按鈕。點選其中一個按鈕會用到 Color 欄位 自訂按鈕背景 顏色。另一個按鈕也會透過 Disabled 欄位停用, 防止使用者點選按鈕並執行函式。

    新增有圖示的按鈕

    以下內容顯示了由包含兩個圖示的 ButtonList 小工具組成的資訊卡 Button 個小工具。點選其中一個按鈕會用到 knownIcon敬上 ] 欄位顯示 Google Chat 的內建電子郵件圖示。另一個按鈕會使用 iconUrl 欄位,即可顯示 「自訂圖示小工具」

    新增含有圖示和文字的按鈕

    以下內容顯示包含提示的 ButtonList 小工具的資訊卡 使用者傳送電子郵件第一個按鈕會顯示電子郵件圖示和 第二個按鈕會顯示文字。使用者可以按一下圖示或文字 執行 sendEmail 函式的按鈕。

    新增可選取的 UI 元素

    SelectionInput 小工具 提供了一組可選取的項目,例如核取方塊、圓形按鈕、切換按鈕 或下拉式選單您可以使用這個小工具 向使用者收集經過定義與標準化的資料。收集未定義的資料 請改為使用 TextInput 小工具。

    SelectionInput 小工具支援建議功能,協助使用者輸入一致 以及變更動作 Actions 此事件會在選項輸入欄位發生變更時 (例如使用者 選取或取消選取項目。

    即時通訊應用程式可以接收及處理所選項目的值。 如要進一步瞭解如何使用表單輸入功能,請參閱 處理使用者輸入的資訊

    本節提供使用 SelectionInput 小工具的資訊卡範例。 這些範例使用不同類型的區段輸入:

    新增核取方塊

    下圖顯示的對話方塊會要求使用者指定 可透過 SelectionInput 小工具 使用核取方塊:

    新增圓形按鈕

    下圖顯示的對話方塊會要求使用者指定 透過 SelectionInput 小工具使用 圓形按鈕:

    新增切換鈕

    下圖顯示的對話方塊會要求使用者指定 透過 SelectionInput 小工具接觸專業或私人資訊 使用外接切換裝置:

    下圖顯示的對話方塊會要求使用者指定 透過 SelectionInput 小工具使用 下拉式選單:

    新增複選選單

    以下將顯示一個對話方塊,要求使用者選取聯絡人 加入多選選單:

    針對複選選單使用資料來源

    下一節說明如何使用複選選單填入資料 從動態來源 (如 Google Workspace 應用程式或外部資料) 來源。

    Google Workspace 的資料來源

    您可以透過以下資料來源,為複選選單填入項目: Google Workspace:

    • Google Workspace 使用者:您只能在 同一個 Google Workspace 機構
    • Chat 聊天室:使用者在複選時輸入的項目 選單只能查看及選取所屬聊天室 Google Workspace 機構

    如要使用 Google Workspace 資料來源,必須指定 platformDataSource敬上 ] 欄位。不同於其他選取輸入類型,您省略 SectionItem敬上 因為這些選取項目是從 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」欄位。複選選單也會設定 defaultToCurrentSpacetrue,這會將目前的聊天室設為預設 選單:

    JSON

    {
      "selectionInput": {
        "name": "spaces",
        "type": "MULTI_SELECT",
        "label": "Selected contacts",
        "multiSelectMaxSelectedItems": 3,
        "multiSelectMinQueryLength": 1,
        "platformDataSource": {
          "hostAppDataSource": {
            "chatDataSource": {
              "spaceDataSource": {
                "defaultToCurrentSpace": true
              }
            }
          }
        }
      }
    }
    
    Google Workspace 以外的資料來源

    複選選單也可以填入第三方或外部資料的項目 來源。舉例來說,您可以使用複選選單,協助使用者 客戶關係管理 (CRM) 系統提供的銷售待開發客戶清單。

    如要使用外部資料來源,請使用 externalDataSource 欄位 請指定從資料來源傳回項目的函式。

    如要減少傳送至外部資料來源的要求次數,您可以加入 使用者輸入內容前,系統會在複選選單中顯示建議項目 。舉例來說,您可以填入最近搜尋的聯絡人 內容。如要填入外部資料來源的建議項目,請指定 SelectionItem敬上 如需儲存大量結構化物件 建議使用 Cloud Bigtable

    下方程式碼顯示 使用者的外部聯絡人群組根據預設,選單會顯示一位聯絡人 然後執行 getContacts 函式,從 外部資料來源:

    JSON

    {
      "selectionInput": {
        "name": "contacts",
        "type": "MULTI_SELECT",
        "label": "Selected contacts",
        "multiSelectMaxSelectedItems": 5,
        "multiSelectMinQueryLength": 2,
        "externalDataSource": {
          "function": "getContacts"
        },
        "items": [
          {
            "text": "Contact 3",
            "value": "contact-3",
            "startIconUri": "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
            "bottomText": "Contact three description",
            "selected": false
          }
        ]
      }
    }
    

    如果是外部資料來源,您也可以自動完成使用者啟動的項目 在複選選單中打字舉例來說,如果使用者開始輸入 Atl 輸入 自動填入美國城市的選單、 Chat 應用程式可以在使用者之前自動建議 Atlanta 輸入完成。您最多可以自動完成 100 個項目。

    如要自動完成項目,您必須建立函式來查詢外部資料 當使用者在複選選單中打字時,傳回項目。 函式必須執行以下動作:

    • 傳遞代表使用者與選單互動的事件物件。
    • 找出互動事件的 invokedFunction敬上 值與 externalDataSource 欄位的函式相符。
    • 函式相符時,從外部資料傳回建議項目 來源。如要根據使用者輸入的內容建議項目,請取得 autocomplete_widget_query 金鑰。這個值代表使用者輸入的內容 。

    以下程式碼會自動完成外部資料資源中的項目。使用 Chat 應用程式會根據 觸發 getContacts 函式時:

    Apps Script

    apps-script/selection-input/on-widget-update.gs
    /**
     * Widget update event handler.
     *
     * @param {Object} event The event object from Chat API.
     * @return {Object} Response from the Chat app.
     */
    function onWidgetUpdate(event) {
      const actionName = event.common["invokedFunction"];
      if (actionName !== "getContacts") {
        return {};
      }
    
      return {
        actionResponse: {
          type: "UPDATE_WIDGET",
          updatedWidget: {
            suggestions: {
              items: [
                {
                  value: "contact-1",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 1",
                  bottomText: "Contact one description",
                  selected: false
                },
                {
                  value: "contact-2",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 2",
                  bottomText: "Contact two description",
                  selected: false
                },
                {
                  value: "contact-3",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 3",
                  bottomText: "Contact three description",
                  selected: false
                },
                {
                  value: "contact-4",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 4",
                  bottomText: "Contact four description",
                  selected: false
                },
                {
                  value: "contact-5",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 5",
                  bottomText: "Contact five description",
                  selected: false
                },
              ]
            }
          }
        }
      };
    }
    

    Node.js

    node/selection-input/on-widget-update.js
    /**
     * Widget update event handler.
     *
     * @param {Object} event The event object from Chat API.
     * @return {Object} Response from the Chat app.
     */
    function onWidgetUpdate(event) {
      const actionName = event.common["invokedFunction"];
      if (actionName !== "getContacts") {
        return {};
      }
    
      return {
        actionResponse: {
          type: "UPDATE_WIDGET",
          updatedWidget: {
            suggestions: {
              items: [
                {
                  value: "contact-1",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 1",
                  bottomText: "Contact one description",
                  selected: false
                },
                {
                  value: "contact-2",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 2",
                  bottomText: "Contact two description",
                  selected: false
                },
                {
                  value: "contact-3",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 3",
                  bottomText: "Contact three description",
                  selected: false
                },
                {
                  value: "contact-4",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 4",
                  bottomText: "Contact four description",
                  selected: false
                },
                {
                  value: "contact-5",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 5",
                  bottomText: "Contact five description",
                  selected: false
                },
              ]
            }
          }
        }
      };
    }
    

    新增可讓使用者輸入文字的欄位

    TextInput 小工具 提供可讓使用者輸入文字的欄位。 小工具支援建議功能,可讓使用者輸入統一的資料並在變更時提供建議 Actions敬上 這個事件會在文字輸入欄位發生變更時執行,例如使用者新增或 正在刪除文字。

    如果需要收集使用者的抽像或不明資料,請使用這個 「TextInput」小工具。如要收集使用者的指定資料,請使用 SelectionInput敬上

    如要處理使用者輸入的文字,請參閱 處理使用者輸入的資訊

    以下是由 TextInput 小工具組成的資訊卡:

    讓使用者選擇日期和時間

    DateTimePicker小工具 可讓使用者輸入日期、時間,或兩者同時 時間。或者,使用者也可以使用挑選器選取日期和時間。如果使用者輸入內容 日期或時間無效,挑選器會顯示錯誤訊息,提示使用者輸入內容 正確的資訊

    如要處理使用者輸入的日期和時間值,請參閱 處理使用者輸入的資訊

    以下內容顯示包含三種不同類型的資訊卡 「DateTimePicker」小工具:

    驗證輸入至資訊卡的資料

    本頁面說明如何驗證輸入至資訊卡 action 的資料 和小工具 舉例來說,您可以驗證文字輸入欄位是否包含 或包含特定字元數的字元,或是包含特定字元的數量。

    設定動作所需的小工具

    卡片的 action 中, 將動作需要的小工具名稱加入其 requiredWidgets 清單。

    如果此處列出的小工具在叫用這項動作時沒有任何值, 那麼表單動作就會取消提交

    如果為動作設定了 "all_widgets_are_required": "true",則所有小工具 執行這項操作

    在複選功能中設定all_widgets_are_required動作

    JSON

    {
      "sections": [
        {
          "header": "Select contacts",
          "widgets": [
            {
              "selectionInput": {
                "type": "MULTI_SELECT",
                "label": "Selected contacts",
                "name": "contacts",
                "multiSelectMaxSelectedItems": 3,
                "multiSelectMinQueryLength": 1,
                "onChangeAction": {
                  "all_widgets_are_required": true
                },
                "items": [
                  {
                    "value": "contact-1",
                    "startIconUri": "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                    "text": "Contact 1",
                    "bottomText": "Contact one description",
                    "selected": false
                  },
                  {
                    "value": "contact-2",
                    "startIconUri": "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                    "text": "Contact 2",
                    "bottomText": "Contact two description",
                    "selected": false
                  },
                  {
                    "value": "contact-3",
                    "startIconUri": "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                    "text": "Contact 3",
                    "bottomText": "Contact three description",
                    "selected": false
                  },
                  {
                    "value": "contact-4",
                    "startIconUri": "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                    "text": "Contact 4",
                    "bottomText": "Contact four description",
                    "selected": false
                  },
                  {
                    "value": "contact-5",
                    "startIconUri": "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                    "text": "Contact 5",
                    "bottomText": "Contact five description",
                    "selected": false
                  }
                ]
              }
            }
          ]
        }
      ]
    }
    

    在 dateTimePicker 中設定 all_widgets_are_required 動作

    JSON

    {
      "sections": [
        {
          "widgets": [
            {
              "textParagraph": {
                "text": "A datetime picker widget with both date and time:"
              }
            },
            {
              "divider": {}
            },
            {
              "dateTimePicker": {
                "name": "date_time_picker_date_and_time",
                "label": "meeting",
                "type": "DATE_AND_TIME"
              }
            },
            {
              "textParagraph": {
                "text": "A datetime picker widget with just date:"
              }
            },
            {
              "divider": {}
            },
            {
              "dateTimePicker": {
                "name": "date_time_picker_date_only",
                "label": "Choose a date",
                "type": "DATE_ONLY",
                "onChangeAction":{
                  "all_widgets_are_required": true
                }
              }
            },
            {
              "textParagraph": {
                "text": "A datetime picker widget with just time:"
              }
            },
            {
              "divider": {}
            },
            {
              "dateTimePicker": {
                "name": "date_time_picker_time_only",
                "label": "Select a time",
                "type": "TIME_ONLY"
              }
            }
          ]
        }
      ]
    }
    

    在下拉式選單中設定all_widgets_are_required動作

    JSON

    {
      "sections": [
        {
          "header": "Section Header",
          "collapsible": true,
          "uncollapsibleWidgetsCount": 1,
          "widgets": [
            {
              "selectionInput": {
                "name": "location",
                "label": "Select Color",
                "type": "DROPDOWN",
                "onChangeAction": {
                  "all_widgets_are_required": true
                },
                "items": [
                  {
                    "text": "Red",
                    "value": "red",
                    "selected": false
                  },
                  {
                    "text": "Green",
                    "value": "green",
                    "selected": false
                  },
                  {
                    "text": "White",
                    "value": "white",
                    "selected": false
                  },
                  {
                    "text": "Blue",
                    "value": "blue",
                    "selected": false
                  },
                  {
                    "text": "Black",
                    "value": "black",
                    "selected": false
                  }
                ]
              }
            }
          ]
        }
      ]
    }
    

    設定文字輸入小工具的驗證設定

    textInput 小工具的驗證欄位,可以指定 文字輸入小工具

    設定文字輸入小工具的字元限制

    JSON

    {
      "sections": [
        {
          "header": "Tell us about yourself",
          "collapsible": true,
          "uncollapsibleWidgetsCount": 2,
          "widgets": [
            {
              "textInput": {
                "name": "favoriteColor",
                "label": "Favorite color",
                "type": "SINGLE_LINE",
                "validation": {"character_limit":15},
                "onChangeAction":{
                  "all_widgets_are_required": true
                }
              }
            }
          ]
        }
      ]
    }
    

    設定文字輸入小工具的輸入類型

    JSON

    {
      "sections": [
        {
          "header": "Validate text inputs by input types",
          "collapsible": true,
          "uncollapsibleWidgetsCount": 2,
          "widgets": [
            {
              "textInput": {
                "name": "mailing_address",
                "label": "Please enter a valid email address",
                "type": "SINGLE_LINE",
                "validation": {
                  "input_type": "EMAIL"
                },
                "onChangeAction": {
                  "all_widgets_are_required": true
                }
              }
            },
            {
              "textInput": {
                "name": "validate_integer",
                "label": "Please enter a number",
                  "type": "SINGLE_LINE",
                "validation": {
                  "input_type": "INTEGER"
                }
              }
            },
            {
              "textInput": {
                "name": "validate_float",
                "label": "Please enter a number with a decimal",
                "type": "SINGLE_LINE",
                "validation": {
                  "input_type": "FLOAT"
                }
              }
            }
          ]
        }
      ]
    }
    

    疑難排解

    Google Chat 應用程式或 card 會傳回錯誤, 即時通訊介面會顯示「發生錯誤」的訊息。 或「無法處理你的要求」。有時使用 Chat UI 不會顯示任何錯誤訊息,但 Chat 應用程式或 資訊卡產生非預期的結果例如資訊卡訊息 顯示。

    雖然 Chat UI 中可能不會顯示錯誤訊息, 提供描述性錯誤訊息和記錄資料,協助您修正錯誤 。如需觀看說明, 偵錯及修正錯誤,請參閱 疑難排解並修正 Google Chat 錯誤