构建互动式卡片

大多数插件除了显示数据外,还需要用户输入信息。构建基于卡片的插件时,您可以使用交互式微件(例如按钮、工具栏菜单项或复选框)要求用户提供插件所需的数据或提供其他互动控制。

向微件添加操作

在大多数情况下,您要将微件关联到特定操作,并在回调函数中实现所需的行为,从而使微件具有互动性。如需了解详情,请参阅附加操作

在大多数情况下,您可以按照以下常规流程将微件配置为在选择或更新时执行特定操作:

  1. 创建一个 Action 对象,指定应执行的回调函数以及所有必需参数。
  2. 通过调用相应的微件处理程序函数,将微件关联到 Action
  3. 实现回调函数,以执行所需的行为。

示例

以下示例设置一个按钮,点击该按钮后会显示用户通知。点击会触发 notifyUser() 回调函数,其参数用于指定通知文本。返回构建的 ActionResponse 会导致显示通知。

  /**
   * Build a simple card with a button that sends a notification.
   * @return {Card}
   */
  function buildSimpleCard() {
    var buttonAction = CardService.newAction()
        .setFunctionName('notifyUser')
        .setParameters({'notifyText': 'Button clicked!'});
    var button = CardService.newTextButton()
        .setText('Notify')
        .setOnClickAction(buttonAction);

    // ...continue creating widgets, then create a Card object
    // to add them to. Return the built Card object.
  }

  /**
   * Callback function for a button action. Constructs a
   * notification action response and returns it.
   * @param {Object} e the action event object
   * @return {ActionResponse}
   */
  function notifyUser(e) {
    var parameters = e.parameters;
    var notificationText = parameters['notifyText'];
    return CardService.newActionResponseBuilder()
        .setNotification(CardService.newNotification()
            .setText(notificationText)
            .setType(CardService.NotificationType.INFO))
        .build();      // Don't forget to build the response!
  }

设计有效的互动

设计互动式卡片时,请注意以下几点:

  • 交互式微件通常至少需要一个处理程序方法来定义其行为。

  • 如果您有一个网址,并且只想在标签页中打开它,请使用 setOpenLink() widget 处理程序函数。这样就无需定义 Action 对象和回调函数。如果您需要先构建网址,或在打开网址之前执行任何其他步骤,请定义 Action 并改用 setOnClickOpenLinkAction()

  • 使用 setOpenLink()setOnClickOpenLinkAction() 微件处理程序函数时,您需要提供 OpenLink 对象来定义要打开的网址。您还可以使用 OpenAsOnClose 枚举使用此对象指定打开和关闭行为。

  • 多个 widget 可以使用相同的 Action 对象。但是,如果您想为回调函数提供不同的参数,则需要定义不同的 Action 对象。

  • 保持回调函数的简单性。为了让插件能够及时响应,卡片服务将回调函数的执行时间限制在 30 秒以内。如果执行时间超过这一时间,插件界面可能无法正确更新其卡片显示方式以响应 Action

  • 如果第三方后端的数据状态因用户与插件界面的互动而发生变化,建议将插件的“状态”设置更改为“true”,以便清除所有现有客户端缓存。如需了解详情,请参阅 ActionResponseBuilder.setStateChanged() 方法说明。