Google Chat アプリのコマンドに応答する

このページでは、Google Chat 用アプリとしてコマンドを設定して応答する方法について説明します。

コマンドを使用すると、ユーザーは Chat 用アプリの主な機能を見つけて使用できます。コマンドの内容を表示できるのは Chat 用アプリのみです。たとえば、ユーザーがスラッシュ コマンドを含むメッセージを送信した場合、そのメッセージはユーザーと Chat 用アプリにのみ表示されます。

コマンドを構築するかどうかを判断し、ユーザー インタラクションを設計する方法を理解するには、すべてのユーザー ジャーニーを定義するをご覧ください。

Chat アプリのコマンドの種類

Chat 用アプリのコマンドは、スラッシュ コマンドまたはクイック コマンドとしてビルドできます。ユーザーが各タイプのコマンドを検出して使用するには、次の操作を行います。
  1. スラッシュ コマンド: ユーザーは、スラッシュ(/)の後に /about などの定義済みのテキストを入力して、コマンドをメッセージとして送信します。Chat 用アプリでは、スラッシュ コマンドの引数テキストを必須にすることもできます。たとえば、スラッシュ コマンド /search は、検索クエリに使用される引数テキストを必要とする場合があります。
  2. クイック コマンド: ユーザーは、Chat メッセージの返信欄からメニューを開いてコマンドを使用します。コマンドを使用するには、[追加] をクリックし、メニューからコマンドを選択します。
次の画像は、ユーザーがスラッシュ コマンドとクイック コマンドのメニューを見つける方法を示しています。
  • ユーザーがスラッシュ コマンドを見つけます。
    図 1: ユーザーは、返信欄にスラッシュ / を入力し、その後にコマンド名を入力することで、スラッシュ コマンドを見つけて使用します。
  • ユーザーがメニューからクイック コマンドを表示します。
    図 2. ユーザーは、Chat メッセージの返信欄にあるメニューからクイック コマンドを見つけて使用します。

前提条件

Node.js

インタラクション イベントを受信して応答する Google Chat 用アプリ。HTTP サービスを使用してインタラクティブな Chat 用アプリを作成するには、このクイックスタートを完了してください。

Apps Script

インタラクション イベントを受信して応答する Google Chat 用アプリ。Apps Script で双方向の Chat 用アプリを作成するには、このクイック スタートを完了してください。

Python

インタラクション イベントを受信して応答する Google Chat 用アプリ。HTTP サービスを使用してインタラクティブな Chat 用アプリを作成するには、このクイックスタートを完了してください。

Java

インタラクション イベントを受信して応答する Google Chat 用アプリ。HTTP サービスを使用してインタラクティブな Chat 用アプリを作成するには、このクイックスタートを完了してください。

コマンドを設定する

このセクションでは、次の手順でコマンドを設定する方法について説明します。

  1. コマンドの名前と説明を作成します。
  2. Google Cloud コンソールでコマンドを構成します。

コマンドの名前と説明を入力する

コマンド名は、ユーザーが Chat 用アプリを呼び出すために入力または選択するものです。コマンド名の横には、コマンドの使用方法をユーザーに促す短い説明も表示されます。

スラッシュ コマンドの名前と説明
図 3: スラッシュ コマンドの名前と説明。

コマンドの名前と説明を選択する際は、次の推奨事項を考慮してください。

コマンドに名前を付けるには:

  • 短く、説明的で、アクション可能な単語やフレーズを使用して、ユーザーにコマンドを明確に伝えます。たとえば、Create a reminder ではなく Remind me を使用します。
  • コマンドには一意の名前または一般的な名前を使用することを検討してください。コマンドが一般的な操作や機能を説明している場合は、ユーザーが認識して期待する一般的な名前(SettingsFeedback など)を使用できます。それ以外の場合は、一意のコマンド名を使用してください。コマンド名が他の Chat 用アプリと同じ場合、ユーザーは類似したコマンドをフィルタして、自分のコマンドを見つけて使用する必要があります。

コマンドの説明を取得するには:

  • ユーザーがコマンドを使用する際に期待できることを理解できるよう、説明は短くわかりやすいものにしてください。
  • コマンドに書式設定の要件がある場合は、ユーザーに伝えます。たとえば、引数テキストを必要とするスラッシュ コマンドを作成する場合は、説明を Remind me to do [something] at [time] のように設定します。
  • Chat 用アプリがスペース内の全員に返信するのか、コマンドを呼び出したユーザーに非公開で返信するのかをユーザーに知らせます。たとえば、クイック コマンド About の場合は、Learn about this app (Only visible to you) と記述できます。

Google Cloud コンソールでコマンドを構成する

スラッシュ コマンドまたはクイック コマンドを作成するには、Google Chat API の Chat 用アプリの構成でコマンドに関する情報を指定します。

