Устранение неполадок и исправление карточек и диалогов

В этом руководстве описаны распространенные ошибки, связанные с картами , с которыми вы можете столкнуться, и способы их устранения.


Используйте конструктор карточек для разработки и предварительного просмотра сообщений и пользовательских интерфейсов для приложений чата:

Откройте конструктор карточек

Как появляются ошибки карты

Ошибки карты проявляются по-разному:

  • Часть карточки, например виджет или компонент, не отображается и не отображается неожиданным образом.
  • Вся карточка не отображается.
  • Диалог закрывается, не открывается или не загружается.

Если вы столкнулись с подобным поведением, это означает, что в карточке вашего приложения возникла ошибка.

Для справки: рабочее, безошибочное сообщение и диалог карты

Прежде чем рассматривать примеры ошибочных карточек, сначала рассмотрите это сообщение и диалог рабочей карты. Чтобы проиллюстрировать каждый пример ошибки и ее исправление, JSON этой карточки изменяется путем добавления ошибок.

Безошибочное сообщение карты

Вот рабочее, безошибочное карточное сообщение с подробной контактной информацией, которое включает заголовок, разделы и виджеты, такие как оформленный текст и кнопки:

Диалог без ошибок

Вот работающий, безошибочный диалог, который создает контакт путем сбора информации от пользователей, имеет нижний колонтитул и редактируемые виджеты, такие как ввод текста, переключатели и кнопки:

Ошибка: часть карты не отображается.

Иногда карты отображаются, но часть карты, которую вы ожидали увидеть, не отображается; вероятные причины:

  • Отсутствует обязательное поле JSON.
  • Поле JSON написано с ошибкой или неправильно написано с заглавной буквы.

Причина: отсутствует обязательное поле JSON.

В этом примере ошибка: отсутствует обязательное поле JSON title . В результате карта отображается, но части карты, которые должны появиться, не отображаются. Может быть сложно предсказать, как будут отображаться карточки, если обязательные поля опущены.

Чтобы исправить эту ошибку, добавьте необходимое поле JSON; в этом примере title .

Чтобы узнать, требуется ли поле JSON, см. справочную документацию Cards v2 . В этом примере обратитесь к описанию поля title в CardHeader .

Вот два примера:

Пример 1. Если указать subtitle , но пропустить обязательный title , весь заголовок станет пустым:

Заголовок этой карточки не отображается, поскольку отсутствует обязательное поле «Заголовок».
Рис. 1. Заголовок этой карточки не отображается, поскольку отсутствует обязательное поле title .

Просмотр ошибочного фрагмента JSON карты

Ошибка: в header отсутствует обязательное поле title .

    . . .
    "header": {

            "subtitle": "Software Engineer"
          }
    . . .
    

Посмотреть правильный фрагмент JSON карточки

Исправлено: обязательное поле title является частью спецификации header .

    . . .
    "header": {
            "title": "Sasha",
            "subtitle": "Software Engineer"
          }
    . . .
    

Пример 2. Если указать subtitle , imageUrl , imageType и imageAltText но пропустить обязательный title , изображение будет отображаться должным образом, но не субтитр:

Заголовок этой карточки не отображается, поскольку отсутствует обязательное поле «Заголовок».
Рис. 2. В заголовке этой карточки не отображается подзаголовок, поскольку отсутствует обязательное поле title , но изображение отображается должным образом.

Просмотр ошибочного фрагмента JSON карты

Ошибка: в header отсутствует обязательное поле title .

    . . .
    "header": {

            "subtitle": "Software Engineer",
            "imageUrl":
            "https://developers.google.com/chat/images/quickstart-app-avatar.png",
            "imageType": "CIRCLE",
            "imageAltText": "Avatar for Sasha",
          }
    . . .
    

Посмотреть правильный фрагмент JSON карточки

Исправлено: обязательное поле title является частью спецификации header .

    . . .
    "header": {
            "title": "Sasha",
            "subtitle": "Software Engineer",
            "imageUrl":
            "https://developers.google.com/chat/images/quickstart-app-avatar.png",
            "imageType": "CIRCLE",
            "imageAltText": "Avatar for Sasha",
          }
    . . .
    

Причина: JSON неправильно написан или написан с заглавной буквы.

В этом примере ошибка JSON карты включает в себя все необходимые поля, но одно поле, imageUrl , неправильно пишется с заглавной буквы как imageURL (заглавная R заглавная L ), что приводит к ошибке: изображение, на которое оно указывает, не отображается.

