Przedstawianie złożonych danych za pomocą zasobu niestandardowego

Z tego przewodnika dowiesz się, jak zdefiniować zasoby niestandardowe w Google Workspace Studio.

Zasoby niestandardowe to struktury danych, które możesz zdefiniować, aby grupować ze sobą wiele zmiennych. Gdy dane wyjściowe kroku mają statyczną strukturę, przedstaw je za pomocą zasobu niestandardowego. Aby na przykład utworzyć potencjalnego klienta w systemie CRM, dane wyjściowe muszą zawierać kilka zmiennych:

  • Adres e-mail
  • Ulica i numer
  • Nazwa

Aby mieć pewność, że wszystkie dane wymagane do utworzenia potencjalnego klienta w systemie CRM są dostępne, wygeneruj zasób niestandardowy zawierający adres e-mail, ulicę i numer oraz nazwę.

Generowanie zasobu niestandardowego jako odniesienia

Generując zasób niestandardowy jako odniesienie, możesz zwracać go za pomocą identyfikatora zamiast pełnego obiektu zasobu niestandardowego. Jeśli zasób niestandardowy jest duży lub złożony, przekazywanie tylko identyfikatora zwiększa wydajność, ponieważ zmniejsza ilość danych przesyłanych między krokami.

Aby wygenerować zasób niestandardowy jako odniesienie, edytuj plik manifestu i kod kroku.

Edytowanie pliku manifestu

W pliku manifestu:

  1. Określ workflowResourceDefinitions i przypisz mu id, tablicę fields[] oraz providerFunction. workflowResourceDefinitions to struktura, która definiuje typy danych i zawartość zasobu niestandardowego.

  2. W tablicy fields[] określ poszczególne pola, które składają się na zasób niestandardowy. W tym przykładzie są to field_1 i field_2.

  3. Wartość providerFunction musi odpowiadać nazwie funkcji w kodzie kroku. providerFunction pobiera rzeczywistą zawartość zasobu niestandardowego, gdy jest to potrzebne.

    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. W outputs[] określ zmienną wyjściową, która zwraca dynamiczny zbiór zmiennych wyjściowych. Zmienna wyjściowa ma dataType z właściwością resourceType. Wartość cardinality musi być równa SINGLE.

    JSON

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

Oto kompletny plik manifestu, który definiuje zasób niestandardowy:

JSON

{
  "timeZone": "America/Los_Angeles",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "addOns": {
    "common": {
      "name": "Custom Resource (as reference)",
      "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/pets_black_48dp.png",
      "useLocaleFromApp": true
    },
    "flows": {
      "workflowElements": [
        {
          "id": "getResourceDataReference",
          "state": "ACTIVE",
          "name": "Custom Resource (as reference)",
          "description": "Output a custom resource as a reference",
          "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"
        }
      ]
    }
  }
}

Edytowanie kodu

W kodzie aplikacji:

  1. Zaimplementuj providerFunction, w tym przykładzie o nazwie onMessageResourceFunction, która pobiera zawartość zasobu niestandardowego, gdy jest to potrzebne. Pobiera ona dane wejściowe e, czyli ładunek JSON obiektu zdarzenia kroku , i na jego podstawie ustawia identyfikator zasobu niestandardowego.

    Apps Script

    function onMessageResourceFunction(e) {
      console.log("Payload in onMessageResourceFunction: " + JSON.stringify(e));
    
      var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId;
      let fieldValue_1;
      let fieldValue_2;
    
      // Using an if condition to mock a database call.
      if (resource_id == "sample_resource_reference_id") {
        fieldValue_1 = AddOnsResponseService.newVariableData()
          .addStringValue("value1");
        fieldValue_2 = AddOnsResponseService.newVariableData()
          .addStringValue("value2");
      } else {
        fieldValue_1 = AddOnsResponseService.newVariableData()
          .addStringValue("field_1 value not found");
        fieldValue_2 = AddOnsResponseService.newVariableData()
          .addStringValue("field_2 value not found");
      }
    
      let resourceData = AddOnsResponseService.newResourceData()
        .addVariableData("field_1", fieldValue_1)
        .addVariableData("field_2", fieldValue_2)
    
      let workflowAction = AddOnsResponseService.newResourceRetrievedAction()
        .setResourceData(resourceData)
    
      let hostAppAction = AddOnsResponseService.newHostAppAction()
        .setWorkflowAction(workflowAction);
    
      return AddOnsResponseService.newRenderActionBuilder()
        .setHostAppAction(hostAppAction)
        .build();
    }
    
  2. Funkcja dostawcy musi zwracać wartość zasobu niestandardowego, pobierając ją za pomocą odpowiedniego mechanizmu, np. wywołując interfejs API lub odczytując bazę danych.

  3. Aby pobrać i zwrócić zasób niestandardowy według jego identyfikatora, zwróć go jako returnOutputVariablesAction, jak pokazano w onExecuteResourceFunction.

    Apps Script

    function onExecuteResourceFunction(e) {
      console.log("Payload in onExecuteResourceFunction: " + JSON.stringify(e));
    
      let outputVariables = AddOnsResponseService.newVariableData()
        .addResourceReference("sample_resource_reference_id");
    
      let workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
        .addVariableData("resource_data", outputVariables);
    
      let hostAppAction = AddOnsResponseService.newHostAppAction()
        .setWorkflowAction(workflowAction);
    
      return AddOnsResponseService.newRenderActionBuilder()
        .setHostAppAction(hostAppAction)
        .build();
    }
    

Oto kompletny przykład:

Apps Script

function onConfigResourceFunction() {
  let section = CardService.newCardSection()
    .addWidget(
      CardService.newTextParagraph()
        .setText("This is the Custom Resource Demo card")
    );

  const card = CardService.newCardBuilder()
    .addSection(section)
    .build();

  return card;
}

function onMessageResourceFunction(e) {
  console.log("Payload in onMessageResourceFunction: " + JSON.stringify(e));

  var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId;
  let fieldValue_1;
  let fieldValue_2;

  // Using an if condition to mock a database call.
  if (resource_id == "sample_resource_reference_id") {
    fieldValue_1 = AddOnsResponseService.newVariableData()
      .addStringValue("value1");
    fieldValue_2 = AddOnsResponseService.newVariableData()
      .addStringValue("value2");
  } else {
    fieldValue_1 = AddOnsResponseService.newVariableData()
      .addStringValue("field_1 value not found");
    fieldValue_2 = AddOnsResponseService.newVariableData()
      .addStringValue("field_2 value not found");
  }

  let resourceData = AddOnsResponseService.newResourceData()
    .addVariableData("field_1", fieldValue_1)
    .addVariableData("field_2", fieldValue_2)

  let workflowAction = AddOnsResponseService.newResourceRetrievedAction()
    .setResourceData(resourceData)

  let hostAppAction = AddOnsResponseService.newHostAppAction()
    .setWorkflowAction(workflowAction);

  return AddOnsResponseService.newRenderActionBuilder()
    .setHostAppAction(hostAppAction)
    .build();
}

function onExecuteResourceFunction(e) {
  console.log("Payload in onExecuteResourceFunction: " + JSON.stringify(e));

  let outputVariables = AddOnsResponseService.newVariableData()
    .addResourceReference("sample_resource_reference_id");

  let workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
    .addVariableData("resource_data", outputVariables);

  let hostAppAction = AddOnsResponseService.newHostAppAction()
    .setWorkflowAction(workflowAction);

  return AddOnsResponseService.newRenderActionBuilder()
    .setHostAppAction(hostAppAction)
    .build();
}