Definiowanie zmiennej dynamicznej

Z tego przewodnika dowiesz się, jak utworzyć zmienną dynamiczną.

Jeśli to możliwe, zmienna powinna być zdefiniowana statycznie w pliku manifestu jako albo zmienna wejściowa, zmienna wyjściowa, albo zasób niestandardowy. W niektórych sytuacjach wymagana jest jednak zmienna, którą można zdefiniować tylko wtedy, gdy użytkownik skonfiguruje przepływ, ponieważ charakter danych wejściowych jest różny. Na przykład liczby pytań i odpowiedzi (oraz ich treści) w Formularzach Google nie można określić, dopóki podczas konfigurowania przepływu nie zostanie wybrany konkretny formularz.

Zmienne dynamiczne uwzględniają te przypadki, umożliwiając zdefiniowanie w pliku manifestu i w kodzie kroku danych wejściowych, które generują dynamiczny zestaw danych wyjściowych.

Definiowanie zmiennej wyjściowej w pliku manifestu

W pliku manifestu skonfiguruj te ustawienia:

  • W inputs[] określ zmienną wejściową, która akceptuje dynamiczną wartość wejściową.

  • W outputs[] określ zmienną wyjściową, która zwraca dynamiczny zestaw zmiennych wyjściowych. Nadaj tej zmiennej wyjściowej dataType o "workflowResourceDefinitionId": "dynamic_resource_id".

  • Zdefiniuj zasób niestandardowy do obsługi zmiennej dynamicznej. Określ workflowResourceDefinitions z "resourceType": "DYNAMIC" i "providerFunction": "onDynamicProviderFunction". id musi być zgodny z workflowResourceDefinitionId ustawionym w outputs[]. Więcej informacji o zasobach niestandardowych znajdziesz w artykule Definiowanie zasobu niestandardowego.

  • Ustaw dynamicResourceDefinitionProvider na nazwę odpowiedniej funkcji w kodzie kroku, w tym przykładzie onDynamicDefinitionFunction, która definiuje i zwraca kartę konfiguracji akceptującą dynamiczną wartość wejściową i zwracającą zasób niestandardowy.

JSON

"flows": {
  "workflowElements" : [{
    "id": "getDynamicVariable",
    "state": "ACTIVE",
    "name": "Get Dynamic Variable",
    "description": "Get Dynamic Variable",
    "workflowAction": {
    "inputs": [
      {
          "id": "dynamic_resource_input",
          "description": "Dynamic Resource Input",
          "cardinality": "SINGLE",
          "dataType": {
            "basicType": "INTEGER"
          }
       }
      ],
      "outputs": [
        {
          "id": "dynamic_resource_output",
          "description": "Dynamic Data",
          "cardinality": "SINGLE",
          "dataType": {
            "resourceType": {
              "workflowResourceDefinitionId": "resource_definition_1"
            }
          }
        }
      ],
      "onConfigFunction": "onDynamicVariableConfigFunction",
      "onExecuteFunction": "onDynamicVariableExecuteFunction"
    }
  }],
  "workflowResourceDefinitions": [{
    "id": "resource_definition_1",
    "name": "Dynamic Resource",
    "providerFunction": "onDynamicProviderFunction",
    "resourceType" : "DYNAMIC"
  }],
  "dynamicResourceDefinitionProvider" : "onDynamicDefinitionFunction",
}

Definiowanie zmiennej wyjściowej w kodzie

Kod kroku zawiera te funkcje:

  • onDynamicVariableConfigFunction, która tworzy i zwraca kartę konfiguracji z dynamicznym widżetem wejściowym. Nazwa tej funkcji musi być zgodna z wartością onConfigFunction w pliku manifestu. Nazwa dynamicznego widżetu wejściowego musi być zgodna z id ustawionym w pliku manifestu. Ten dynamiczny widżet wejściowy umożliwia użytkownikom ustawienie zmiennej dynamicznej podczas konfigurowania kroku, np. wybranie Formularza Google.
  • onDynamicVariableExecuteFunction, która zwraca dane zmiennej dynamicznej jako dane wyjściowe po uruchomieniu kroku. Nazwa tej funkcji musi być zgodna z wartością onExecuteFunction w pliku manifestu. Klucz variableData w returnOutputVariablesAction musi być zgodny z id zmiennej wyjściowej ustawionym w pliku manifestu. Zasób dynamiczny znajduje się w obiekcie zdarzenia pod adresem e.workflow.resourceFieldsDefinitionRetrieval. Dane wejściowe nie mogą odwoływać się do zmiennych, ponieważ wszystkie dane wejściowe zasobu dynamicznego muszą być dostępne w czasie konfiguracji.
  • onDynamicDefinitionFunction, która pobiera dane zmiennej dynamicznej z obiektu zdarzenia, w szczególności resourceFieldsDefinitionRetrieval, i zwraca resourceFieldsDefinitionRetrievedAction, która zawiera nazwę zmiennych wyjściowych na potrzeby późniejszych kroków, a także selektory, dzięki którym onDynamicProviderFunction może podać odpowiednią wartość dla każdej zmiennej wyjściowej. resourceId musi być zgodny z id elementu w tablicy workflowResourceDefinitions[] ustawionej w pliku manifestu.
  • onDynamicProviderFunction, która podaje wartość dla każdej zmiennej wyjściowej, używając selektorów jako kluczy, poprzez dostęp do resourceId i workflowResourceDefinitionId.

Apps Script

function onDynamicVariableConfigFunction() {
  let section = CardService.newCardSection()
    .addWidget(
      CardService.newTextInput()
        .setFieldName("dynamic_resource_input")
        .setTitle("Dynamic Resource Input")
        .setHint("Enter an integer value between 1 and 3 (inclusive) for the corresponding number of output variables")
    );

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

  return card;
}

function onDynamicDefinitionFunction(e) {
  console.log("Payload in onDynamicDefinitionFunction: ", JSON.stringify(e));
  var input_value = e.workflow.resourceFieldsDefinitionRetrieval.inputs.dynamic_resource_input.integerValues[0];

  let resourceDefinitions = AddOnsResponseService.newDynamicResourceDefinition()
    .setResourceId("resource_definition_1")
    .addResourceField(
      AddOnsResponseService.newResourceField()
        .setSelector("question_1")
        .setDisplayText("Question 1")
    );

  if (input_value == 2 || input_value == 3) {
    resourceDefinitions = resourceDefinitions
      .addResourceField(
        AddOnsResponseService.newResourceField()
          .setSelector("question_2")
          .setDisplayText("Question 2")
      );
  }
  if (input_value == 3) {
    resourceDefinitions = resourceDefinitions
      .addResourceField(
        AddOnsResponseService.newResourceField()
          .setSelector("question_3")
          .setDisplayText("Question 3")
      );
  }

  let workflowAction = AddOnsResponseService.newResourceFieldsDefinitionRetrievedAction()
    .addDynamicResourceDefinition(resourceDefinitions);

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

  let renderAction = AddOnsResponseService.newRenderActionBuilder()
    .setHostAppAction(hostAppAction)
    .build();

  return renderAction;
}

function onDynamicVariableExecuteFunction(e) {
  console.log("Payload in onDynamicVariableExecuteFunction: ", JSON.stringify(e));

  let workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
    .setVariableDataMap({
      "dynamic_resource_output": AddOnsResponseService.newVariableData()
        .addResourceReference("my_dynamic_resource_id")
    });

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

  let renderAction = AddOnsResponseService.newRenderActionBuilder()
    .setHostAppAction(hostAppAction)
    .build();

  return renderAction;
}

function onDynamicProviderFunction(e) {
  console.log("Payload in onDynamicProviderFunction: ", JSON.stringify(e));

  // resourceId == "my_dynamic_resource_id"
  var resourceId = e.workflow.resourceRetrieval.resourceReference.resourceId;
  // workflowResourceDefinitionId == "resource_definition_1"
  var workflowResourceDefinitionId = e.workflow.resourceRetrieval.resourceReference.resourceType.workflowResourceDefinitionId;

  const workflowAction = AddOnsResponseService.newResourceRetrievedAction()
    .setResourceData(
      AddOnsResponseService.newResourceData()
        .addVariableData("question_1", AddOnsResponseService.newVariableData().addStringValue("Answer 1"))
        .addVariableData("question_2", AddOnsResponseService.newVariableData().addStringValue("Answer 2"))
        .addVariableData("question_3", AddOnsResponseService.newVariableData().addStringValue("Answer 3"))
    );

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

  const renderAction = AddOnsResponseService.newRenderActionBuilder()
    .setHostAppAction(hostAppAction)
    .build();

  return renderAction;
}