使用自定义资源表示复杂数据

本指南介绍了如何为 Google Workspace Flows 定义自定义资源。

自定义资源是您可以定义的自定义数据结构,用于将多个变量分组在一起。例如,如需创建 CRM 潜在客户,请传递包含电子邮件地址、街道地址和名称的自定义资源。

您可以通过以下两种方式定义自定义资源:

  • 作为引用:当您将自定义资源作为引用输出时,您会按 ID 返回自定义资源,而不是返回完整的自定义资源对象。这可以通过减少流步骤之间传输的数据来提高性能。当数据需要进行二次查找时,返回其 ID 对于执行这些查找非常有用。
  • 作为值:如果必须在执行期间检索数据,或者自定义资源较小且不包含敏感数据,请使用此方法。

以引用的形式输出自定义资源

通过将自定义资源作为引用输出,您可以按 ID 返回自定义资源,而不是返回完整的自定义资源对象。如果自定义资源较大或较复杂,则仅传递 ID 可减少流程步骤之间的数据传输,从而提高性能。

如需将自定义资源作为参考输出,请修改相应步骤的清单文件和代码。

修改清单文件

在清单文件中:

  1. 指定一个 workflowResourceDefinitions 并为其分配一个 id、一个 fields[] 数组和一个 providerFunctionworkflowResourceDefinitions 是一种结构,用于定义自定义资源的数据类型和内容。

  2. fields[] 数组中,您可以指定构成自定义资源的各个字段,在本例中为 field_1field_2

  3. providerFunction 的值必须与相应步骤代码中的函数名称一致。providerFunction 会在需要时检索实际的自定义资源内容。

    JSON

    {
        "workflowResourceDefinitions": [
            {
                "id": "resource_id",
                "name": "Custom Resource",
                "fields": [
                    {
                        "selector": "field_1",
                        "name": "Field 1",
                        "dataType": {
                            "basicType": "STRING"
                        }
                    },
                    {
                        "selector": "field_2",
                        "name": "Field 2",
                        "dataType": {
                            "basicType": "STRING"
                        }
                    }
                ],
                "providerFunction": "onMessageResourceFunction"
            }
        ]
    }
    
  4. outputs[] 中,指定一个返回动态输出变量集的输出变量。输出变量具有 dataType,其属性为 resourceTypecardinality 的值必须为 SINGLE

    JSON

    "outputs": [{
            "id": "resource_data",
            "description": "Resource Data",
            "cardinality": "SINGLE",
            "dataType": {
              "resourceType": { "workflowResourceDefinitionId": "resource_id" }
            }
          }]
    

以下是定义自定义资源的完整清单文件:

JSON

{
    "timeZone": "America/Los_Angeles",
    "exceptionLogging": "STACKDRIVER",
    "runtimeVersion": "V8",
    "addOns": {
        "common": {
            "name": "Calculator",
            "logoUrl": "https://www.gstatic.com/images/branding/productlogos/calculator_search/v1/web-24dp/logo_calculator_search_color_1x_web_24dp.png",
            "useLocaleFromApp": true
        },
        "flows": {
            "workflowElements": [
                {
                    "id": "getResourceData",
                    "state": "ACTIVE",
                    "name": "Get Resource by ID",
                    "description": "Get Resource by ID",
                    "workflowAction": {
                        "outputs": [
                            {
                                "id": "resource_data",
                                "description": "Resource Data",
                                "cardinality": "SINGLE",
                                "dataType": {
                                    "resourceType": {
                                        "workflowResourceDefinitionId": "resource_id"
                                    }
                                }
                            }
                        ],
                        "onConfigFunction": "onConfigResourceFunction",
                        "onExecuteFunction": "onExecuteResourceFunction"
                    }
                }
            ],
            "workflowResourceDefinitions": [
                {
                    "id": "resource_id",
                    "name": "Custom Resource",
                    "fields": [
                        {
                            "selector": "field_1",
                            "name": "Field 1",
                            "dataType": {
                                "basicType": "STRING"
                            }
                        },
                        {
                            "selector": "field_2",
                            "name": "Field 2",
                            "dataType": {
                                "basicType": "STRING"
                            }
                        }
                    ],
                    "providerFunction": "onMessageResourceFunction"
                }
            ]
        }
    }
}

修改代码

在应用代码中:

  1. 实现 providerFunction(在本例中称为 onMessageResourceFunction()),该方法会在需要时检索自定义资源内容。它接受输入 e,即步骤的事件对象 JSON 载荷,并从中设置自定义资源 ID。

    Apps 脚本

    function onMessageResourceFunction(e) {
      var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId;
      var field_1 = ...;
      var field_2 = ...;
    
      return {
        "hostAppAction": {
          "workflowAction": {
            "resourceRetrievedAction": {
              "resourceJson": JSON.stringify({
                "field_1": field_1,
                "field_2": field_2,
              })
            }
          }
        }
      };
    }
    
  2. 提供程序函数必须通过适当的机制(例如调用 API 或读取数据库)检索自定义资源的值,然后返回该值。

  3. 如需按自定义资源的 ID 检索并返回该资源,请将其作为 returnOutputVariablesAction 返回,如 onExecuteResourceFunction() 中所示。

    Apps 脚本

    function onExecuteResourceFunction(e) {
      var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId;
      return {
        "hostAppAction": {
          "workflowAction": {
            "returnOutputVariablesAction": {
              "variableValues": [{
                "variableId": "resource_data",
                "variableData": {
                  "resourceReferences" : [ resource_id ]
                }
              }]
            }
          }
        }
      };
    }
    

