กำหนดตัวแปรแบบไดนามิก

คู่มือนี้อธิบายวิธีสร้างตัวแปรแบบไดนามิก

เมื่อเป็นไปได้ ควรมีการกำหนดตัวแปรแบบคงที่ในไฟล์ Manifest เป็น ตัวแปรอินพุต ตัวแปรเอาต์พุต หรือ ทรัพยากรที่กำหนดเอง อย่างไรก็ตาม ในบางสถานการณ์จำเป็นต้องใช้ตัวแปรที่กำหนดได้เมื่อผู้ใช้กำหนดค่าเอเจนต์เท่านั้น เนื่องจากลักษณะของอินพุตแตกต่างกัน ตัวอย่างเช่น ระบบจะกำหนดจำนวนคำถามและคำตอบ (และเนื้อหาของคำถามและคำตอบ) สำหรับ Google ฟอร์มไม่ได้จนกว่าจะเลือก แบบฟอร์มที่เฉพาะเจาะจงในระหว่างการกำหนดค่าตัวแทน

ตัวแปรแบบไดนามิกจะพิจารณากรณีเหล่านี้โดยให้คุณกำหนดอินพุตที่สร้างชุดเอาต์พุตแบบไดนามิกในไฟล์ Manifest และในโค้ดของขั้นตอน

กำหนดตัวแปรเอาต์พุตในไฟล์ Manifest

ในไฟล์ Manifest ให้ทำตามขั้นตอนต่อไปนี้

  • ใน 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() ในไฟล์ Manifest ชื่อของ วิดเจ็ตอินพุตแบบไดนามิกต้องตรงกับ id ที่ตั้งค่าไว้ในไฟล์ Manifest วิดเจ็ตอินพุตแบบไดนามิกนี้ช่วยให้ผู้ใช้ตั้งค่าตัวแปรแบบไดนามิกได้เมื่อกำหนดค่า ขั้นตอน เช่น การเลือก Google ฟอร์ม
  • onDynamicVariableExecuteFunction() ซึ่งจะแสดงผลข้อมูลตัวแปรแบบไดนามิก เป็นเอาต์พุตเมื่อขั้นตอนทํางาน ชื่อของฟังก์ชันนี้ต้องตรงกับ ค่าของ onExecuteFunction() ในไฟล์ Manifest คีย์ของ variableData ใน returnOutputVariablesAction ต้องตรงกับidของตัวแปรเอาต์พุตที่ตั้งค่าไว้ในไฟล์ Manifest พบทรัพยากรแบบไดนามิกในออบเจ็กต์เหตุการณ์ที่ e.workflow.resourceFieldsDefinitionRetrieval อินพุตอ้างอิงตัวแปรไม่ได้เนื่องจากอินพุตทั้งหมดสำหรับทรัพยากรแบบไดนามิกต้องพร้อมใช้งานในเวลาที่กำหนดค่า
  • onDynamicDefinitionFunction() ซึ่งดึงข้อมูลตัวแปรแบบไดนามิก จากออบเจ็กต์เหตุการณ์ โดยเฉพาะ resourceFieldsDefinitionRetrieval และแสดงผล resourceFieldsDefinitionRetrievedAction ซึ่งระบุชื่อของตัวแปรเอาต์พุตสำหรับขั้นตอนต่อๆ ไป และยังระบุ ตัวเลือกเพื่อให้ onDynamicProviderFunction() ระบุ ค่าที่สอดคล้องกันให้กับตัวแปรเอาต์พุตแต่ละรายการ resourceId ต้องตรงกับ id ของ รายการในอาร์เรย์ workflowResourceDefinitions[] ที่ตั้งค่าไว้ในไฟล์ Manifest
  • 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;
}