Чтобы исправить эту и другие подобные ошибки, используйте правильное форматирование JSON. В данном случае imageUrl верен. В случае сомнений сверьте JSON карты со справочным документом карты .

Заголовок этой карточки не отображается, поскольку отсутствует обязательное поле «Заголовок».
Рис. 3. В заголовке этой карточки не отображается подзаголовок, поскольку отсутствует обязательное поле title , но изображение отображается должным образом.

Просмотр ошибочного фрагмента JSON карты

Ошибка: поле imageURL неправильно написано с заглавной буквы. Это должен быть imageUrl .

    . . .
    "header": {
      "title": "Sasha",
      "subtitle": "Software Engineer",
      "imageURL":
      "https://developers.google.com/chat/images/quickstart-app-avatar.png",
      "imageType": "CIRCLE",
      "imageAltText": "Avatar for Sasha",
    }
    . . .
    

Посмотреть правильный фрагмент JSON карточки

Исправлено: поле imageUrl правильно пишется с заглавной буквы.

    . . .
    "header": {
            "title": "Sasha",
            "subtitle": "Software Engineer",
            "imageUrl":
            "https://developers.google.com/chat/images/quickstart-app-avatar.png",
            "imageType": "CIRCLE",
            "imageAltText": "Avatar for Sasha",
          }
    . . .
    

Ошибка: карточка не отображается целиком.

Иногда сама карта не появляется; вероятные причины:

Причина: Неверно указан buttonList или cardFixedFooter

Если сообщение или диалоговое окно карты содержит неправильно указанный виджет ButtonList или виджет CardFixedFooter с неправильно указанными кнопками, вся карточка не отображается, и на ее месте ничего не появляется. Неверные спецификации могут включать отсутствующие поля, поля с неправильным написанием или заглавными буквами, а также неправильно структурированный JSON, например отсутствующую запятую, кавычку или фигурную скобку.

Чтобы исправить эту ошибку, сверьте JSON карты со справочным документом карты . В частности, сравните любые виджеты ButtonList с руководством по виджетам ButtonList .

Пример. В руководстве по виджетам ButtonList передача неполного действия onClick в первую кнопку предотвращает отрисовку всей карточки.

Просмотр ошибочного фрагмента JSON карты

Ошибка: для объекта onClick не указаны поля, поэтому вся карточка не отображается.

    . . .
    {
      "buttonList": {
        "buttons": [
          {
            "text": "Share",
            "onClick": {


              }
            }
          },
          {
            "text": "Edit",
            "onClick": {
              "action": {
                "function": "goToView",
                "parameters": [
                  {
                    "key": "viewType",
                    "value": "EDIT",
                  }
                ],
              }
            }
          },
        ],
      },
    }
    . . .
    

Посмотреть правильный фрагмент JSON карточки

Исправлено: объект onClick теперь имеет поле openLink , поэтому карточка отображается должным образом.

    . . .
    {
      "buttonList": {
        "buttons": [
          {
            "text": "Share",
            "onClick": {
              "openLink": {
                "url": "https://example.com/share",
              }
            }
          },
          {
            "text": "Edit",
            "onClick": {
              "action": {
                "function": "goToView",
                "parameters": [
                  {
                    "key": "viewType",
                    "value": "EDIT",
                  }
                ],
              }
            }
          },
        ],
      },
    }
    . . .
    

Ошибка: диалоговое окно закрывается, зависает или не открывается.

Если диалоговое окно неожиданно закрывается, не загружается или не открывается, вероятной причиной является проблема с интерфейсом карты.

Вот наиболее распространенные причины:

Причина: CardFixedFooter не имеет primaryButton

В диалогах с виджетом CardFixedFooter необходимо указать primaryButton с текстом и цветом. Если вы пропустите primaryButton или установите его неправильно, весь диалог не появится.

Чтобы исправить эту ошибку, убедитесь, что виджет CardFixedFooter содержит правильно указанный primaryButton .

Просмотр ошибочного фрагмента JSON карты

Ошибка: для объекта fixedFooter не указано поле primaryButton , из-за чего диалоговое окно не загружается и не открывается.

    . . .
    "fixedFooter": {

        "onClick": {
          . . .
      },
      "secondaryButton": {
        . . .
        }
      }
    }
    . . .
    

Посмотреть правильный фрагмент JSON карточки

