top of page
  • Foto del escritorAndres Biarge

Plantillas dinámicas de Word sin cambiar el Power Automate flow

Recientemente me enfrenté a un desafío: mientras trabajaba en mi propio software de facturación (básicamente una Model Driven App que genera un PDF basado en una plantilla de Microsoft Word), me encontré con un problema que no había previsto: voy a necesitar facturas diferentes y cada uno tendrá una estructura y campos distintos.


La solución fácil es tener un if/switch que creará las diferentes plantillas basadas en un campo de elección (por ejemplo, si la factura es para España, usar la versión en español con retención de impuestos (IRPF); si la factura va fuera de la UE, usar la versión en inglés y sin IVA, etc.).


Cambiar: diferentes plantillas de Word
Esto no es lo que queremos.

Pues me imaginé la solución fácil y no me gustó un pelo. Mal sabor de boca.


Entonces, me puse a diseñar una solución alternativa que no necesita que cambies el flow cada vez que modifiques tus plantilla Word. Todo es configuración.

Disclaimer : que sea configuración no significa que haya detrás una app para ello (aunque podría hacerse, por supuesto). En este caso, es sólo juego de objetos JSON.


Diagrama que explica cómo generar plantillas dinámicas de Word sin modificar el flujo de Power Automate
Este es el objetivo.


Paso 0: crea tu plantilla de Word

No me voy a detener aquí porque hay muchos artículos de la comunidad que explican esto con gran detalle. Aquí tienes un par de artículos que aparecen con una primera consulta a Bing (¡sí, Bing!):



Paso 1: extraer el schema de la plantilla de Word

Cuando configuras los diferentes campos de texto en una plantilla de Word, estás generando un schema dentro del archivo de Word sin darte cuenta. Este schema es la definición de los campos que completarás con valores dentro de la acción de Power Automate.


Vale, ¿y cómo se puede obtener ese schema? He visto en un blog que puedes guardar Word como un .zip y luego navegar por su xml interno, pero me pareció demasiado engorroso. Como esta operación no será muy frecuente, la forma más fácil (y con poco código) es extraer el esquema del propio Power Automate.


Para ello, selecciona tu plantilla Word y rellena los parámetros. Aquí, en lugar de los valores reales que añadirías, es mejor que coloques algún texto que te ayude a comprender qué significa cada parámetro:



A continuación, accede a la Vista de código en la Acción de flujo y copia el esquema, que se compone de todos los pares clave-valor que comienzan por "dynamicFileSchema":

Esquema dinámico de acción de Power Automate Word Template
Ahora ves lo que hay detrás de la acción Power Automate 😀

El objetivo ahora es idear una estrategia para construir esos campos "dynamicFileSchema" dinámicamente (es decir, independientes del Word real). Si te ayuda, visualiza el objetivo final como habilitar un menú desplegable para seleccionar la plantilla Word que queremos usar cada vez y, debido a que las plantillas cambiarán (tanto en su contenido como en cuáles podemos seleccionar), no puedes dejar ningún valor fijo.


La estrategia que pensé es tener una configuración intermedia que actuará como "traductor".


Paso 2: construye tu propio objeto de configuración

Nos tenemos que abstraer del contenido de cada plantilla de Word. Para ello, tendráa que pensar en un "objeto de configuración" que el flujo deberá leer sin preocuparse por el contenido del schema dinámico.

En otras palabras, cuando crees el flujo, quieres que la acción "crear plantilla de Word" sea completamente independiente del Word seleccionado y de los campos que tenga en el momento de la ejecución:


Ahora tenemos que construir nuestro objeto de configuración, que no es más que una convención. Y es pura creatividad, por lo que la solución que te voy a mostrar puede no ser la definitiva. De hecho, se te puede ocurrir a ti una mucho mejor.

Lo importante es que, con el objeto de configuración, cubramos los siguientes criterios:

  1. El objeto de configuración debe poder tratar con arrays (p.ej., los detalles de la factura).

  2. El objeto de configuración debe poder cambiar el formato (por ejemplo, formatear las fechas de una manera particular).

  3. El objeto de configuración debe poder contener suficiente información para que Power Automate pueda recuperar el valor correspondiente a columnas de Dataverse.


Aquí te dejo un extracto del tipo de objeto de configuración que he creado para mis diferentes plantillas de Word:

