Определить динамическую переменную

В этом руководстве объясняется, как создать динамическую переменную.

По возможности переменная должна быть статически определена в файле манифеста как входная переменная , выходная переменная или пользовательский ресурс . Однако в некоторых ситуациях требуется переменная, которую можно определить только при настройке агента пользователем, поскольку характер входных данных может меняться. Например, количество вопросов и ответов (и их содержание) для Google Forms невозможно определить, пока не будет выбрана конкретная форма при настройке агента.

Динамические переменные учитывают эти случаи, позволяя вам определить входные данные, которые создают динамический набор выходных данных в файле манифеста и в коде шага.

Определить выходную переменную в файле манифеста

В файле манифеста выполните следующие действия:

  • В inputs[] укажите входную переменную, которая принимает динамическое входное значение.

  • В outputs[] укажите выходную переменную, которая возвращает динамический набор выходных переменных. Для этого выходного значения укажите dataType "workflowResourceDefinitionId": "dynamic_resource_id" .

  • Определите пользовательский ресурс для обработки динамической переменной. Укажите workflowResourceDefinitions с "resourceType": "DYNAMIC" и "providerFunction": "onDynamicProviderFunction" . id должен соответствовать workflowResourceDefinitionId заданному в outputs[] . Подробнее о пользовательских ресурсах см. в разделе Определение пользовательского ресурса .

  • Задайте dynamicResourceDefinitionProvider имя соответствующей функции в коде шага, в этом примере onDynamicDefinitionFunction() , которая определяет и возвращает карту конфигурации, которая принимает динамическое входное значение и возвращает настраиваемый ресурс.

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",
}

Определить выходную переменную в коде

Код шага включает следующие функции:

  • Функция onDynamicVariableConfigFunction() создаёт и возвращает карту конфигурации с динамическим виджетом ввода. Имя этой функции должно совпадать со значением onConfigFunction() в файле манифеста. Имя динамического виджета ввода должно соответствовать id заданному в файле манифеста. Этот динамический виджет ввода позволяет пользователям задавать динамическую переменную при настройке шага, например, при выборе формы Google.
  • onDynamicVariableExecuteFunction() возвращает динамическую переменную data в качестве выходных данных при выполнении шага. Имя этой функции должно совпадать со значением onExecuteFunction() в файле манифеста. Ключ variableData в returnOutputVariablesAction должен совпадать с id выходной переменной, заданным в файле манифеста. Динамический ресурс находится в объекте события по адресу e.workflow.resourceFieldsDefinitionRetrieval . Входные данные не могут ссылаться на переменные, поскольку все входные данные для динамического ресурса должны быть доступны на момент настройки.
  • onDynamicDefinitionFunction() извлекает данные динамических переменных из объекта события, а именно resourceFieldsDefinitionRetrieval , и возвращает resourceFieldsDefinitionRetrievedAction , предоставляющий имена выходных переменных для последующих шагов, а также селекторы, чтобы функция onDynamicProviderFunction() могла предоставить соответствующее значение каждой выходной переменной. resourceId должно совпадать с id элемента в массиве workflowResourceDefinitions[] заданном в файле манифеста.
  • onDynamicProviderFunction() , которая предоставляет значение для каждой выходной переменной, используя селекторы в качестве ключей, обращаясь resourceId и workflowResourceDefinitionId .

Скрипт приложений

function onDynamicVariableConfigFunction() {
  let section = CardService.newCardSection()
    .addWidget(
      CardService.newTextInput()
        .setFieldName("dynamic_resource_input")
        .setTitle("Dynamic Resource Input")
        .setHint("Input a Integer value between 1 and 3\(inclusive\) for 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;
}