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

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

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

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

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

Chat アプリのコマンドは、スラッシュ コマンド、クイック コマンド、メッセージ操作として作成できます。 各コマンドタイプを使用するには、ユーザーは次の操作を行います。
  1. スラッシュ コマンド: ユーザーは、メニューからスラッシュ コマンドを選択するか、スラッシュ(/)を入力してから、/about などの事前定義されたテキストを入力します。通常、Chat アプリでは、スラッシュ コマンドの引数テキストが必要です。

    Chat アプリでユーザーからの追加の入力が必要な場合は、スラッシュ コマンドを作成します。たとえば、ユーザーが検索する語句(/search receipts など)を入力した後に実行される /searchというスラッシュ コマンドを作成できます。

  2. クイック コマンド: ユーザーは、Chat メッセージの返信 欄からメニューを開いてコマンドを使用します。コマンドを使用するには、[追加] をクリックして、メニューからコマンドを選択します。

    Chat アプリが追加の入力を待たずにユーザーにすぐに応答できる場合は、クイック コマンドを作成します。たとえば、画像ですぐに応答する Random image というクイック コマンドを作成できます。

  3. メッセージ操作: ( デベロッパー プレビュー) ユーザーは、メッセージにカーソルを合わせて その他メニューをクリックして、メッセージ操作を使用します。コマンドを使用するには、その他メニューを開いて、 コマンドをメニューから選択します。

    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 アプリを呼び出すために入力または選択するものです。名前の下には簡単な説明も表示され、コマンドの使用方法がユーザーに示されます。

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

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

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

  • 短く、説明的で、操作可能な単語やフレーズを使用して、コマンドを ユーザーにわかりやすくします。たとえば、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
      • メッセージ操作名: ( デベロッパー プレビュー) ユーザーがメニューから選択して メッセージ操作を呼び出す表示名。50 文字以内で、特殊文字を含めることができます。例: Remind me
  5. 省略可: 読み込み通知メッセージ: ( デベロッパー プレビュー) メッセージ操作の実行中にユーザーに 表示するトースト通知メッセージ。ダイアログを開かないメッセージ操作でのみ使用できます。

  6. 省略可: Chat アプリが コマンドに ダイアログで応答するようにする場合は、 [ダイアログを開く] チェックボックスをオンにします。

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

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

コマンドに応答する

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

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

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

コマンドタイプ イベントの種類 コマンド メタデータ
スラッシュ コマンド MESSAGE message.slashCommand または message.annotation.slashCommand
クイック コマンド APP_COMMAND appCommandMetadata
メッセージ操作 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 に置き換えます。

メッセージ操作に応答する

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

Node.js

/**
 * Responds to an APP_COMMAND interaction event from Google Chat.
 *
 * @param {Object} event The interaction event from Google Chat.
 * @param {Object} res The HTTP response object.
 * @return {Object} The JSON response message with a confirmation.
 */
function handleAppCommand(event, res) {
  // Collect the command ID and type from the event metadata.
  const {appCommandId, appCommandType} = event.appCommandMetadata;

  // Use appCommandType to detect message actions.
  if (appCommandType === 'MESSAGE_ACTION' &&
      appCommandId === REMIND_ME_COMMAND_ID) {

    // Message actions can access the context of the message they were
    // invoked on, such as the text or sender of that message.
    const messageText = event.message.text;

    // Return a response that includes details from the original message.
    return res.send({
      text: `Setting a reminder for this message: "${messageText}"`
    });
  }
}

Apps Script

/**
 * Responds to an APP_COMMAND interaction event in Google Chat.
 *
 * @param {Object} event The interaction event from Google Chat.
 * @return {Object} The JSON response message with a confirmation.
 */
function onAppCommand(event) {
  // Collect the command ID and type from the event metadata.
  const {appCommandId, appCommandType} = event.appCommandMetadata;

  if (appCommandType === 'MESSAGE_ACTION' &&
      appCommandId === REMIND_ME_COMMAND_ID) {

    // Message actions can access the context of the message they were
    // invoked on, such as the text or sender of that message.
    const messageText = event.message.text;

    // Return a response that includes details from the original message.
    return { "text": "Setting a reminder for message: " + messageText };
  }
}

Python

def handle_app_command(event):
    """Responds to an APP_COMMAND interaction event from Google Chat.

    Args:
        event (dict): The interaction event from Google Chat.

    Returns:
        dict: The JSON response message with a confirmation.
    """
    # Collect the command ID and type from the event metadata.
    metadata = event.get('appCommandMetadata', {})
    if metadata.get('appCommandType') == 'MESSAGE_ACTION' and \
       metadata.get('appCommandId') == REMIND_ME_COMMAND_ID:

        # Message actions can access the context of the message they were
        # invoked on, such as the text or sender of that message.
        message_text = event.get('message', {}).get('text')

        # Return a response that includes details from the original message.
        return {
            "text": f'Setting a reminder for message: "{message_text}"'
        }

Java

/**
 * Responds to an APP_COMMAND interaction event from Google Chat.
 *
 * @param event The interaction event from Google Chat.
 * @param response The HTTP response object.
 */
void handleAppCommand(JsonObject event, HttpResponse response) throws Exception {
  // Collect the command ID and type from the event metadata.
  JsonObject metadata = event.getAsJsonObject("appCommandMetadata");
  String appCommandType = metadata.get("appCommandType").getAsString();

  if (appCommandType.equals("MESSAGE_ACTION")) {
    int commandId = metadata.get("appCommandId").getAsInt();
    if (commandId == REMIND_ME_COMMAND_ID) {
      // Message actions can access the context of the message they were
      // invoked on, such as the text or sender of that message.
      String messageText = event.getAsJsonObject("message").get("text").getAsString();

      // Return a response that includes details from the original message.
      JsonObject responseMessage = new JsonObject();
      responseMessage.addProperty("text", "Setting a reminder for message: " + messageText);
      response.getWriter().write(responseMessage.toString());
    }
  }
}

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

コマンドをテストする

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

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