Para las organizaciones que usan los registros de horas y presupuestos de Asana, los informes periódicos son esenciales para una contabilidad y una nómina precisas. Si bien Asana proporciona vistas sólidas en la aplicación, es posible que ocasionalmente necesites una exportación CSV completa de todas las entradas de tiempo en todo tu dominio para la auditoría externa o el procesamiento personalizado al final de un mes o trimestre.
En este artículo se explica cómo usar la API de Asana para agregar entradas de tiempo de todo tu espacio de trabajo y formatearlas en un CSV limpio y listo para la contabilidad que coincida con tus requisitos internos.
Nota
Si bien esta guía está diseñada para usuarios del complemento de Planes de horas y presupuestos, este método de exportación basado en API también está disponible para usuarios que no usan complementos y registran el tiempo a través de campos de tareas estándar de Asana.
¿Por qué exportar a través de la API?
Si bien la interfaz de usuario de Asana ofrece paneles potentes, la exportación a través de la API te permite lo siguiente:
- Automatizar los informes: programa exportaciones mensuales o trimestrales para tu equipo de finanzas sin clics manuales.
- Granularidad de la auditoría: accede a metadatos específicos, como el estado de las tareas, la prioridad y los GID de entrada, que son cruciales para el mantenimiento de registros.
- Integración de sistemas: transfiere fácilmente tus datos de tiempo de Asana a un software de nómina o ERP.
Para garantizar la compatibilidad con las prácticas de contabilidad estándar, tu script de exportación debe producir un archivo CSV que contenga los siguientes campos, como se ve en las exportaciones de la vista del revisor:
Columna | Descripción |
Nombre de la tarea | El título de las tareas donde se registró el tiempo. |
Tiempo (horas) | Duración total convertida de minutos a horas decimales. |
Fecha | El día específico en que se realizó el trabajo. |
Remitente | El nombre del miembro del equipo que registró el tiempo. |
GID de tareas | El identificador único de las tareas de Asana. |
GID del proyecto | El identificador único del proyecto principal. |
Estado de las tareas | Si la tarea está actualmente “abierta” o “finalizada”. |
GID de entrada | El identificador único para el registro de tiempo específico. |
Implementación: exportación a través de Python
Para exportar “todo” el tiempo, tu script debe recorrer tus proyectos para encontrar tareas y luego buscar entradas de tiempo para esas tareas utilizando el punto de conexión Obtener entradas de seguimiento del tiempo para una tarea.
Requisitos previos
El script de exportación
Python
import asana
import pandas as pd
# Inicializar cliente client
= asana.Client.access_token('YOUR_PERSONAL_ACCESS_TOKEN')
workspace_gid = 'TU_GID_DE_ESPACIO_DE_TRABAJO'
def export_domain_time():
all_time_data = []
# 1. Iterar a través de todos los proyectos en el espacio de trabajo
projects = client.projects.get_projects({'espacio de trabajo': workspace_gid})
para proyectos en proyectos:
# 2. Obtener todas las tareas del proyecto
tareas = client.tasks.get_tasks_for_project(project['gid'], opt_fields=[
'name', 'gid', 'finalizado', 'finalizado_en', 'prioridad'
])
for tarea in tareas:
# 3. Obtener entradas de tiempo para cada tarea
time_entries = client.time_tracking_entries.get_time_tracking_entries_for_task(
task['gid'],
opt_fields=['created_by.name', 'duration_minutes', 'entered_on', 'gid']
)
for entry in time_entries:
# Calcula las horas en formato decimal
hours = round(entry['duration_minutes'] / 60, 2)
# Construir la fila para que coincida con la plantilla CSV
all_time_data.append({
"Nombre de la tarea": task['name'],
"Tiempo (horas)": horas,
"Fecha": entrada['enter_on'],
"Remitente": entry['created_by']['name'],
"GID de la tarea": task['gid'],
“GID del proyecto”: project['gid'],
"Estado de la tarea": "Finalizado" if task['completed'] else "Abierto",
"Fecha de finalización de la tarea": task.get('completed_at', ''),
"Prioridad de las tareas": task.get('priority', ''),
"GID de entrada": entry['gid']
})
# 4. Guardar en CSV
df = pd.DataFrame(all_time_data)
df.to_csv('asana_time_export_accounting.csv', index=False)
print("Exportación finalizada: asana_time_export_accounting.csv")
export_domain_time()
Consideraciones críticas para dominios grandes
Al ejecutar esta exportación para toda una organización, ten en cuenta las siguientes mejores prácticas:
- Límites de velocidad de la API: Asana tiene límites en la cantidad de solicitudes que puedes realizar por minuto. Para dominios masivos, considera agregar time.sleep() o usar la lógica de reintento integrada de la biblioteca de Asana.
- Filtrado de fechas: para la contabilidad mensual, usa el campo entered_on dentro de tu script para filtrar solo para el período relevante (por ejemplo, el mes anterior).
- Permisos: asegúrate de que el token de acceso personal pertenezca a una cuenta de servicio o a un administrador que tenga acceso a todos los proyectos relevantes, para que no se omitan entradas.