PowerAutomate, bibliotecas de Sharepoint y notificaciones automáticas

Javier Ferreiro
Anyone can Automate
8 min readJan 4, 2022

--

Hoy en AnyoneCanAutomate, ponemos el foco en un caso de uso bastante habitual: la necesidad de mantener un registro de documentos generados a partir de una misma plantilla, que precisan ser comunicados de forma automática a un conjunto de destinatarios variable.
Todo ello nos servirá de excusa para ejercitar dos conceptos con los que un número sustancial de usuari#s de Microsoft Teams trabaja al diario sin ser conscientes de ello: ‘metadatos’ -metadata- y ‘bibliotecas’ -libraries- de Sharepoint.

Designed by Dooder / Freepik

¿Metadatos? ¿Bibliotecas?

Si no estás familiarizad# con alguno de estos términos, o cómo crearlos, antes de proseguir con el presente post te aconsejo que leas este otro, donde introducimos ambos conceptos y explicamos cómo se crean en el contexto de un sitio Sharepoint.

En nuestro reto de hoy, trabajaremos con una biblioteca Sharepoint con hasta cuatro columnas de metadatos personalizados, siendo un flujo de Power Automate el encargado de asignarles valor cada vez que se suba a la biblioteca un nuevo archivo Excel que cumpla una serie de condiciones. Nuestro flujo, además, se encargará de desencadenar la notificación del nuevo archivo a uno o varios destinatarios en función del propio archivo.

Paso#01. Estandarizando el nombre de nuestros archivos Excel

Para el reto que nos ocupa hoy, tomaremos el siguiente criterio a la hora de nombrar nuestros archivos Excel: indicaremos un Código de Departamento con un identificador único de 5 dígitos, utilizaremos un guión bajo de separador, para a continuación indicar el año (4 dígitos) seguido del mes (2 dígitos). La magia de las funciones split(), first() y last() nos ayudará a extraer la info así codificada:

Paso#02. Modelando nuestra fuente de datos externa

Además de la biblioteca de Sharepoint, necesitamos contar con una fuente de datos adicional que incorpore una tabla con la equivalencia entre el Código de Departamento contenido en el nombre de cada archivo, el nombre del DEpartamento propiamente dicho, y la dirección de correo del responsable a notificar. Por simplicidad optaremos por definir una tabla en un archivo Excel ubicado en la nube de Microsoft, y de cara a unas pruebas preliminares, nos bastarán apenas dos entradas.

Nuestra fuente de datos externa

Cuando incorporemos datos reales a nuestra fuente de datos externa, cada Departamento quedará representado por una fila, con su propio Código exclusivo, de forma que no puede haber varios Departamentos compartiendo un mismo Código: esto significa a efectos de uso del conector Excel Online (Empresas) podremos utilizar la columna donde registramos este código como columna clave si fuera necesario.

Paso#03. Customizando nuestra biblioteca de Sharepoint

Para el reto que nos ocupa hoy crearemos una nueva Biblioteca de Sharepoint y le añadiremos cuatro columnas personalizadas:

  • la columna ‘Unidad’, de tipo ‘Una sola línea de texto’ -Single line of text-, donde mostraremos un nombre vinculado al Código de Departamento, y que obtendremos de nuestra fuente de datos externa
  • la columna ‘Ventana’, de tipo ‘fecha’, donde almacenaremos el mes y año al que corresponde el archivo Excel
  • la columna ‘StatusNotif’, de tipo ‘opción’ -choice-, donde asignaremos uno de estos cuatro posibles estados: ‘Borrador’, ‘Notificar’, ‘Notificado’ y ‘Error’; y como valor por defecto ‘Notificar’
  • la columna ‘Responsable’, de tipo ‘usuario’ -person-, donde mostraremos a la persona de contacto asociada a ese código de departamento, y que obtendremos de nuestra fuente de datos externa

Notad que no hemos marcado ninguna de estas cuatro nuevas columnas como ‘obligatoria’. Esto nos simplificará la vida a la hora de actualizar los valores de estos metadatos personalizados desde nuestro flujo de PowerAutomate.

Paso#04. Desencadenando nuestro flujo

El flujo que vamos a diseñar se desencadenará cada vez que subamos un nuevo archivo a la biblioteca que acabamos de crear. La complejidad será similar tanto si optamos por el desencadenador ‘Cuando se crea un archivo en una carpeta’ -When a file is created in a folder- como si optamos por el desencadenador ‘Cuando se crea un archivo (solo propiedades) -When a file is created (properties only)-. Sucede que en AnyoneCanAutomate somos muy fans de éste último, así que no le damos más vueltas.

Observad además que incorporamos un bloque ‘Redactar’ -Compose- para poder, en tiempo de ejecución, identificar fácilmente el nombre del archivo que ha desencadenado el flujo y su extensión.

Paso#05. Validando que la extensión es .xlsx

Una de las limitaciones de las bibliotecas de Sharepoint, a día de hoy, es que no nos permiten restringir el tipo de archivos que se pueden subir a una biblioteca. Con la ayuda de Power Automate podremos examinar la extensión, y aplicar medidas preventivas en caso de que no se suba un archivo Excel. El escenario más simple es el de finalizar la ejecución de nuestro flujo si la extensión no es la esperada, pero dependiendo del caso de uso puede interesarnos enriquecerlo con pasos adicionales, por ejemplo, notificar el problema a la persona que subió el archivo e incluso eliminar el archivo.

Paso#06. Validando el nombre del nuevo archivo