Исправлено: в fixedFooter теперь указано поле primaryButton , поэтому диалоговое окно работает должным образом.

    . . .
    "fixedFooter": {
      "primaryButton": {
        "text": "Submit",
        "color": {
          "red": 0,
          "blue": 1,
          "green": 0
        },
        "onClick": {
          . . .
      },
      "secondaryButton": {
        . . .
        }
      }
    }
    . . .
    

Причина: неверная настройка onClick в FixedFooter

В диалогах с виджетом CardFixedFooter неправильное указание параметра onClick для любой кнопки или его пропуск, что приводит к закрытию, сбою загрузки или открытию диалога.

Чтобы исправить эту ошибку, убедитесь, что каждая кнопка имеет правильно указанный параметр onClick .

Просмотр ошибочного фрагмента JSON карты

Ошибка: объект primaryButton имеет поле onClick с массивом параметров с ошибкой, из-за чего диалоговое окно не загружается и не открывается.

    . . .
    "fixedFooter": {
      "primaryButton": {
        "text": "Submit",
        "color": {
          "red": 0,
          "blue": 1,
          "green": 0
        },
        "onClick": {
          "action": {
            "function": "setLanguageType",
            "parrammetters": [
              {
                "key": "languageType",
                "value": "C++"
              }
            ]
          }
        }
      },
      "secondaryButton": {
        "text": "Cancel",
        "onClick": {
          "action": {
            "function": "reset"
          }
        }
      }
    }
    . . .
    

Посмотреть правильный фрагмент JSON карточки

Исправлено: объект primaryButton имеет поле onClick с правильно написанным массивом параметров, поэтому диалоговое окно работает должным образом.

    . . .
    "fixedFooter": {
      "primaryButton": {
        "text": "Submit",
        "color": {
          "red": 0,
          "blue": 1,
          "green": 0
        },
        "onClick": {
          "action": {
            "function": "setLanguageType",
            "parameters": [
              {
                "key": "languageType",
                "value": "C++"
              }
            ]
          }
        }
      },
      "secondaryButton": {
        "text": "Cancel",
        "onClick": {
          "action": {
            "function": "reset"
          }
        }
      }
    }
    . . .
    

Причина: TextInput не имеет name

Если диалоговое окно включает виджет TextInput , исключающий поле name , диалоговое окно ведет себя не так, как ожидалось. Он может закрыться, открыться, но не загружаться или не открыться.

Чтобы исправить эту ошибку, убедитесь, что каждый виджет TextInput содержит соответствующее поле name . Убедитесь, что каждое поле name на карточке уникально.

Просмотр ошибочного фрагмента JSON карты

Ошибка: для объекта textInput не указано поле name , из-за чего диалоговое окно закрывается, не загружается или не открывается.

    . . .
    {
      "textInput": {
        "label": "Name",
        "type": "SINGLE_LINE",

      }
    }
    . . .
    

Посмотреть правильный фрагмент JSON карточки

Исправлено: в textInput теперь указано поле name , поэтому диалоговое окно работает должным образом.

    . . .
    {
      "textInput": {
        "label": "Name",
        "type": "SINGLE_LINE",
        "name": "contactName"
      }
    }
    . . .
    

Действия открытия, отправки или отмены диалогового окна не выполняются при использовании асинхронной архитектуры приложения.

Если ваше приложение чата возвращает сообщение об ошибке Could not load dialog. Invalid response returned by bot. при работе с диалоговыми окнами это может быть связано с тем, что ваше приложение использует асинхронную архитектуру , например Cloud Pub/Sub или метод Create Message API.

Для открытия, отправки или отмены диалога требуется синхронный ответ от приложения чата с DialogEventType . Соответственно, диалоги не поддерживаются приложениями, созданными с использованием асинхронной архитектуры .

В качестве обходного пути рассмотрите возможность использования сообщения на карточке вместо диалога.

Другие ошибки карточек и диалогов

Если исправления, описанные на этой странице, не устраняют ошибку, связанную с картой, в вашем приложении, запросите журналы ошибок приложения . Запрос журналов может помочь найти ошибки в JSON карты или коде приложения, а журналы содержат описательные сообщения об ошибках, которые помогут вам их исправить.

Чтобы узнать, как исправить ошибки приложения Google Chat, см. разделы «Устранение неполадок и исправление приложения Google Chat» и «Отладка приложений Chat» .