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

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

По возможности переменную следует статически определять в файле манифеста как входную переменную , выходную переменную или пользовательский ресурс . Однако в некоторых ситуациях требуется переменная, которую можно определить только при настройке потока пользователем, поскольку характер входных данных может меняться. Например, количество вопросов и ответов (и их содержимое) для формы 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() возвращает данные динамической переменной в качестве выходных данных при выполнении шага. Имя этой функции должно совпадать со значением onExecuteFunction() в файле манифеста. Ключ variableData в returnOutputVariablesAction должен совпадать с id выходной переменной, заданным в файле манифеста. Динамический ресурс находится в объекте события по адресу e.workflow.resourceFieldsDefinitionRetrieval . Входные данные не могут ссылаться на переменные, поскольку все входные данные для динамического ресурса должны быть доступны на этапе настройки.
  • onDynamicDefinitionFunction() извлекает данные динамических переменных из объекта события, а именно resourceFieldsDefinitionRetrieval , и возвращает resourceFieldsDefinitionRetrievedAction , который предоставляет имена выходных переменных для последующих шагов, а также селекторы, чтобы функция onDynamicProviderFunction() могла присвоить соответствующее значение каждой выходной переменной. resourceId должен совпадать с id элемента в массиве workflowResourceDefinitions[] заданном в файле манифеста.
  • Функция onDynamicProviderFunction() предоставляет значение для каждой выходной переменной, используя селекторы в качестве ключей, путем доступа к resourceId и workflowResourceDefinitionId .

Apps Script

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;
}