Hola a todos,
Hace unos días publiqué un ejemplo en el que vimos cómo ocultar o mostrar varias listas de SharePoint a la vez utilizando $batch en Power Automate: OCULTAR O MOSTRAR VARIAS LISTAS DE SHAREPOINT A LA VEZ CON $BATCH EN POWER AUTOMATE
A raíz de esa publicación, en LinkedIn me comentaron un detalle interesante sobre el tratamiento de la respuesta de $batch y me pareció una buena idea integrarlo en el flujo y ampliar el ejemplo.
La cuestión es importante: cuando enviamos una petición a: _api/$batch la llamada general puede devolver un 200, aunque alguna de las operaciones incluidas dentro del ChangeSet haya fallado.
Es decir, podríamos encontrarnos con algo como:
$batch → 200
Operación 1 → 204
Operación 2 → 204
Operación 3 → 400
Operación 4 → 204
Por tanto, comprobar únicamente que la acción Enviar una solicitud HTTP a SharePoint ha finalizado correctamente no garantiza que todas las operaciones del $batch se hayan ejecutado sin errores.
Os dejo aquí de nuevo el codigo completo:
1. DESENCADENAR UN FLUJO MANUALMENTE
Nombre real de la acción:
Desencadenar un flujo manualmente
No necesita parámetros de entrada.
2. INICIALIZAR varListas
Nombre real de la acción:
Inicializar variable
Nombre:
varListas
Tipo:
Matriz
Valor:
[
"tblOrganigrama",
"TEST_AI",
"TEST_AI_COMPLETO",
"TEST_AI_PEOPLE"
]
3. INICIALIZAR varOcultar
Nombre real de la acción:
Inicializar variable
Nombre:
varOcultar
Tipo:
Booleano
Valor:
false
true = Ocultar las listas
false = Mostrar las listas
4. INICIALIZAR varBatchBoundary
Nombre real de la acción:
Inicializar variable
Nombre:
varBatchBoundary
Tipo:
Cadena
Valor:
EXPRESIÓN
concat('batch_',guid())
5. INICIALIZAR varChangeSetBoundary
Nombre real de la acción:
Inicializar variable
Nombre:
varChangeSetBoundary
Tipo:
Cadena
Valor:
EXPRESIÓN
concat('changeset_',guid())
6. INICIALIZAR varOperaciones
Nombre real de la acción:
Inicializar variable
Nombre:
varOperaciones
Tipo:
Cadena
Valor:
Vacío
7. APLICAR A CADA UNO
Nombre real de la acción:
Aplicar a cada uno
Seleccionar una salida de los pasos anteriores:
EXPRESIÓN
variables('varListas')
7.1 ANEXAR A LA VARIABLE DE CADENA
Esta acción se encuentra dentro de Aplicar a cada uno.
Nombre real de la acción:
Anexar a la variable de cadena
Nombre:
varOperaciones
Valor:
EXPRESIÓN
concat(
'--',variables('varChangeSetBoundary'),decodeUriComponent('%0D%0A'),
'Content-Type: application/http',decodeUriComponent('%0D%0A'),
'Content-Transfer-Encoding: binary',decodeUriComponent('%0D%0A%0D%0A'),
'MERGE <URL_DEL_SITIO_SHAREPOINT>/_api/web/lists/getbytitle(''',items('Aplicar_a_cada_uno'),''') HTTP/1.1',decodeUriComponent('%0D%0A'),
'Content-Type: application/json;odata=verbose',decodeUriComponent('%0D%0A'),
'Accept: application/json;odata=verbose',decodeUriComponent('%0D%0A'),
'If-Match: *',decodeUriComponent('%0D%0A%0D%0A'),
'{"__metadata":{"type":"SP.List"},"Hidden":',if(variables('varOcultar'),'true','false'),'}',decodeUriComponent('%0D%0A')
)
8. CONSTRUIR BATCH
Nombre real de la acción:
Redactar
Nombre personalizado:
Construir Batch
Entradas:
EXPRESIÓN
concat(
'--',variables('varBatchBoundary'),decodeUriComponent('%0D%0A'),
'Content-Type: multipart/mixed; boundary=',variables('varChangeSetBoundary'),decodeUriComponent('%0D%0A%0D%0A'),
variables('varOperaciones'),
'--',variables('varChangeSetBoundary'),'--',decodeUriComponent('%0D%0A'),
'--',variables('varBatchBoundary'),'--',decodeUriComponent('%0D%0A')
)
9. ENVIAR UNA SOLICITUD HTTP A SHAREPOINT
Nombre real de la acción:
Enviar una solicitud HTTP a SharePoint
Conector:
SharePoint
Dirección del sitio:
Seleccionar el sitio de SharePoint correspondiente.
Método:
POST
URI:
_api/$batch
Encabezados:
Clave:
Content-Type
Valor:
EXPRESIÓN
concat('multipart/mixed; boundary=',variables('varBatchBoundary'))
Cuerpo:
EXPRESIÓN
outputs('Construir_Batch')
10. GENERAR RESUMEN
Nombre real de la acción:
Redactar
Nombre personalizado:
Generar resumen
Entradas:
EXPRESIÓN
concat(
'<b>Resultado del proceso</b><br><br>',
if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),1)),'204'),'✅ ','❌ '),variables('varListas')[0],' — ',if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),1)),'204'),if(variables('varOcultar'),'Ocultada','Mostrada'),'Error'),'<br>',
if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),2)),'204'),'✅ ','❌ '),variables('varListas')[1],' — ',if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),2)),'204'),if(variables('varOcultar'),'Ocultada','Mostrada'),'Error'),'<br>',
if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),3)),'204'),'✅ ','❌ '),variables('varListas')[2],' — ',if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),3)),'204'),if(variables('varOcultar'),'Ocultada','Mostrada'),'Error'),'<br>',
if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),4)),'204'),'✅ ','❌ '),variables('varListas')[3],' — ',if(startsWith(first(skip(split(string(body('Enviar_una_solicitud_HTTP_a_SharePoint')),'HTTP/1.1 '),4)),'204'),if(variables('varOcultar'),'Ocultada','Mostrada'),'Error')
)
11. ENVIAR CORREO ELECTRÓNICO (V2)
Nombre real de la acción:
Enviar correo electrónico (V2)
Conector:
Office 365 Outlook
Para:
<TU_CORREO>
Asunto:
Resultado
Cuerpo:
EXPRESIÓN
outputs('Generar_resumen')
Importancia:
Normal
En resumen, os dejo aquí la imagen completa:

El resultado va a ser cuando todo vaya bien:

Y si fallase alguna, nos mostrará la que no se ha ocultado.
Se podría hacer de varias formas, pero he decidido hacerlo así, sin utilizar loops que ralenticen el proceso.
