10 octubre, 2026

CONTROLAR LOS ERRORES DE $BATCH EN SHAREPOINT Y ENVIAR EL RESULTADO POR CORREO CON POWER AUTOMATE

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.

Comparte este post

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies