이 가이드에서는 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();
}