excel-planner/docs/POWER_AUTOMATE_EXPRESIONES.md

5.3 KiB

Expresiones Power Automate — Fechas + Responsables

Guia copy-paste para el flujo Puente Planner. Usa los nombres de bucle de tu flujo:

Bucle Variable
Planes Aplicar_a_cada_uno
Tareas (Parte 1) Aplicar_a_cada_uno_1
Enriquecer (Parte 2) Aplicar_a_cada_uno_2

Accion de perfil: Obtener_el_perfil_de_usuario_(V2) (ajusta si tu flujo usa otro nombre).


Variables al inicio

Nombre Tipo Valor inicial
todasLasTareas Matriz []
tareasFinales Matriz []

Parte 1 — Anexar a todasLasTareas

Dentro de Aplicar_a_cada_uno_1, despues de Enumerar tareas.
No referencies Obtener perfil aqui.

Campo Valor (modo expresion):

json(concat(
  '{"grupo":"Sapian","proyecto":"',
  replace(coalesce(items('Aplicar_a_cada_uno')?['title'], ''), '"', '\"'),
  '","plan_id":"', coalesce(items('Aplicar_a_cada_uno')?['id'], ''),
  '","tarea":"', replace(coalesce(items('Aplicar_a_cada_uno_1')?['title'], ''), '"', '\"'),
  '","tarea_id":"', coalesce(items('Aplicar_a_cada_uno_1')?['id'], ''),
  '","estado":"',
  if(equals(coalesce(items('Aplicar_a_cada_uno_1')?['percentComplete'], 0), 100), 'Completada',
    if(greater(coalesce(items('Aplicar_a_cada_uno_1')?['percentComplete'], 0), 0), 'En progreso', 'Por hacer')),
  '","porcentaje":', string(coalesce(items('Aplicar_a_cada_uno_1')?['percentComplete'], 0)),
  ',"fecha_vencimiento":"', coalesce(items('Aplicar_a_cada_uno_1')?['dueDateTime'], ''),
  '","asignados":"Sin asignar","userIdAsignado":"',
  if(or(empty(items('Aplicar_a_cada_uno_1')?['assignments']), equals(string(items('Aplicar_a_cada_uno_1')?['assignments']), '{}')),
    '', first(keys(items('Aplicar_a_cada_uno_1')?['assignments']))),
  '","vencida":false}'
))

Enumerar tareas — campo Plan:

items('Aplicar_a_cada_uno')?['id']

Parte 2 — Condicion

Expresion (lado izquierdo):

coalesce(items('Aplicar_a_cada_uno_2')?['userIdAsignado'], '')

Operador: no es igual a

Lado derecho: (vacio)


Parte 2 — Rama SI (despues de Obtener_el_perfil_de_usuario_(V2))

Anexar a tareasFinales, campo Valor:

json(concat(
  '{"grupo":"', coalesce(items('Aplicar_a_cada_uno_2')?['grupo'], 'Sapian'),
  '","proyecto":"', replace(coalesce(items('Aplicar_a_cada_uno_2')?['proyecto'], ''), '"', '\"'),
  '","plan_id":"', coalesce(items('Aplicar_a_cada_uno_2')?['plan_id'], ''),
  '","tarea":"', replace(coalesce(items('Aplicar_a_cada_uno_2')?['tarea'], ''), '"', '\"'),
  '","tarea_id":"', coalesce(items('Aplicar_a_cada_uno_2')?['tarea_id'], ''),
  '","estado":"', coalesce(items('Aplicar_a_cada_uno_2')?['estado'], 'Por hacer'),
  '","porcentaje":', string(coalesce(items('Aplicar_a_cada_uno_2')?['porcentaje'], 0)),
  ',"fecha_vencimiento":"', coalesce(items('Aplicar_a_cada_uno_2')?['fecha_vencimiento'], ''),
  '","asignados":"', replace(coalesce(
    outputs('Obtener_el_perfil_de_usuario_(V2)')?['body/displayName'],
    outputs('Obtener_el_perfil_de_usuario_(V2)')?['body/givenName'],
    'Sin asignar'), '"', '\"'),
  '","vencida":', if(coalesce(items('Aplicar_a_cada_uno_2')?['vencida'], false), 'true', 'false'),
  '}'
))

Obtener perfil — Id. de usuario:

items('Aplicar_a_cada_uno_2')?['userIdAsignado']

Parte 2 — Rama NO

Anexar a tareasFinales, campo Valor:

json(concat(
  '{"grupo":"', coalesce(items('Aplicar_a_cada_uno_2')?['grupo'], 'Sapian'),
  '","proyecto":"', replace(coalesce(items('Aplicar_a_cada_uno_2')?['proyecto'], ''), '"', '\"'),
  '","plan_id":"', coalesce(items('Aplicar_a_cada_uno_2')?['plan_id'], ''),
  '","tarea":"', replace(coalesce(items('Aplicar_a_cada_uno_2')?['tarea'], ''), '"', '\"'),
  '","tarea_id":"', coalesce(items('Aplicar_a_cada_uno_2')?['tarea_id'], ''),
  '","estado":"', coalesce(items('Aplicar_a_cada_uno_2')?['estado'], 'Por hacer'),
  '","porcentaje":', string(coalesce(items('Aplicar_a_cada_uno_2')?['porcentaje'], 0)),
  ',"fecha_vencimiento":"', coalesce(items('Aplicar_a_cada_uno_2')?['fecha_vencimiento'], ''),
  '","asignados":"Sin asignar","vencida":', if(coalesce(items('Aplicar_a_cada_uno_2')?['vencida'], false), 'true', 'false'),
  '}'
))

Respuesta HTTP (accion final)

Codigo: 200
Encabezado: Content-Type: application/json

Cuerpo (pega en el editor; inserta variables con contenido dinamico):

{
  "ok": true,
  "mensaje": "Datos extraidos correctamente",
  "todasLasTareas": @{variables('todasLasTareas')},
  "tareas": @{variables('tareasFinales')}
}

Python fusiona: fechas desde todasLasTareas + responsables desde tareas.


Probar

  1. En PA: Probar > Probar manualmente (debe quedar verde).
  2. En tu PC:
python scripts/diagnostico_pa.py
  1. Reinicia tablero:
python run_tablero.py

Errores frecuentes

Error Solucion
TriggerRequestMethodNotValid GET No abras la URL en el navegador; usa POST o Probar en PA
502 Bad Gateway Historial PA > accion roja; revisa expresiones de arriba
Referencia invalida a Obtener perfil Solo en rama SI, despues de Obtener perfil; nombre exacto
Fechas vacias Parte 1 debe incluir fecha_vencimiento + Respuesta con todasLasTareas
Sin responsables Parte 2 + Obtener perfil; condicion sobre userIdAsignado