以下是完整的示例:

Apps 脚本

function onMessageResourceFunction(e) {
  var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId;
  var field_1 = ...;
  var field_2 = ...;

  return {
    "hostAppAction": {
      "workflowAction": {
        "resourceRetrievedAction": {
          "resourceJson": JSON.stringify({
            "field_1": field_1,
            "field_2": field_2,
          })
        }
      }
    }
  };
}

function onExecuteResourceFunction(e) {
  var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId;
  return {
    "hostAppAction": {
      "workflowAction": {
        "returnOutputVariablesAction": {
          "variableValues": [{
            "variableId": "resource_data",
            "variableData": {
              "resourceReferences" : [ resource_id ]
            }
          }]
        }
      }
    }
  };
}

将自定义资源作为值输出

将自定义资源作为引用输出时,您会按 ID 返回自定义资源,而不是返回完整的自定义资源对象。如果您需要传递整个资源对象,可以使用 resourceValues

resourceValues 中,您可以定义某个步骤的输出。

如需将自定义资源作为值输出,请修改相应步骤的清单文件和代码。

修改清单文件

在清单文件中:

  1. 指定 workflowResourceDefinitions 并为其分配 ID。workflowResourceDefinitions 是一种结构,用于定义自定义资源的数据类型和内容。在 workflowResourceDefinitions 中,您可以指定构成自定义资源的各个字段,在本例中为 field_1field_2

  2. 指定一个 providerFunction,其值为相应步骤代码中某个函数的名称。providerFunction 会在需要时检索实际的自定义资源内容。

    JSON

    {
        "workflowResourceDefinitions": [
            {
                "id": "resource_id",
                "name": "Custom Resource",
                "fields": [
                    {
                        "selector": "field_1",
                        "name": "Field 1",
                        "dataType": {
                            "basicType": "STRING"
                        }
                    },
                    {
                        "selector": "field_2",
                        "name": "Field 2",
                        "dataType": {
                            "basicType": "STRING"
                        }
                    }
                ],
                "providerFunction": "onExecuteResourceAsValuesFunction"
            }
        ]
    }
    
  3. outputs[] 中,指定一个返回 resourceValues 的输出变量。 cardinality 的值必须为 SINGLE

    JSON

    {
        "outputs": [
            {
                "id": "resource_data",
                "description": "Resource Data",
                "cardinality": "SINGLE",
                "dataType": {
                    "resourceValues": {
                        "value1": "value one"
                    }
                }
            }
        ]
    }
    

以下是定义自定义资源的完整清单文件:

JSON

{
    "timeZone": "America/Los_Angeles",
    "exceptionLogging": "STACKDRIVER",
    "runtimeVersion": "V8",
    "addOns": {
        "common": {
            "name": "Calculator",
            "logoUrl": "https://www.gstatic.com/images/branding/productlogos/calculator_search/v1/web-24dp/logo_calculator_search_color_1x_web_24dp.png",
            "useLocaleFromApp": true
        },
        "flows": {
            "workflowElements": [
                {
                    "id": "getResourceData",
                    "state": "ACTIVE",
                    "name": "Get Resource by ID",
                    "description": "Get Resource by ID",
                    "workflowAction": {
                        "outputs": [
                            {
                                "id": "resource_data",
                                "description": "Resource Data",
                                "cardinality": "SINGLE",
                                "dataType": {
                                    "resourceValues": {
                                        "value1": "value one"
                                    }
                                }
                            }
                        ],
                        "onConfigFunction": "onConfigResourceFunction",
                        "onExecuteFunction": "onExecuteResourceFunction"
                    }
                }
            ],
            "workflowResourceDefinitions": [
                {
                    "id": "resource_id",
                    "name": "Custom Resource",
                    "fields": [
                        {
                            "selector": "field_1",
                            "name": "Field 1",
                            "dataType": {
                                "basicType": "STRING"
                            }
                        },
                        {
                            "selector": "field_2",
                            "name": "Field 2",
                            "dataType": {
                                "basicType": "STRING"
                            }
                        }
                    ],
                    "providerFunction": "onExecuteResourceAsValuesFunction"
                }
            ]
        }
    }
}

修改代码

在应用代码中,实现 providerFunction(在本示例中称为 onExecuteResourceAsValuesFunction()),该方法会以 JSON 格式定义并返回自定义资源,在此处抽象为 resourceJSON

Apps 脚本

function onExecuteResourceAsValuesFunction() {
  var field_1 = "value 1";
  var field_2 = "value 2";
  var resourceJSON = JSON.stringify({
    "field_1": field_1,
    "field_2": field_2,
  });
  return {
    "hostAppAction": {
      "workflowAction": {
        "returnOutputVariablesAction": {
          "variableValues": [{
            "variableId": "resource_data",
            "variableData": {
              "resourceValues" : [ resourceJSON ]
            }
          }]
        }
      }
    }
  };
}