이 가이드에서는 동적 변수를 만드는 방법을 설명합니다.
가능한 경우 변수는 매니페스트 파일에서 입력 또는 출력 변수로 정적으로 정의해야 합니다. 하지만 입력의 특성이 다양하기 때문에 사용자가 흐름을 구성할 때만 정의할 수 있는 변수가 필요한 상황도 있습니다. 예를 들어 흐름 구성 중에 특정 양식을 선택할 때까지 Google Forms의 질문과 답변(및 콘텐츠) 수를 확인할 수 없습니다.
동적 변수를 사용하면 매니페스트 파일과 단계의 코드에서 동적 출력 세트를 생성하는 입력을 정의하여 이러한 사례를 처리할 수 있습니다.
매니페스트 파일에서 출력 변수 정의
매니페스트 파일에서 다음 단계를 따르세요.
inputs[]에서 동적 입력 값을 허용하는 입력 변수를 지정합니다.outputs[]에서 동적 출력 변수 집합을 반환하는 출력 변수를 지정합니다. 이 출력에"workflowResourceDefinitionId": "dynamic_resource_id"의dataType를 지정합니다.동적 변수를 처리할 맞춤 리소스를 정의합니다.
"resourceType": "DYNAMIC"및"providerFunction": "onDynamicProviderFunction"로workflowResourceDefinitions를 지정합니다.id은outputs[]에 설정된workflowResourceDefinitionId와 일치해야 합니다. 커스텀 리소스에 대해 자세히 알아보려면 커스텀 리소스 정의를 참고하세요.dynamicResourceDefinitionProvider을 단계의 코드에 있는 해당 함수의 이름으로 설정합니다. 이 예에서는 동적 입력 값을 허용하고 맞춤 리소스를 반환하는 구성 카드를 정의하고 반환하는onDynamicDefinitionFunction()입니다.
JSON
{
"timeZone": "America/Toronto",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"addOns": {
"common": {
"name": "Dynamic Variable Demo",
"logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/pets_black_48dp.png",
"useLocaleFromApp": true
},
"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()값과 일치해야 합니다.returnOutputVariablesAction의variableId은 매니페스트 파일에 설정된 출력 변수의id과 일치해야 합니다. 동적 리소스는e.workflow.resourceFieldsDefinitionRetrieval의 흐름 이벤트 객체에서 찾을 수 있습니다. 동적 리소스의 모든 입력은 구성 시간에 사용할 수 있어야 하므로 입력은 변수를 참조할 수 없습니다.onDynamicDefinitionFunction(): 흐름 이벤트 객체, 특히resourceFieldsDefinitionRetrieval에서 동적 변수 데이터를 가져오고 이후 단계에서 사용할 수 있는 JSON 형식으로 데이터를 제공하는resourceFieldsDefinitionRetrievedAction를 반환합니다.resourceId는 매니페스트 파일에 설정된workflowResourceDefinitions[]배열의 항목id와 일치해야 합니다.onDynamicProviderFunction():e.workflow.resourceRetrieval.resourceReference.resourceId에서 흐름 이벤트 객체로부터 동적 변수를 가져오고 이후 단계의 출력으로 JSON을 반환합니다.
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;
}