Hace un par de días hablamos de los filtros OData para Power Automate y listas de Sharepoint (aquí la entrada anterior por si no la viste). Ahora toca ver algunos ejemplos de como usarlos.
Power Automate cuenta con acciones excelentes relacionadas a las listas de operaciones de SharePoint, como lo son obtener, actualizar y crear listas de objetos. El equipo de Power Automate introdujo «Filter Query» junto con «Order by» y «Top Count» como funciones avanzadas a estas acciones.
La función de «Filter Query» nos viene útil y nos evitará el complicar nuestros flujos de Power Automate, y por «complicar» me refiero a la posibilidad de traer todas las listas de objetos y hacer el filtrado desde adentro del flujo, lo que introduciría operaciones de datos innecesarias, lo cual haría el flujo lento y complicado.
Pero claro,
¿Qué es OData?
Ya que el término puede resultar desconocido para el usuario común. OData, o por su nombre completo, The Open Data Protocol es un servicio de HTTP REST creado por Microsoft hace ya un tiempo, y el OData viene integrado en muchos de los servicios de Office 365 Web, como Microsoft Graph, el cual es un servicio web por sí mismo.
El problema con la especificación OData es que es incómoda, contiene muchas funciones y diferentes servicios web lo implementan parcialmente. Por lo tanto, una función de los filtros como «substringof» solo funcionará para un servicio web como listas de SharePoint y no funcionará para otros servicios. Debido a la diferente implementación del estándar a través de los servicios de Microsoft, los diferentes equipos de ingenieros de Microsoft tienen diferentes manuales sobre cómo trabajar con queries OData.
EJEMPLOS ÚTILES PARA TRABAJAR CON LISTAS DE SHAREPOINT
No es cosa fácil el filtrar una lista de SharePoint o flujo de Power Automate por el campo de Persona o Grupo. Este campo en particular es un objeto que contiene múltiples entidades adentro, a diferencia de otros campos como secuencia, número, etc. por lo que aquí tenemos algunas formas para filtrar usando servicios de SharePoint REST y luego en un flujo de Power Automate.
FILTRAR UNA LISTA DE SHAREPOINT POR PERSONA O GRUPO USANDO SERVICIOS DE SHAREPOINT REST
Aquí tenemos algunos ejemplos. Una lista de SharePoint tiene un campo incluído para localizar al creador del objeto y quién fue el último en editarlo, así como también puede haber un campo personalizado de Persona de Grupo. Aquí voy a usar los operadores $select y $expand para mostrar el cómo puedo llegar a esos campos sin hacer algún filtro interno.
https://mytenant.sharepoint.com/sites/site1/_api/web/lists/getbytitle('MyList')/items?$select=PersonOrGroupField/Name,PersonOrGroupField/Title&$expand=PersonOrGroupField
https://mytenant.sharepoint.com/sites/site1/_api/web/lists/getbytitle('MyList')/items?$select=ID,Author/Id,Author/Name,Author/Title&$expand=Author
https://mytenant.sharepoint.com/sites/site1/_api/web/lists/getbytitle('MyList')/items?$select=ID,Editor/Id,Editor/Name,Editor/Title&$expand=Editor
En los ejemplos de arriba, PersonorGroupField representa un campo de Persona o Grupo creado en la lista. Los campos de Autor y Editor (tal como se mencionó) son campos de sistema que vienen con cada lista de SharePoint; aun así, son útiles para filtrar datos.
Dado que PersonOrGroupField es un objeto, puedo acceder las diferentes entidades del objeto si especificamos PersonOrGroupField/Id, PersonOrGroupField/Name o PersonOrGroupField/Title. El /Id representa el ID de usuario del sitio de SharePoint, y es un número. El /Title representa el nombre de muestra del usuario, como lo puede ser «Poe»; y /Name representa el nombre principal del usuario, el cual se ve como «i:0#.f|membership|poe.crown@email.com» en SharePoint Online.
FILTRAR CAMPO DE PERSONA O GRUPO PARA QUE MUESTRE UN NOMBRE
Así es como podemos filtrar una lista de SharePoint por el nombre de usuario usando la variable $filter y el operador igual. Este query puede ser usado incluso desde un navegador web para extraer datos. Podemos encontrar más información en el sitio oficial de OData, aun así, no hay garantía de que alguna de las opciones sean implementadas para un servicio específico de Microsoft 365 o Microsoft Graph.
https://mytenant.sharepoint.com/sites/mysite/_api/web/lists/getbytitle('MyList')/items?$select=ID,PersonOrGroupField/Id,PersonOrGroupField/Name,PersonOrGroupField/Title&$expand=PersonOrGroupField&$filter=PersonOrGroupField/Title eq 'Edgar Poe'
FILTRAR CAMPO DE PERSONA O GRUPO QUE CONTENGA UN EMAIL ESPECÍFICO
Otro escenario común es filtrar la lista donde tenga solo el correo del usuario, y es aquí donde «substringof(‘poe.crown@email.com’,PersonOrGroupField/Name)» nos sirve.
https://mytenant.sharepoint.com/sites/mysite/_api/web/lists/getbytitle('MyList')/items?$select=ID,PersonOrGroupField/Id,PersonOrGroupField/Name,PersonOrGroupField/Title&$expand=PersonOrGroupField&$filter=substringof('poe.crown@email.com',PersonOrGroupField/Name)
FILTRAR UNA LISTA DE SHAREPOINT POR EL CAMPO DE PERSONA O GRUPO EN POWER AUTOMATE
Podemos aplicar la misma técnica en un flujo de Power Automate, tal y como podemos ver en la siguiente imágen. La diferencia con SharePoint es que en SharePoint, la operación «$expand=PersonOrGroupField» es necesaria, pero el flujo la maneja de forma interna, así que en este caso específico solo el filtro de query.
PersonOrGroupField/Title eq 'Poe Edgar'
Esta es la imágen de Power Automate. Como podemos ver, el flujo está moviendo respuestas desde Microsoft Form hacia una lista de SharePoint y está usando el correo del usuario que mandó la forma para filtrar las listas de objetos por el usuario.
FILTRAR LISTA POR FORMA DE CAMPO DE FECHA POWER AUTOMATE Y SHAREPOINT REST
Otro escenario común es usar filtros sobre fechas en una lista de SharePoint y, de nuevo, el operador $filter nos puede ser útil. El campo DateTime también requiere un formato específico para ser pasado, por lo que no puede ser tan sencillo adivinar el query. Aquí tenemos el cómo hacerlo primero en Power Automate.
DateTimeField eq null or DateTimeField le '@{addDays(utcNow(), 0, 'yyyy-MM-dd')}')
Con los servicios de SharePoint REST será similar y, de nuevo, dos campos de sistema DateTime serán útiles para filtrar basados en los requisitos del negocio. Los campos Creado y Modificado estarán siempre presentes en cada lista de SharePoint. El Creado se refieren a cuando la lista de objetos ha sido creada, y el campo de fecha Modificado está ahí para grabar la fecha de la última modificación del objeto en la lista.
https://mytenant.sharepoint.com/sites/mysite/_api/web/lists/getbytitle('mysite')/items?$select=ID,DateTimeField&$filter=DateTimeField le '2020-02-03' or DateTimeField eq null
https://mytenant.sharepoint.com/sites/mysite/_api/web/lists/getbytitle('mysite')/items?$select=ID,Created&$filter=Created le '2020-02-03' or Created eq null
https://mytenant.sharepoint.com/sites/mysite/_api/web/lists/getbytitle('mysite')/items?$select=ID,Modified&$filter=Modified le '2020-02-03' or Modified eq null
Se asume que el formato de fecha para los campos de fecha personalizada pueden diferir dependiendo en los ajustes regionales del sitio, por lo que el formato US sería ‘yyyy-mm-dd’, pero el formato mexicano podría ser ‘dd-mm-aaaa’
CONCLUSIÓN
Filtrar OData puede no ser tarea sencilla si el usuario no cuenta con experiencia en programación. Las listas de SharePoint son una forma muy conveniente para almacenar datos a nivel de negocios y también para desarrollar automatización de negocios usando Power Automate. Aun así, usar queries OData puede simplificar los flujos de Power Automate, lo cual por sí mismo ya es un gran beneficio cuando se trata de solucionar problemas y mantenimiento en general.
Cualquier duda no leemos abajo.