Google Chat API でコマンドを構成する手順は次のとおりです。

  1. Google Cloud コンソールで、メニュー > [API とサービス] > [有効な API とサービス] > [Google Chat API] をクリックします。

    Google Chat API ページに移動

  2. [構成] をクリックします。

  3. [コマンド] で、[コマンドを追加] をクリックします。

  4. コマンドのコマンド ID、説明、コマンドタイプ、名前を入力します。

    • コマンド ID: Chat 用アプリがコマンドを認識してレスポンスを返すために使用する 1 ~ 1,000 の数値。
    • 説明: コマンドの機能を説明するテキスト。説明は 50 文字以内で、特殊文字を含めることができます。
    • コマンドの種類: [クイック コマンド] または [スラッシュ コマンド] を選択します。
    • クイック コマンドまたはスラッシュ コマンドの名前を指定します。
      • クイック コマンド名: ユーザーがメニューから選択してコマンドを呼び出す表示名。半角 50 文字以内で、特殊文字を含めることができます。例: Remind me
      • スラッシュ コマンド名: ユーザーがメッセージ内でコマンドを呼び出すために入力するテキスト。スラッシュで始まり、テキストのみを含み、最大 50 文字にできます。例: /remindMe
  5. 省略可: Chat 用アプリがコマンドにダイアログで応答するようにする場合は、[ダイアログを開く] チェックボックスをオンにします。

  6. [保存] をクリックします。

これで、Chat 用アプリのコマンドが構成されました。

コマンドに応答する

ユーザーがコマンドを使用すると、Chat 用アプリはインタラクション イベントを受け取ります。イベント ペイロードには、呼び出されたコマンドの詳細(コマンド ID やコマンドタイプなど)を含むメタデータが含まれているため、適切なレスポンスを返すことができます。

Cymbal Labs Chat アプリのプライベート メッセージ。このメッセージには、Chat アプリが Cymbal Labs によって作成されたこと、ドキュメントへのリンク、サポートチームへの連絡先へのリンクが記載されています。
Chat 用アプリがスラッシュ コマンド /help に非公開で応答し、サポートを受ける方法を説明します。

各コマンド タイプに応答するには、イベント ペイロードでさまざまなイベントタイプとメタデータ オブジェクトを処理する必要があります。

コマンドタイプ イベントの種類 コマンド メタデータ
スラッシュ コマンド MESSAGE message.slashCommand または message.annotation.slashCommand
クイック コマンド APP_COMMAND appCommandMetadata

メッセージでコマンドに応答する方法については、次のセクションをご覧ください。

スラッシュ コマンドに応答する

次のコードは、スラッシュ コマンド /about に応答する Chat 用アプリの例を示しています。Chat 用アプリは MESSAGE インタラクション イベントを処理し、インタラクション イベントに一致するコマンド ID が含まれているかどうかを検出し、非公開メッセージを返します。

Node.js

node/avatar-app/index.js
/**
 * Handles slash and quick commands.
 *
 * @param {Object} event - The Google Chat event.
 * @param {Object} res - The HTTP response object.
 */
function handleAppCommands(event, res) {
  const {appCommandId, appCommandType} = event.appCommandMetadata;

  switch (appCommandId) {
    case ABOUT_COMMAND_ID:
      return res.send({
        privateMessageViewer: event.user,
        text: 'The Avatar app replies to Google Chat messages.'
      });
    case HELP_COMMAND_ID:
      return res.send({
        privateMessageViewer: event.user,
        text: 'The Avatar app replies to Google Chat messages.'
      });
  }
}

Apps Script

apps-script/avatar-app/avatar-app.gs
// Checks for the presence of a slash command in the message.
if (event.message.slashCommand) {
  // Executes the slash command logic based on its ID.
  // Slash command IDs are set in the Google Chat API configuration.
  switch (event.message.slashCommand.commandId) {
    case ABOUT_COMMAND_ID:
      return {
        privateMessageViewer: event.user,
        text: 'The Avatar app replies to Google Chat messages.'
      };
  }
}

Python

python/avatar-app/main.py
def handle_app_commands(event: Mapping[str, Any]) -> Mapping[str, Any]:
    """Handles slash and quick commands.

    Args:
        Mapping[str, Any] event: The Google Chat event.

    Returns:
        Mapping[str, Any]: the response
    """
    app_command_id = event["appCommandMetadata"]["appCommandId"]

    if app_command_id == ABOUT_COMMAND_ID:
        return {
            "privateMessageViewer": event["user"],
            "text": "The Avatar app replies to Google Chat messages.",
        }
    elif app_command_id == HELP_COMMAND_ID:
        return {
            "privateMessageViewer": event["user"],
            "text": "The Avatar app replies to Google Chat messages.",
        }
    return {}

Java

java/avatar-app/src/main/java/AvatarApp.java
/**
 * Handles slash and quick commands.
 *
 * @param event    The Google Chat event.
 * @param response The HTTP response object.
 */
