Gonzalo Rementeria

22 – Funciones batch usando la api de SharePoint

Anteriormente os traje un par de artículos sobre cómo utilizar las funciones batch en Dataverse con PowerAutomate y hoy os traigo como usar las funciones Batch para SharePoint.

Así que vamos con ellos. Lo primero es explicar que son las funciones Batch y no es otra cosa que crear, actualizar o borrar registros en paquetes de hasta 1000 registros de una sola tacada.

Esto es por un lado MUCHÍSIMO más rápido y por otro MUCHÍSIMO más eficiente (se hacen muchas menos llamadas) con lo cual para procesos donde trabajes con miles de registros deberías SÍ o SÍ usar esto.

Te recomiendo estos 2 artículos sobre como implementar las funcione BATCH con DV ya que la estructura es muy similar para SharePoint.

  • En ambos hay que preparar los parámetros
  • Crear el bucle para cada uno de los paquetes de registros
  • Preparar dichos paquetes de registros
  • Hacer la llamada enviando el paquete de registros

Por otro lado al final del artículo te dejo el flujo listo para copiar y pegar en un Power Automate.

Y aquí la explicación

Aquí en las settings pongo un ejemplo de lo que habría que poner.

La url de la lista, el nombre de la lista, el nombre interno, el tamaño de los paquetes (máx 1000 registros) y la acción (borrar,crear,editar)

Aquí vemos en este ejemplo se están haciendo 2 acciones usando las funciones Batch, primero el vaciado de una lista, borrando todos los registros y luego el llenado.

No voy a centrarme en la parte del bucle ya que como he dicho antes podéis encontrarlo en los artículos que muestro al principio.

Esta es la estructura del borrado

Para la parte del borrado primero genero 2 GUID aleatorios

luego preparo el cuerpo del envío que voy a realizar

Para la parte inferior en el batchData coloco esto que lo que le indica es que voy a ir juntando la información de cada registro. Es decir voy montando ese paquete de hasta 1000 registros.

join(body(‘Select’), decodeUriComponent(‘%0A’))

y en el SendBatch lo siguiente. En esta parte es muy importante que la estructura sea justamente esta. Ya que hasta un espacio de más puede hacer que no funcione.

Y para la parte de llenar las filas, la estructura es como vemos prácticamente la misma. Solo que tengo que darle también no solo el ID del registro, si no también el resto de datos.

Aquí estoy montando el JSON donde se le indica con que voy a llenar cada uno de sus campos.

Por último al igual que en el ejemplo anterior hago el envío de los datos

replace(outputs(‘batchTemplate_llenado’), ‘|RowData|’, string(item()))

join(body(‘Select_llenado’), decodeUriComponent(‘%0A’))

y por aquí os dejo el código para copiar y pegar y en esta parte. Donde al hacerlo te aparecerá esto.

