이 가이드에서는 Google Workspace Studio의 커스텀 리소스를 정의하는 방법을 설명합니다.
커스텀 리소스는 여러 변수를 함께 그룹화하기 위해 정의할 수 있는 커스텀 데이터 구조입니다. 단계의 출력이 정적 구조를 갖는 경우 커스텀 리소스로 나타냅니다. 예를 들어 CRM 리드를 만들려면 출력에 여러 변수가 필요합니다.
- 이메일 주소
- 상세 주소
- 이름
CRM 리드를 만드는 데 필요한 모든 데이터가 있는지 확인하려면 이메일 주소, 상세 주소, 이름이 포함된 커스텀 리소스를 출력합니다.
커스텀 리소스를 참조로 출력
커스텀 리소스를 참조로 출력하면 전체 커스텀 리소스 객체 대신 ID로 커스텀 리소스를 반환할 수 있습니다. 커스텀 리소스가 크거나 복잡한 경우 ID만 전달하면 단계 간에 전송되는 데이터가 줄어들어 성능이 향상됩니다.
커스텀 리소스를 참조로 출력하려면 단계의 매니페스트 파일과 코드를 수정합니다.
매니페스트 파일 수정
매니페스트 파일에서 다음을 수행합니다.
workflowResourceDefinitions를 지정하고id,fields[]배열,providerFunction을 할당합니다.workflowResourceDefinitions는 커스텀 리소스의 데이터 유형과 콘텐츠를 정의하는 구조입니다.fields[]배열 내에서 커스텀 리소스를 구성하는 개별 필드를 지정합니다. 이 예에서는field_1및field_2라고 합니다.providerFunction의 값은 단계 코드의 함수 이름과 일치해야 합니다.providerFunction은 필요할 때 실제 커스텀 리소스 콘텐츠를 가져옵니다.JSON
{ "workflowResourceDefinitions": [ { "id": "resource_id", "name": "Custom Resource", "fields": [ { "selector": "field_1", "name": "Field 1", "dataType": { "basicType": "STRING" } }, { "selector": "field_2", "name": "Field 2", "dataType": { "basicType": "STRING" } } ], "providerFunction": "onMessageResourceFunction" } ] }outputs[]에서 동적 출력 변수 집합을 반환하는 출력 변수를 지정합니다. 출력 변수에는resourceType속성이 있는dataType이 있습니다.cardinality의 값은SINGLE이어야 합니다.JSON
{ "outputs": [ { "id": "resource_data", "description": "Resource Data", "cardinality": "SINGLE", "dataType": { "resourceType": { "workflowResourceDefinitionId": "resource_id" } } } ], }
다음은 커스텀 리소스를 정의하는 전체 매니페스트 파일입니다.
JSON
{
"timeZone": "America/Los_Angeles",
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"addOns": {
"common": {
"name": "Custom Resource (as reference)",
"logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/pets_black_48dp.png",
"useLocaleFromApp": true
},
"flows": {
"workflowElements": [
{
"id": "getResourceDataReference",
"state": "ACTIVE",
"name": "Custom Resource (as reference)",
"description": "Output a custom resource as a reference",
"workflowAction": {
"outputs": [
{
"id": "resource_data",
"description": "Resource Data",
"cardinality": "SINGLE",
"dataType": {
"resourceType": {
"workflowResourceDefinitionId": "resource_id"
}
}
}
],
"onConfigFunction": "onConfigResourceFunction",
"onExecuteFunction": "onExecuteResourceFunction"
}
}
],
"workflowResourceDefinitions": [
{
"id": "resource_id",
"name": "Custom Resource",
"fields": [
{
"selector": "field_1",
"name": "Field 1",
"dataType": {
"basicType": "STRING"
}
},
{
"selector": "field_2",
"name": "Field 2",
"dataType": {
"basicType": "STRING"
}
}
],
"providerFunction": "onMessageResourceFunction"
}
]
}
}
}
코드 수정하기
애플리케이션 코드에서 다음을 수행합니다.
필요할 때 커스텀 리소스 콘텐츠를 가져오는
providerFunction(이 예에서는onMessageResourceFunction()이라고 함)을 구현합니다. 단계의 이벤트 객체 JSON 페이로드인 입력e를 가져와서 커스텀 리소스 ID를 설정합니다.Apps Script
function onMessageResourceFunction(e) { console.log("Payload in onMessageResourceFunction: " + JSON.stringify(e)); var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId; let fieldValue_1; let fieldValue_2; // Using a if-condition to mock a database call. if (resource_id == "sample_resource_reference_id") { fieldValue_1 = AddOnsResponseService.newVariableData() .addStringValue("value1"); fieldValue_2 = AddOnsResponseService.newVariableData() .addStringValue("value2"); } else { fieldValue_1 = AddOnsResponseService.newVariableData() .addStringValue("field_1 value not found"); fieldValue_2 = AddOnsResponseService.newVariableData() .addStringValue("field_2 value not found"); } let resourceData = AddOnsResponseService.newResourceData() .addVariableData("field_1", fieldValue_1) .addVariableData("field_2", fieldValue_2) let workflowAction = AddOnsResponseService.newResourceRetrievedAction() .setResourceData(resourceData) let hostAppAction = AddOnsResponseService.newHostAppAction() .setWorkflowAction(workflowAction); return AddOnsResponseService.newRenderActionBuilder() .setHostAppAction(hostAppAction) .build(); }제공업체 함수는 API 호출 또는 데이터베이스 읽기와 같은 적절한 메커니즘으로 커스텀 리소스의 값을 가져와서 반환해야 합니다.
ID로 커스텀 리소스를 가져와서 반환하려면
onExecuteResourceFunction()에 표시된 대로returnOutputVariablesAction으로 반환합니다.Apps Script
function onExecuteResourceFunction(e) { console.log("Payload in onExecuteResourceFunction: " + JSON.stringify(e)); let outputVariables = AddOnsResponseService.newVariableData() .addResourceReference("sample_resource_reference_id"); let workflowAction = AddOnsResponseService.newReturnOutputVariablesAction() .addVariableData("resource_data", outputVariables); let hostAppAction = AddOnsResponseService.newHostAppAction() .setWorkflowAction(workflowAction); return AddOnsResponseService.newRenderActionBuilder() .setHostAppAction(hostAppAction) .build(); }
다음은 전체 예시입니다.
Apps Script
function onConfigResourceFunction() {
let section = CardService.newCardSection()
.addWidget(
CardService.newTextParagraph()
.setText("This is the Custom Resource Demo card")
);
const card = CardService.newCardBuilder()
.addSection(section)
.build();
return card;
}
function onMessageResourceFunction(e) {
console.log("Payload in onMessageResourceFunction: " + JSON.stringify(e));
var resource_id = e.workflow.resourceRetrieval.resourceReference.resourceId;
let fieldValue_1;
let fieldValue_2;
// Using a if-condition to mock a database call.
if (resource_id == "sample_resource_reference_id") {
fieldValue_1 = AddOnsResponseService.newVariableData()
.addStringValue("value1");
fieldValue_2 = AddOnsResponseService.newVariableData()
.addStringValue("value2");
} else {
fieldValue_1 = AddOnsResponseService.newVariableData()
.addStringValue("field_1 value not found");
fieldValue_2 = AddOnsResponseService.newVariableData()
.addStringValue("field_2 value not found");
}
let resourceData = AddOnsResponseService.newResourceData()
.addVariableData("field_1", fieldValue_1)
.addVariableData("field_2", fieldValue_2)
let workflowAction = AddOnsResponseService.newResourceRetrievedAction()
.setResourceData(resourceData)
let hostAppAction = AddOnsResponseService.newHostAppAction()
.setWorkflowAction(workflowAction);
return AddOnsResponseService.newRenderActionBuilder()
.setHostAppAction(hostAppAction)
.build();
}
function onExecuteResourceFunction(e) {
console.log("Payload in onExecuteResourceFunction: " + JSON.stringify(e));
let outputVariables = AddOnsResponseService.newVariableData()
.addResourceReference("sample_resource_reference_id");
let workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
.addVariableData("resource_data", outputVariables);
let hostAppAction = AddOnsResponseService.newHostAppAction()
.setWorkflowAction(workflowAction);
return AddOnsResponseService.newRenderActionBuilder()
.setHostAppAction(hostAppAction)
.build();
}