[
  {
    "type": "array",
    "schemaId": "308610390",
    "itemsSchema": [
      {
        "schemaId": "detailDescription",
        "retrievalValue": "abg_description",
        "specialTreatment": "none"
      },
      {
        "schemaId": "detailCharges",
        "retrievalValue": "abg_charges@OData.Community.Display.V1.FormattedValue",
        "specialTreatment": "none"
      },
      {
        "schemaId": "detailDiscount",
        "retrievalValue": "abg_discountpercentage@OData.Community.Display.V1.FormattedValue",
        "specialTreatment": "none"
      },
      {
        "schemaId": "detailsVAT",
        "retrievalValue": "abg_VAT/abg_vatpercentage",
        "specialTreatment": "none"
      },
      {
        "schemaId": "detailsSubtotal",
        "retrievalValue": "abg_auxtotal@OData.Community.Display.V1.FormattedValue",
        "specialTreatment": "none"
      }
    ]
  },
  {
    "type": "string",
    "schemaId": "857015247",
    "retrievalValue": "abg_BilledTo/name",
    "specialTreatment": "none"
  },
  {
    "type": "string",
    "schemaId": "1135211173",
    "retrievalValue": "abg_auxtotalvat@OData.Community.Display.V1.FormattedValue",
    "specialTreatment": "none"
  }
]

Cada objeto tiene las siguientes propiedades:

  • type: string o array.

  • esquemaId: el schema ID de la plantilla Word.

  • retrievalValue: la "ruta" al valor que queremos recuperar de un objeto de Dataverse. Si ves barras, significa que la "ruta" navega poruna relación 1:N (objetos anidados).

  • specialTreatment: para tratar formatos especiales (p. ej., fechas).


Para el tipo: array, lo único que cambia es que necesitamos navegar otro nivel más para recuperar los valores. Sólo necesitamos definir los elementos de la matriz de manera consistente:

  • esquemaId.

  • retrievalValue.

  • specialTreatment.


Copia mi solulción si te va bien. Si no, ¡adelante y crea la tuya propia 💪!


Paso 3: almacenar las configuraciones en Dataverse

Una vez que hayas preparado toda la configuración JSON para cada una de tus plantillas, deberás almacenarla en una "tabla de configuración" en Dataverse para que esté disponible cuando el flujo se ejecute:



Nota: deberás guardar los Drive ids (OneDrive) tanto para la biblioteca donde esté la plantilla como para identificar el fichero Word. El motivo es que el conector de Word Business utiliza la Graph API de OneDrive para recuperar el archivo, en lugar de SharePoint. Puedes sacar esos valores de la acción en Power Automate:


Paso 4: crea el Power Automate flow

Ahora que tenemos:

  1. Tabla de configuración.

  2. Objetos de configuración dentro de la tabla.

  3. Un fuerte deseo de complicarse la vida.

... es hora de comenzar a construir el "motor" que generará el schema de la plantilla Word en base a los objetos de configuración que hemos preparado:


Este es el objetivo: transformar el objeto de configuración en el schmea que Word espera recibir.

La táctica consistirá en buclear todos los elementos dentro del objeto de configuración ("ForEachJsonArrayItem") y usar la función addProperty para agregar los pares clave-valor que espera Word DynamicFileSchema.

Usaremos 2 variables para realizar las operaciones:

  • "DynamicSchemaObject": contendrá el DynamicFileSchema para pasar a la acción Populate Word.

  • "AuxDynamicSchemaObject": nos ayudará en la creación del DynamicSchemaObject usando la función addProperty.


Vayamos paso a paso usando la opción sin array. Cuando lo vayas a afrontar, sólo necesitarás anidar otro bucle, pero las acciones son las mismas. Espero explicarme bien:


Explicación de las acciones de flujo.

Comentarios finales

Crear un flujo de Power Automate de generación de plantillas de Word verdaderamente dinámico no es fácil, pero se puede hacer con una capa de abstracción adicional: un objeto de configuración. Y esto es básicamente lo que debemos hacer en muchos escenarios complejos: crear una estructura de datos que nos hará la vida más fácil.


Espero que este artículo te ayude a abordar este problema. Sé que no es un tema fácil y créeme que tampoco es fácil de explicar. Me voy con la sensación de no haberme explicado suficientemente bien.

Si tú también lo piensas, házmelo saber en los comentarios. ¿Debería intentar crear un vídeo complementario de YouTube para explicar esto en un formato más amigable?


Hágamelo saber.


¡Adiós por ahora! Cuídate y sigue empujando 💪


Andrés B.

33 visualizaciones0 comentarios
bottom of page