Un saludo.

				
					{"id":"5870bdce-5bcc-451f-a5b2-e16c9292da3d","brandColor":"#8C3900","connectionReferences":{"shared_sharepointonline":{"connection":{"id":"/grh_ReferenciaSP"}},"shared_commondataserviceforapps_1":{"connection":{"id":"/grh_ReferenciaDV"}}},"connectorDisplayName":"Control","icon":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDMyIDMyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KIDxwYXRoIGQ9Im0wIDBoMzJ2MzJoLTMyeiIgZmlsbD0iIzhDMzkwMCIvPg0KIDxwYXRoIGQ9Im04IDEwaDE2djEyaC0xNnptMTUgMTF2LTEwaC0xNHYxMHptLTItOHY2aC0xMHYtNnptLTEgNXYtNGgtOHY0eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+DQo=","isTrigger":false,"operationName":"Try","operationDefinition":{"type":"Scope","actions":{"settings":{"type":"Compose","inputs":{"siteAddress":"https://{nombredeltenant}/sites/{nombredelsite}/","listName":"paises","listNameInterno":"paises","batchSize":500,"Acciones":"DELETE"},"runAfter":{},"description":"Si hay dudas mirar en https://{nombreDelTenant}/sites/{nombre del site}//_api/web/lists/getbytitle('{nombre de la lista}')     Aunque el límite es 1000 si hay muchas columnas se puede pasar el límite en cuanto a tamaño   acciones DELETE POST UPDATE","trackedProperties":{"meta":{"type":"SP.Data.@{outputs('settings')?['listName']}ListItem"},"batchGUID":"@{guid()}","changeSetGUID":"@{guid()}"},"metadata":{"operationMetadataId":"96d5692f-1451-4532-a561-4bcc169ff35a"}},"Obtener_elementos_para_borrar":{"type":"OpenApiConnection","inputs":{"host":{"connectionName":"shared_sharepointonline","operationId":"GetItems","apiId":"/providers/Microsoft.PowerApps/apis/shared_sharepointonline"},"parameters":{"dataset":"@parameters('Sitio_VariableListas (pdw_Sitio_VariableListas)')","table":"c3c3497d-60e1-425b-aa6b-830202c5bd6e"},"authentication":{"type":"Raw","value":"@json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$ConnectionKey']"}},"runAfter":{"settings":["Succeeded"]},"runtimeConfiguration":{"paginationPolicy":{"minimumItemCount":100000}},"metadata":{"operationMetadataId":"dfc57127-bbcc-4983-acf5-4bd9f7d5656c"}},"numero_de_registros_a_borrar":{"type":"Compose","inputs":"@length(outputs('Obtener_elementos_para_borrar')?['body/value'])","runAfter":{"Obtener_elementos_para_borrar":["Succeeded"]},"metadata":{"operationMetadataId":"8738d270-e7f8-4a04-ab77-0c25beb9ed57"}},"Do_until_|_borrar_filas":{"type":"Until","expression":"@greaterOrEquals(mul(variables('vueltasDadas'), outputs('settings')['BatchSize']), length(body('Obtener_elementos_para_borrar')['Value']))","limit":{"count":20,"timeout":"PT1H"},"actions":{"batchID":{"type":"Compose","inputs":"@guid()","runAfter":{},"metadata":{"operationMetadataId":"a97fe9c6-9ddb-4258-b752-b965693f5381"}},"SendBatch":{"type":"OpenApiConnection","inputs":{"host":{"connectionName":"shared_sharepointonline","operationId":"HttpRequest","apiId":"/providers/Microsoft.PowerApps/apis/shared_sharepointonline"},"parameters":{"dataset":"@outputs('settings')['siteAddress']","parameters/method":"POST","parameters/uri":"/_api/$batch","parameters/headers":{"Content-Type":"multipart/mixed;boundary=batch_@{outputs('batchID')}"},"parameters/body":"--batch_@{outputs('batchID')}\nContent-Type: multipart/mixed; boundary=\"changeset_@{outputs('changeSet')}\"\nContent-Transfer-Encoding: binary\n\n@{outputs('batchData')}\n--changeset_@{outputs('changeSet')}--\n--batch_"},"authentication":{"type":"Raw","value":"@json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$ConnectionKey']"}},"runAfter":{"batchData":["Succeeded"]},"metadata":{"operationMetadataId":"992aea85-e308-42d5-a10c-6cf47eb07951"}},"Increment_variable_|_vueltas_dadas":{"type":"IncrementVariable","inputs":{"name":"vueltasDadas","value":1},"runAfter":{"Results":["Succeeded"]},"metadata":{"operationMetadataId":"adab3dd9-122a-4cc7-bf89-04ea4bc0a370"}},"changeSet":{"type":"Compose","inputs":"@guid()","runAfter":{"batchID":["Succeeded"]},"metadata":{"operationMetadataId":"f82aab67-55c1-45ee-93f5-f1b9a6a06369"}},"changesetBody":{"type":"Compose","inputs":"--changeset_@{outputs('changeSet')}\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\n@{outputs('settings')['Acciones']} @{outputs('settings')['SiteAddress']}_api/web/lists/getByTitle('@{outputs('settings')['listName']}')/items(-ID-) HTTP/1.1\nContent-Type: application/odata=verbose\nAccept: application/json;odata=verbose\nIF-MATCH: *\n","runAfter":{"changeSet":["Succeeded"]},"metadata":{"operationMetadataId":"f27e4a36-7832-4391-b0c8-71dd26ac7cf3"}},"Select":{"type":"Select","inputs":{"from":"@take(skip(body('Obtener_elementos_para_borrar')['Value'],mul(variables('vueltasDadas'),outputs('settings')['BatchSize'])),outputs('settings')['BatchSize'])\r\n","select":"@replace(outputs('changesetBody'), '-ID-', string(item()?['ID']))"},"runAfter":{"changesetBody":["Succeeded"]},"metadata":{"operationMetadataId":"8079f98d-f38c-4eb4-ab64-53dba1d2f375"}},"batchData":{"type":"Compose","inputs":"@join(body('Select'), decodeUriComponent('%0A'))","runAfter":{"Select":["Succeeded"]},"metadata":{"operationMetadataId":"6c652bbf-5d84-48ca-8d3e-27054603a77a"}},"Results":{"type":"Compose","inputs":"@base64ToString(body('sendBatch')['$content'])","runAfter":{"SendBatch":["Succeeded"]},"metadata":{"operationMetadataId":"171379dd-db3e-40e1-a07e-514b00ca07cd"}}},"runAfter":{"numero_de_registros_a_borrar":["Succeeded"]},"metadata":{"operationMetadataId":"d7771c1a-1c5c-4eda-8145-d5f5f054d226"}},"Set_Contador_a_0":{"type":"SetVariable","inputs":{"name":"vueltasDadas","value":0},"runAfter":{"Do_until_|_borrar_filas":["Succeeded"]},"metadata":{"operationMetadataId":"baef0dde-3d2e-4862-bb33-1beafa0f4d02"}},"Mostrar_filas_SP_Planificacion_Seguimiento":{"type":"OpenApiConnection","inputs":{"host":{"connectionName":"shared_commondataserviceforapps_1","operationId":"ListRecords","apiId":"/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps"},"parameters":{"entityName":"pdw_spsubprtrhyos"},"authentication":{"type":"Raw","value":"@json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$ConnectionKey']"}},"runAfter":{"Set_Contador_a_0":["Succeeded"]},"description":"Este paso trae los registros de los DF ACTIVOS  ordenados por NIVEL y ORDEN solo trae NOMBRE y NIVEL","runtimeConfiguration":{"paginationPolicy":{"minimumItemCount":100000}},"metadata":{"operationMetadataId":"ffaa5324-e0e7-4793-b920-d27815365b20"}},"Redactar_|_numero_de_registros_a_crear":{"type":"Compose","inputs":"@length(outputs('Mostrar_filas_SP_Planificacion_Seguimiento')?['body/value'])","runAfter":{"Mostrar_filas_SP_Planificacion_Seguimiento":["Succeeded"]},"metadata":{"operationMetadataId":"8738d270-e7f8-4a04-ab77-0c25beb9ed57"}},"Do_until_|_crear_filas":{"type":"Until","expression":"@greaterOrEquals(mul(variables('vueltasDadas'), outputs('settings')['BatchSize']), length(outputs('Mostrar_filas_SP_Planificacion_Seguimiento')?['body/value']))","limit":{"count":20,"timeout":"PT1H"},"actions":{"SendBatch_llenado":{"type":"OpenApiConnection","inputs":{"host":{"connectionName":"shared_sharepointonline","operationId":"HttpRequest","apiId":"/providers/Microsoft.PowerApps/apis/shared_sharepointonline"},"parameters":{"dataset":"@outputs('settings')['siteAddress']","parameters/method":"POST","parameters/uri":"/_api/$batch","parameters/headers":{"X-RequestDigest":"digest","Content-Type":"multipart/mixed;boundary=batch_@{outputs('batchID_llenado')}"},"parameters/body":"--batch_@{outputs('batchID_llenado')}\nContent-Type: multipart/mixed; boundary=\"changeset_@{outputs('changeSet_llenado')}\"\nContent-Length: \nContent-Transfer-Encoding: binary\n\n@{\r\noutputs('batchData_llenado')}\n\n--changeset_@{outputs('changeSet_llenado')}--\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\n--batch_@{outputs('batchID_llenado')}--"},"authentication":{"type":"Raw","value":"@json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$ConnectionKey']"}},"runAfter":{"batchData_llenado":["Succeeded"]},"metadata":{"operationMetadataId":"992aea85-e308-42d5-a10c-6cf47eb07951"}},"Increment_variable_|_vueltas_dadas_2":{"type":"IncrementVariable","inputs":{"name":"vueltasDadas","value":1},"runAfter":{"Result_SendBatch_llenado":["Succeeded"]},"metadata":{"operationMetadataId":"adab3dd9-122a-4cc7-bf89-04ea4bc0a370"}},"changeSet_llenado":{"type":"Compose","inputs":"@guid()","runAfter":{"batchID_llenado":["Succeeded"]},"metadata":{"operationMetadataId":"f82aab67-55c1-45ee-93f5-f1b9a6a06369"}},"batchData_llenado":{"type":"Compose","inputs":"@join(body('Select_llenado'), decodeUriComponent('%0A'))","runAfter":{"Select_llenado":["Succeeded"]},"metadata":{"operationMetadataId":"6c652bbf-5d84-48ca-8d3e-27054603a77a"}},"Result_SendBatch_llenado":{"type":"Compose","inputs":"@base64ToString(body('SendBatch_llenado')['$content'])","runAfter":{"SendBatch_llenado":["Succeeded"]},"metadata":{"operationMetadataId":"171379dd-db3e-40e1-a07e-514b00ca07cd"}},"batchID_llenado":{"type":"Compose","inputs":"@guid()","runAfter":{},"metadata":{"operationMetadataId":"a97fe9c6-9ddb-4258-b752-b965693f5381"}},"Select_llenado":{"type":"Select","inputs":{"from":"@body('GenerateSPData_llenado')","select":"@replace(outputs('batchTemplate_llenado'), '|RowData|', string(item()))"},"runAfter":{"batchTemplate_llenado":["Succeeded"]},"metadata":{"operationMetadataId":"8079f98d-f38c-4eb4-ab64-53dba1d2f375"}},"batchTemplate_llenado":{"type":"Compose","inputs":"--changeset_@{outputs('changeSet_llenado')}\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nPOST @{outputs('settings')['siteAddress']}_api/web/lists/getByTitle('@{outputs('settings')['listName']}')/items HTTP/1.1\nContent-Type: application/json;odata=verbose\n\n|RowData|\n","runAfter":{"GenerateSPData_llenado":["Succeeded"]},"metadata":{"operationMetadataId":"f27e4a36-7832-4391-b0c8-71dd26ac7cf3"}},"GenerateSPData_llenado":{"type":"Select","inputs":{"from":"@take(skip(body('Mostrar_filas_SP_Planificacion_Seguimiento')['Value'],mul(variables('vueltasDadas'),outputs('settings')['BatchSize'])),outputs('settings')['BatchSize'])\r\n","select":{"__metadata":"@json(concat('{\"type\":\"SP.Data.',outputs('settings')['listNameInterno'], 'ListItem\"}'))","Title":"@item()?['pdw_codigohyoactuaciondesubproyecto']","field_1":"@item()?['pdw_descripcionhyodeactuacionsubproyecto']","field_2":"@item()?['pdw_codigodesubproyecto']","field_3":"@replace(coalesce(item()?['pdw_nombresubproyecto'], ''), '\"', decodeUriComponent('%27'))","field_4":"@item()?['pdw_tiposubproyecto']","field_5":"@item()?['pdw_codigodesubproyecto']","field_6":"@item()?['pdw_entidadejecutora']","field_7":"@item()?['pdw_codigoactuaciondependiente']","field_8":"@if(greater(length(coalesce(item()?['pdw_nombreactuaciondependiente'], '')), 0), substring(coalesce(item()?['pdw_nombreactuaciondependiente'], ''), 0, min(length(coalesce(item()?['pdw_nombreactuaciondependiente'], '')), 255)), '')","field_9":"@item()?['pdw_codigohyodeproyecto']","field_10":"@item()?['pdw_subdireccionresponsable']","field_11":"@item()?['pdw_nombreproyecto']","field_12":"@item()?['pdw_hitocidoa']","field_13":"@item()?['pdw_codigomedida']","field_14":"@item()?['pdw_medida']","field_15":"@item()?['pdw_codigoactuacionsubproyecto']","field_16":"@item()?['pdw_nombreactuacionsubproyecto']","field_17":"@item()?['modifiedon']","field_18":"@item()?['createdon']"}},"runAfter":{"changeSet_llenado":["Succeeded"]},"description":"en la parte derecha se deben colocar en la izq los campos de sharepoint y en la derecha los items que queramos mapear","metadata":{"operationMetadataId":"c2dddabc-8a70-45c2-86a8-3982ebb19d9c"}}},"runAfter":{"Redactar_|_numero_de_registros_a_crear":["Succeeded"]},"metadata":{"operationMetadataId":"d7771c1a-1c5c-4eda-8145-d5f5f054d226"}}},"runAfter":{"Inicializar_variable_|_vueltasDadas":["Succeeded"]}}}
				
			

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *