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

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

Zasoby niestandardowe to struktury danych, które możesz zdefiniować, aby grupować ze sobą wiele zmiennych. Jeśli dane wyjściowe kroku mają statyczną strukturę, reprezentuj 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 masz wszystkie dane potrzebne do utworzenia potencjalnego klienta w systemie CRM, wygeneruj zasób niestandardowy zawierający adres e-mail, adres pocztowy i imię.

Wyświetlanie niestandardowego zasobu jako odwołania

Wyprowadzając zasób niestandardowy jako odniesienie, możesz zwrócić zasób niestandardowy według jego 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 poszczególnymi krokami.

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

Edytowanie pliku manifestu

W pliku manifestu:

  1. Określ workflowResourceDefinitions i przypisz do niego id, tablicę fields[]providerFunction. workflowResourceDefinitions to struktura, która określa typy danych i zawartość zasobu niestandardowego.

  2. W tablicy fields[] określasz poszczególne pola, które składają się na zasób niestandardowy, w tym przykładzie o nazwach field_1field_2.

  3. Wartość parametru providerFunction musi odpowiadać nazwie funkcji w kodzie kroku. providerFunction pobiera w razie potrzeby rzeczywistą zawartość zasobu niestandardowego.

    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[] 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 wynosić SINGLE.

    JSON

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

Oto pełny 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"
        }
      ]
    }
  }
}

Edytuj kod

W kodzie aplikacji:

  1. Zaimplementuj funkcję providerFunction, która w tym przykładzie ma nazwę onMessageResourceFunction() i w razie potrzeby pobiera zawartość zasobu niestandardowego. Pobiera dane wejściowe e, czyli ładunek JSON obiektu zdarzenia kroku, i na jego podstawie ustawia niestandardowy identyfikator zasobu.

    Google 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 a 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().

    Google 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 pełny przykład:

Google 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 a 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();
}