Menentukan variabel dinamis

Panduan ini menjelaskan cara membuat variabel dinamis.

Jika memungkinkan, variabel harus ditentukan secara statis dalam file manifes sebagai variabel input, variabel output, atau resource kustom. Namun, beberapa situasi memerlukan variabel yang hanya dapat ditentukan saat pengguna mengonfigurasi agen karena sifat inputnya bervariasi. Misalnya, jumlah pertanyaan dan jawaban (serta kontennya) untuk Google Formulir tidak dapat ditentukan hingga formulir tertentu dipilih selama konfigurasi agen.

Variabel dinamis memperhitungkan kasus ini dengan memungkinkan Anda menentukan input yang menghasilkan serangkaian output dinamis dalam file manifes dan dalam kode langkah.

Menentukan variabel output dalam file manifes

Di file manifes, ikuti langkah-langkah berikut:

  • Di inputs[], tentukan variabel input yang menerima nilai input dinamis.

  • Di outputs[], tentukan variabel output yang menampilkan kumpulan variabel output dinamis. Beri output ini dataType sebesar "workflowResourceDefinitionId": "dynamic_resource_id".

  • Tentukan resource kustom untuk menangani variabel dinamis. Tentukan workflowResourceDefinitions dengan "resourceType": "DYNAMIC" dan "providerFunction": "onDynamicProviderFunction". id harus cocok dengan workflowResourceDefinitionId yang ditetapkan di outputs[]. Untuk mempelajari resource kustom lebih lanjut, lihat Menentukan resource kustom.

  • Tetapkan dynamicResourceDefinitionProvider ke nama fungsi yang sesuai dalam kode langkah, dalam contoh ini onDynamicDefinitionFunction(), yang menentukan dan menampilkan kartu konfigurasi yang menerima nilai input dinamis dan menampilkan resource kustom.

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",
}

Menentukan variabel output dalam kode

Kode langkah mencakup fungsi berikut:

  • onDynamicVariableConfigFunction(), yang membuat dan menampilkan kartu konfigurasi dengan widget input dinamis. Nama fungsi ini harus cocok dengan nilai onConfigFunction() dalam file manifes. Nama widget input dinamis harus cocok dengan id yang ditetapkan dalam file manifes. Widget input dinamis ini memungkinkan pengguna menetapkan variabel dinamis saat mengonfigurasi langkah mereka, seperti memilih Google Formulir.
  • onDynamicVariableExecuteFunction(), yang menampilkan data variabel dinamis sebagai output saat langkah dijalankan. Nama fungsi ini harus cocok dengan nilai onExecuteFunction() dalam file manifes. Kunci variableData di returnOutputVariablesAction harus cocok dengan id variabel output yang ditetapkan dalam file manifes. Resource dinamis ditemukan pada objek peristiwa di e.workflow.resourceFieldsDefinitionRetrieval. Input tidak dapat mereferensikan variabel karena semua input untuk resource dinamis harus tersedia pada waktu konfigurasi.
  • onDynamicDefinitionFunction(), yang mengambil data variabel dinamis dari objek peristiwa, khususnya resourceFieldsDefinitionRetrieval, dan menampilkan resourceFieldsDefinitionRetrievedAction yang memberikan nama variabel output untuk langkah-langkah selanjutnya, dan juga pemilih sehingga onDynamicProviderFunction() dapat memberikan nilai yang sesuai untuk setiap variabel output. resourceId harus cocok dengan id item dalam set array workflowResourceDefinitions[] yang ditetapkan dalam file manifes.
  • onDynamicProviderFunction(), yang memberikan nilai untuk setiap variabel output menggunakan pemilih sebagai kunci dengan mengakses resourceId dan 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;
}