Cómo definir una variable dinámica

En esta guía, se explica cómo crear una variable dinámica.

Cuando sea posible, una variable se debe definir de forma estática en el archivo de manifiesto como una variable de entrada o de salida. Sin embargo, algunas situaciones requieren una variable que solo se puede definir cuando el usuario configura el flujo, ya que la naturaleza de la entrada varía. Por ejemplo, la cantidad de preguntas y respuestas (y su contenido) de un formulario de Google no se puede determinar hasta que se selecciona un formulario específico durante la configuración del flujo.

Las variables dinámicas tienen en cuenta estos casos, ya que te permiten definir una entrada que produce un conjunto dinámico de salidas en el archivo de manifiesto y en el código del paso.

Define la variable de salida en el archivo de manifiesto

En el archivo de manifiesto, sigue estos pasos:

  • En inputs[], especifica una variable de entrada que acepte un valor de entrada dinámico.

  • En outputs[], especifica una variable de salida que devuelva un conjunto dinámico de variables de salida. Asigna a este resultado un dataType de "workflowResourceDefinitionId": "dynamic_resource_id".

  • Define un recurso personalizado para controlar la variable dinámica. Especifica workflowResourceDefinitions con "resourceType": "DYNAMIC" y "providerFunction": "onDynamicProviderFunction". El id debe coincidir con el workflowResourceDefinitionId establecido en outputs[]. Para obtener más información sobre los recursos personalizados, consulta Cómo definir un recurso personalizado.

  • Establece dynamicResourceDefinitionProvider en el nombre de una función correspondiente en el código del paso, en este ejemplo onDynamicDefinitionFunction(), que define y devuelve una tarjeta de configuración que acepta un valor de entrada dinámico y devuelve un recurso personalizado.

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": "STRING"
          }
       }
      ],
      "outputs": [
        {
          "id": "dynamic_resource_output",
          "description": "Dynamic Data",
          "cardinality": "SINGLE",
          "dataType": {
            "resourceType": {
              "workflowResourceDefinitionId": "dynamic_resource_id"
            }
          }
        }
      ],
      "onConfigFunction": "onDynamicVariableConfigFunction",
      "onExecuteFunction": "onDynamicVariableExecuteFunction"
    }
  }],
  "workflowResourceDefinitions": [{
    "id": "dynamic_resource_id",
    "name": "Dynamic Resource",
    "providerFunction": "onDynamicProviderFunction",
    "resourceType" : "DYNAMIC"
  }],
  "dynamicResourceDefinitionProvider" : "onDynamicDefinitionFunction",
}

Cómo definir la variable de salida en el código

El código del paso incluye estas funciones:

  • onDynamicVariableConfigFunction(), que compila y devuelve una tarjeta de configuración con un widget de entrada dinámico. El nombre de esta función debe coincidir con el valor de onConfigFunction() en el archivo de manifiesto. El nombre del widget de entrada dinámica debe coincidir con el id establecido en el archivo de manifiesto. Este widget de entrada dinámica permite a los usuarios establecer una variable dinámica cuando configuran su flujo, como elegir un formulario de Google.
  • onDynamicVariableExecuteFunction(), que devuelve los datos de la variable dinámica como resultado cuando se ejecuta el paso. El nombre de esta función debe coincidir con el valor de onExecuteFunction() en el archivo de manifiesto. El variableId de returnOutputVariablesAction debe coincidir con el id de la variable de salida establecido en el archivo de manifiesto. El recurso dinámico se encuentra en el objeto del evento de flujo en e.workflow.resourceFieldsDefinitionRetrieval. La entrada no puede hacer referencia a variables porque todas las entradas de un recurso dinámico deben estar disponibles en el momento de la configuración.
  • onDynamicDefinitionFunction(), que recupera los datos de la variable dinámica del objeto de evento de flujo, específicamente resourceFieldsDefinitionRetrieval, y devuelve resourceFieldsDefinitionRetrievedAction, que proporciona los datos en formato JSON utilizable como resultado para pasos posteriores. El resourceId debe coincidir con el id de un elemento en el array workflowResourceDefinitions[] establecido en el archivo de manifiesto.
  • onDynamicProviderFunction(), que recupera la variable dinámica del objeto de evento de flujo en e.workflow.resourceRetrieval.resourceReference.resourceId y devuelve JSON como resultado para pasos posteriores.

Apps Script

function onDynamicVariableConfigFunction() {
  var card = {
    "sections": [
      {
        "widgets": [
          {
            "textInput": {
              "name": "dynamic_resource_input",
              "label": "Dynamic Resource Input",
            }
          },
        ]
      }
    ]
  };
  return {
    "action": {
      "navigations": [{
        "push_card": card
      }]
    }
  };
}

function onDynamicVariableExecuteFunction(){
  var dynamic_resource_id = uuidv4();
  return {
    "hostAppAction": {
      "workflowAction": {
        "returnOutputVariablesAction": {
          "variableValues": [{
            "variableId": "dynamic_resource_output",
            "variableData": {
              "resourceReferences" : [ dynamic_resource_id ]
            }
          }]
        }
      }
    }
  };
}

function onDynamicDefinitionFunction(e) {
  var input_value = e.workflow.resourceFieldsDefinitionRetrieval.inputs.dynamic_resource_input.stringValues[0];
  // input_value == "dynamic_resource_input"

  return {
    "hostAppAction": {
      "workflowAction": {
        "resourceFieldsDefinitionRetrievedAction": {
          "dynamicResourceDefinitions": [{
            "resourceId": "dynamic_resource_id",
            "fields": [{
                "selector":  "question_1",
                "displayText": "Question 1"
            },{
                "selector":  "question_2",
                "displayText": "Question 2"
            },{
                "selector":  "question_3",
                "displayText": "Question 3"
            }]
          }]
        }
      }
    }
  };
}

function onDynamicProviderFunction(e) {
  var resourceId = e.workflow.resourceRetrieval.resourceReference.resourceId;
  // resourceId == uuidv4();

  var workflowResourceDefinitionId = e.workflow.resourceRetrieval.resourceReference.resourceType.workflowResourceDefinitionId;
  // workflowResourceDefinitionId == "dynamic_resource_id"

  return {
    "hostAppAction": {
      "workflowAction": {
        "resourceRetrievedAction": {
          "resourceJson": JSON.stringify({
            "question_1": "Answer 1",
            "question_2": "Answer 2",
            "question_3": "Answer 3",
          })
        }
      }
    }
  };
}