¿Y si el nombre de un nuevo archivo no cumple el formato estandarizado acordado en el paso #01? En un prototipo nos podemos ahorrar validaciones, pero en un producto mínimo viable empiezan a ser aconsejables. Las funciones WDL serán nuestras principales aliadas para estas validaciones… existiendo casi tantas soluciones como PowerNautas. En infografías anteriores hemos visto que first(split()), y last(split()) nos pueden ayudar a separar el Código del Departamento del Año y Mes, utilizando el carácter separador ‘_’ ; pero además:

  • take() y skip() nos pueden ayudar a extraer el año y el mes codificados en el nombre de nuestro archivo
  • int() nos puede ayudar a comprobar que tanto Código de Departamento como Año y Mes son numéricos
  • length() y equals() nos pueden ayudar a verificar la longitud del Código del Departamento y del Año y Mes, pero también a verificar que el nombre del archivo contiene un único carácter separador ‘_’
  • formatDateTime() nos puede ayudar a verificar la validez del Año y Mes, así como a transformarlo al formato ISO 8601 para posteriormente actualizar el campo de metadatos ‘Ventana’
Si recibimos un archivo con nombre 12345_202150.xlsx o 99999_prueba.xlsx, expresiones WDL como ésta nos ayudará a identificar el error

Nombres no estandarizados de los archivos pueden provocar que alguna de estas expresiones devuelva un error de ejecución. Por fortuna, tal y como vimos en Power Automate y la identificación de errores de ejecución, podemos diseñar políticas gestión de errores que nos ayuden a capturar éstos y ejecutar pasos adicionales antes de forzar a finalizar la ejecución de nuestro Flow. Aunque en nuestro caso de uso de hoy, incorporar gestión de errores en nuestro flujo no resulta crítico, pues si éste no se ejecuta con éxito, el archivo mantendrá el valor por defecto ‘Notificar’ en el campo ‘StatusNotif’.

Con gestión de errores VS sin gestión de errores

Paso#07. Leyendo nuestra fuente de datos externa

Hemos comprobado ya que el nombre del nuevo archivo es conforme al formato estandarizado que tenemos acordado. Ahora bien, todavía no sabemos si el código de departamento indicado en él existe.

La solución vendrá por cuenta de la acción ‘Obtener una fila’ -Get a row- del conector Excel Online (Empresas), que nos permitirá comprobar si el Código de Departamento extraído del nombre del nuevo archivo consta en nuestra fuente de datos externa:

  • si existe, nos permitirá recuperar el Nombre del Departamento y el email del Responsable al que notificar el archivo
  • si no existe, nos devolverá un error, error que podríamos capturar conforme a lo descrito en Power Automate y la identificación de errores de ejecuciónpara poder ejecutar pasos adicionales. En nuestro ejemplo, actualizamos el valor del campo ‘StatusNotif’ para asignarle el valor ‘Error’

Paso#08. Recuperando el contenido del archivo

Llegados a este punto, hemos recuperado el Nombre del Departamento y el email del Responsable al que notificar el archivo. Si queremos adjuntar el archivo por email, necesitaremos recuperar el contenido de éste, cortesía de la acción ‘Obtener contenido de archivo’ -Get file content- del conector Sharepoint

Paso#09. Notificando el archivo a la persona de contacto

¡Ya casi estamos! Tenemos nuevo archivo a notificar, período (mes y año) al que corresponde, nombre del departamento al que corresponde e email del responsable. ¡Hora del conector Office 365 Outlook y de la acción ‘Enviar correo electrónico (V2)’! Y es que en nuestro caso de uso trabajamos con nuestra cuenta corporativa de Microsoft Outlook.

Una vez hemos rellenado los campos obligatorios (‘A’ -To-, ‘Asunto’ -Subject- y ‘Cuerpo’ -Body- indicaremos al editor de Power Automate que nos muestre entradas adicionales pulsando en la opción ‘Mostrar opciones avanzadas’ -Show advanced options-. Entre otras, se nos mostrará la opción de insertar adjuntos:

Paso#10. Actualizando metadatos

¡El paso final! Una vez enviada el correo electrónico informativo, actualizaremos los metadatos de nuestro archivo en la librería de Sharepoint: el menú de contenidos dinámicos nos ayudará a recuperar las salidas NombreUnidad e EmailResponsable de la acción ‘Obtener una fila’ y asignar sus valores a las columnas ‘Unidad’ (de tipo Una línea de texto) y ‘Responsable’ (de tipo Usuario) respectivamente. Aprovecharemos además para asignar:

  • el valor ‘Notificado’ a la columna ‘StatusNofif ’(de tipo opción)
  • el contenido de la variable ‘Ventana’ a la columna del mismo nombre (de tipo fecha)

Y ‘e voilá’! El archivo será notificado y registraremos la nueva situación en nuestra biblioteca de Sharepoint

Adivina adivinanza ¿por qué los dos últimos archivos toman el valor ‘Error’ en la columna ‘StatusNotif’?

Nuevos retos

¿Y si sustituyéramos la notificación por correo electrónico por un proceso de aprobación ‘made in’ conector de Aprobaciones y registrar el resultado en nuestra biblioteca?

¿Y si recibimos un sólo archivo cada mes con datos de gasto de toda la empresa y queremos trocear esa fuente de datos en tantos archivos como Departamentos, almacenándolos en nuestra biblioteca?

¿Y si…?

Para dar con la solución ya os imagináis que herramienta Low Code/No Code utilizar, ¿verdad?

¡Saludos, PowerNautas!

Lecturas recomendadas

--

--