동적 변수 정의

이 가이드에서는 동적 변수를 만드는 방법을 설명합니다.

가능한 경우 변수는 매니페스트 파일에서 입력 변수, 출력 변수, 또는 커스텀 리소스로정적으로 정의해야 합니다. 하지만 입력의 특성이 다양하기 때문에 사용자가 흐름을 구성할 때만 정의할 수 있는 변수가 필요한 경우도 있습니다. 예를 들어 Google Forms의 질문 및 답변 수(및 콘텐츠)는 흐름 구성 중에 특정 양식이 선택될 때까지 확인할 수 없습니다.

동적 변수는 매니페스트 파일과 단계의 코드에서 동적 출력 집합을 생성하는 입력을 정의할 수 있도록 하여 이러한 사례를 처리합니다.

매니페스트 파일에서 출력 변수 정의

매니페스트 파일에서 다음 단계를 따르세요.

  • inputs[]에서 동적 입력 값을 허용하는 입력 변수를 지정합니다.

  • outputs[]에서 동적 출력 변수 집합을 반환하는 출력 변수를 지정합니다. 이 출력에 dataType"workflowResourceDefinitionId": "dynamic_resource_id" 지정합니다.

  • 동적 변수를 처리할 커스텀 리소스를 정의합니다. "resourceType": "DYNAMIC""providerFunction": "onDynamicProviderFunction"으로 workflowResourceDefinitions를 지정합니다. idoutputs[]에 설정된 workflowResourceDefinitionId와 일치해야 합니다. 커스텀 리소스에 대해 자세히 알아보려면 커스텀 리소스 정의를 참고하세요.

  • 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 Forms 선택과 같이 단계를 구성할 때 동적 변수를 설정할 수 있습니다.
  • 단계가 실행될 때 동적 변수 데이터를 출력으로 반환하는 onDynamicVariableExecuteFunction() 이 함수의 이름은 매니페스트 파일의 onExecuteFunction() 값과 일치해야 합니다. returnOutputVariablesActionvariableData 키는 매니페스트 파일에 설정된 출력 변수의 id와 일치해야 합니다. 동적 리소스는 e.workflow.resourceFieldsDefinitionRetrieval의 이벤트 객체에서 찾을 수 있습니다. 동적 리소스의 모든 입력은 구성 시점에 사용할 수 있어야 하므로 입력은 변수를 참조할 수 없습니다.
  • 이벤트 객체, 특히 resourceFieldsDefinitionRetrieval에서 동적 변수 데이터를 가져오고 이후 단계의 출력 변수 이름과 onDynamicProviderFunction()이 각 출력 변수에 상응하는 값을 제공할 수 있도록 선택기를 제공하는 resourceFieldsDefinitionRetrievedAction을 반환하는 onDynamicDefinitionFunction() resourceId는 매니페스트 파일에 설정된 workflowResourceDefinitions[] 배열에 있는 항목의 id와 일치해야 합니다.
  • resourceIdworkflowResourceDefinitionId에 액세스하여 선택기를 키로 사용하여 각 출력 변수의 값을 제공하는 onDynamicProviderFunction()

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