Dinamik değişken tanımlama

Bu kılavuzda, dinamik değişken oluşturma işlemi açıklanmaktadır.

Mümkün olduğunda, bir değişken manifest dosyasında giriş veya çıkış değişkeni olarak statik olarak tanımlanmalıdır. Ancak bazı durumlarda, girişin yapısı değiştiği için yalnızca kullanıcı akışı yapılandırdığında tanımlanabilen bir değişken gerekir. Örneğin, akış yapılandırması sırasında belirli bir form seçilene kadar Google Formlar'daki soru ve yanıt sayısı (ve içerikleri) belirlenemez.

Dinamik değişkenler, giriş tanımlamanıza olanak tanıyarak bu durumları hesaba katar. Bu giriş, manifesto dosyasında ve adımın kodunda dinamik bir çıkış grubu oluşturur.

Çıkış değişkenini manifest dosyasında tanımlayın

Manifest dosyasında şu adımları uygulayın:

  • inputs[] içinde, dinamik giriş değeri kabul eden bir giriş değişkeni belirtin.

  • outputs[] içinde, dinamik bir çıktı değişkenleri grubu döndüren bir çıktı değişkeni belirtin. Bu çıkışa dataType of "workflowResourceDefinitionId": "dynamic_resource_id" verin.

  • Dinamik değişkeni işlemek için özel bir kaynak tanımlayın. workflowResourceDefinitions değerini "resourceType": "DYNAMIC" ve "providerFunction": "onDynamicProviderFunction" ile birlikte belirtin. id, outputs[] içinde ayarlanan workflowResourceDefinitionId ile eşleşmelidir. Özel kaynaklar hakkında daha fazla bilgi edinmek için Özel kaynak tanımlama başlıklı makaleyi inceleyin.

  • dynamicResourceDefinitionProvider değerini, adımın kodundaki ilgili bir işlevin adıyla (bu örnekte onDynamicDefinitionFunction()) değiştirin. Bu işlev, dinamik bir giriş değerini kabul eden ve özel bir kaynak döndüren bir yapılandırma kartını tanımlar ve döndürür.

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

Çıkış değişkenini kodda tanımlama

Adımın kodu şu işlevleri içerir:

  • onDynamicVariableConfigFunction(), dinamik giriş widget'ı içeren bir yapılandırma kartı oluşturup döndürür. Bu işlevin adı, manifest dosyasındaki onConfigFunction() değerine uymalıdır. Dinamik giriş widget'ının adı, manifest dosyasında ayarlanan id ile eşleşmelidir. Bu dinamik giriş widget'ı, kullanıcıların akışlarını yapılandırırken dinamik bir değişken ayarlamasına (ör. Google Form seçme) olanak tanır.
  • Adım çalıştırıldığında çıkış olarak dinamik değişken verilerini döndüren onDynamicVariableExecuteFunction(). Bu işlevin adı, manifest dosyasındaki onExecuteFunction() değerine uygun olmalıdır. variableId returnOutputVariablesAction, manifesto dosyasında ayarlanan çıkış değişkeninin id ile eşleşmelidir. Dinamik kaynak, akış etkinliği nesnesinde e.workflow.resourceFieldsDefinitionRetrieval konumunda bulunur. Giriş, değişkenlere referans veremez. Bunun nedeni, dinamik bir kaynağın tüm girişlerinin yapılandırma sırasında kullanılabilir olması gerektiğidir.
  • onDynamicDefinitionFunction(), akış etkinliği nesnesinden dinamik değişken verilerini (özellikle resourceFieldsDefinitionRetrieval) alır ve sonraki adımlarda kullanılabilir JSON biçiminde veri sağlayan resourceFieldsDefinitionRetrievedAction değerini döndürür. resourceId, manifest dosyasında ayarlanan workflowResourceDefinitions[] dizisindeki bir öğenin id ile eşleşmelidir.
  • onDynamicProviderFunction(), e.workflow.resourceRetrieval.resourceReference.resourceId konumundaki akış etkinliği nesnesinden dinamik değişkeni alır ve sonraki adımlarda kullanılmak üzere JSON olarak döndürür.

Apps Komut Dosyası

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;
}