private void handleAppCommands(JsonObject event, HttpResponse response) throws Exception {
  int appCommandId = event.getAsJsonObject("appCommandMetadata").get("appCommandId").getAsInt();

  switch (appCommandId) {
    case ABOUT_COMMAND_ID:
      Message aboutMessage = new Message();
      aboutMessage.setText("The Avatar app replies to Google Chat messages.");
      aboutMessage.setPrivateMessageViewer(new User()
          .setName(event.getAsJsonObject("user").get("name").getAsString()));
      response.getWriter().write(gson.toJson(aboutMessage));
      return;
    case HELP_COMMAND_ID:
      Message helpMessage = new Message();
      helpMessage.setText("The Avatar app replies to Google Chat messages.");
      helpMessage.setPrivateMessageViewer(new User()
          .setName(event.getAsJsonObject("user").get("name").getAsString()));
      response.getWriter().write(gson.toJson(helpMessage));
      return;
  }
}

ABOUT_COMMAND_ID は、Google Cloud コンソールでコマンドを構成したときに指定したコマンド ID に置き換えます。

クイック コマンドに応答する

次のコードは、クイック コマンド Help に返信する Chat 用アプリの例を示しています。Chat 用アプリは APP_COMMAND インタラクション イベントを処理し、インタラクション イベントに一致するコマンド ID が含まれているかどうかを検出し、非公開メッセージを返します。

Node.js

node/avatar-app/index.js
/**
 * Handles slash and quick commands.
 *
 * @param {Object} event - The Google Chat event.
 * @param {Object} res - The HTTP response object.
 */
function handleAppCommands(event, res) {
  const {appCommandId, appCommandType} = event.appCommandMetadata;

  switch (appCommandId) {
    case ABOUT_COMMAND_ID:
      return res.send({
        privateMessageViewer: event.user,
        text: 'The Avatar app replies to Google Chat messages.'
      });
    case HELP_COMMAND_ID:
      return res.send({
        privateMessageViewer: event.user,
        text: 'The Avatar app replies to Google Chat messages.'
      });
  }
}

Apps Script

apps-script/avatar-app/avatar-app.gs
/**
 * Handles the APP_COMMAND event type. This function is triggered when a user
 * interacts with a quick command within the Google Chat app.  It responds
 * based on the command ID.
 *
 * @param {Object} event The event object from Google Chat, containing details
 *     about the app command interaction.  It includes information like the
 *     command ID and the user who triggered it.
 */
function onAppCommand(event) {
  // Executes the quick command logic based on its ID.
  // Command IDs are set in the Google Chat API configuration.
  switch (event.appCommandMetadata.appCommandId) {
    case HELP_COMMAND_ID:
      return {
        privateMessageViewer: event.user,
        text: 'The Avatar app replies to Google Chat messages.'
      };
  }
}

Python

python/avatar-app/main.py
def handle_app_commands(event: Mapping[str, Any]) -> Mapping[str, Any]:
    """Handles slash and quick commands.

    Args:
        Mapping[str, Any] event: The Google Chat event.

    Returns:
        Mapping[str, Any]: the response
    """
    app_command_id = event["appCommandMetadata"]["appCommandId"]

    if app_command_id == ABOUT_COMMAND_ID:
        return {
            "privateMessageViewer": event["user"],
            "text": "The Avatar app replies to Google Chat messages.",
        }
    elif app_command_id == HELP_COMMAND_ID:
        return {
            "privateMessageViewer": event["user"],
            "text": "The Avatar app replies to Google Chat messages.",
        }
    return {}

Java

java/avatar-app/src/main/java/AvatarApp.java
/**
 * Handles slash and quick commands.
 *
 * @param event    The Google Chat event.
 * @param response The HTTP response object.
 */
private void handleAppCommands(JsonObject event, HttpResponse response) throws Exception {
  int appCommandId = event.getAsJsonObject("appCommandMetadata").get("appCommandId").getAsInt();

  switch (appCommandId) {
    case ABOUT_COMMAND_ID:
      Message aboutMessage = new Message();
      aboutMessage.setText("The Avatar app replies to Google Chat messages.");
      aboutMessage.setPrivateMessageViewer(new User()
          .setName(event.getAsJsonObject("user").get("name").getAsString()));
      response.getWriter().write(gson.toJson(aboutMessage));
      return;
    case HELP_COMMAND_ID:
      Message helpMessage = new Message();
      helpMessage.setText("The Avatar app replies to Google Chat messages.");
      helpMessage.setPrivateMessageViewer(new User()
          .setName(event.getAsJsonObject("user").get("name").getAsString()));
      response.getWriter().write(gson.toJson(helpMessage));
      return;
  }
}

HELP_COMMAND_ID は、Google Cloud コンソールでコマンドを構成したときに指定したコマンド ID に置き換えます。

コマンドをテストする

コマンドとコードをテストするには、Google Chat 用アプリのインタラクティブ機能をテストするをご覧ください。

Chat UI でコマンドをテストして使用する方法については、Google Chat ヘルプ ドキュメントの Google Chat でアプリを使用するをご覧ください。