Los talleres, las flotas de vehículos y las áreas de mantenimiento suelen llevar sus registros en papel o en hojas de cálculo que nadie actualiza a tiempo. Con una app de mantenimiento de equipos en AppSheet, el técnico registra la intervención desde su celular, adjunta fotos del trabajo y el sistema te avisa cuándo toca la siguiente revisión.
Es la segunda idea de nuestra lista de 10 ejemplos de aplicaciones hechas con AppSheet. Es un proyecto de nivel intermedio a avanzado, así que conviene haber hecho antes el tutorial de la app de inventario.
Tiempo: entre 1 y 2 horas. Necesitas: una cuenta de Google.
Cómo funciona la app
Usaremos cuatro tablas relacionadas entre sí:
- Equipos: cada vehículo o máquina, con su código y cada cuántos días necesita mantenimiento preventivo.
- Tecnicos: las personas que realizan los trabajos.
- Mantenimientos: cada intervención, ya sea preventiva o correctiva, con su estado, fotos y observaciones.
- Actividades: las tareas concretas realizadas dentro de cada mantenimiento (cambio de aceite, revisión de frenos, etc.).
Paso 1: Crear la hoja de Google Sheets
Crea un archivo llamado Control de mantenimiento con cuatro pestañas. Los encabezados van en la fila 1 y sin espacios (usa guion bajo). Las columnas de fotos se dejan vacías.
Pestaña "Equipos"
| ID_Equipo | Codigo | Nombre | Tipo | Ubicacion | Frecuencia_Dias | Estado | Foto |
|---|---|---|---|---|---|---|---|
| E001 | VEH-001 | Camioneta Hilux | Vehículo | Patio principal | 90 | Operativo | |
| E002 | MAQ-001 | Compresor de aire | Maquinaria | Taller | 60 | Operativo |
Pestaña "Tecnicos"
| ID_Tecnico | Nombre | Telefono | Especialidad | |
|---|---|---|---|---|
| T001 | Tu nombre | tu-correo@gmail.com | 999000111 | Mecánica |
| T002 | Técnico 2 | otro@ejemplo.com | 999000222 | Electricidad |
En el técnico T001 usa tu propio correo de Google. Más adelante la app asignará automáticamente al técnico según la cuenta con la que inicie sesión.
Pestaña "Mantenimientos"
| ID_Mant | Equipo | Tipo | Fecha_Programada | Estado | Tecnico | Descripcion | Fecha_Realizada | Foto_Antes | Foto_Despues | Observaciones |
|---|---|---|---|---|---|---|---|---|---|---|
| M001 | E001 | Preventivo | 10/07/2026 | Finalizado | T001 | Cambio de aceite y filtros | 10/07/2026 | Sin novedades |
Usa el formato de fecha que tenga configurado tu hoja de cálculo.
Pestaña "Actividades"
| ID_Act | Mantenimiento | Actividad | Horas | Repuesto | Completada |
|---|---|---|---|---|---|
| A001 | M001 | Cambio de aceite | 1 | Aceite 15W40 | TRUE |
| A002 | M001 | Cambio de filtro de aire | 0.5 | Filtro de aire | TRUE |
Observa que la hoja no guarda la fecha de la próxima revisión ni el estado preventivo del equipo. La app los calculará solos a partir del historial.
Paso 2: Crear la app
- En tu hoja, ve a Extensiones → AppSheet → Crear una aplicación. También puedes entrar a appsheet.com y elegir Create → App → Start with existing data.
- Se crea la app con la primera pestaña. Agrega las otras tres desde Data → Tables → Add new table → Existing, eligiendo el mismo archivo y cada pestaña.
El editor de AppSheet aparece en inglés, por eso usamos los nombres originales de cada opción.
Paso 3: Configurar la tabla Equipos
Ve a Data → Columns → Equipos:
| Columna | Tipo | Ajustes |
|---|---|---|
| ID_Equipo | Text | Key activado, Initial value: UNIQUEID(), Show? desmarcado |
| Codigo | Text | Require activado y Scannable activado (para escanear una etiqueta o código QR del equipo) |
| Nombre | Name | Require activado y Label? activado |
| Tipo | Enum | Valores: Vehículo, Maquinaria, Herramienta, Otro |
| Ubicacion | Text | Sin ajustes especiales |
| Frecuencia_Dias | Number | Require activado, Initial value: 90 |
| Estado | Enum | Valores: Operativo, En mantenimiento, Fuera de servicio. Initial value: Operativo |
| Foto | Image | Sin ajustes especiales |
Agrega tres columnas virtuales
Con Add virtual column, crea estas tres, en este orden.
Ultimo_Mantenimiento (tipo Date). En App formula pega:
IF( ISNOTBLANK(SELECT(Mantenimientos[ID_Mant], AND([Equipo]=[_THISROW].[ID_Equipo], [Estado]="Finalizado"))), MAX(SELECT(Mantenimientos[Fecha_Realizada], AND([Equipo]=[_THISROW].[ID_Equipo], [Estado]="Finalizado"))), "" )
Proxima_Revision (tipo Date). En App formula pega:
IF(ISBLANK([Ultimo_Mantenimiento]), TODAY(), [Ultimo_Mantenimiento] + [Frecuencia_Dias])
Estado_Preventivo (tipo Text). En App formula pega:
IFS( ISBLANK([Ultimo_Mantenimiento]), "Sin historial", [Proxima_Revision] < TODAY(), "Vencido", [Proxima_Revision] <= TODAY() + 7, "Próximo", TRUE, "Al día" )
Con esto cada equipo se clasifica solo: Vencido si ya pasó la fecha, Próximo si vence en los próximos 7 días, Al día en los demás casos y Sin historial si todavía no tiene ningún mantenimiento finalizado.
Paso 4: Configurar la tabla Tecnicos
| Columna | Tipo | Ajustes |
|---|---|---|
| ID_Tecnico | Text | Key activado, Initial value: UNIQUEID(), Show? desmarcado |
| Nombre | Name | Require activado y Label? activado |
| Require activado | ||
| Telefono | Phone | Sin ajustes especiales |
| Especialidad | Enum | Valores: Mecánica, Electricidad, Soldadura, General |
Paso 5: Configurar la tabla Mantenimientos
| Columna | Tipo | Ajustes |
|---|---|---|
| ID_Mant | Text | Key activado, Initial value: UNIQUEID(), Show? desmarcado |
| Equipo | Ref | Source table: Equipos, Require activado, Is a part of? activado |
| Tipo | Enum | Valores: Preventivo, Correctivo. Input mode: Buttons. Require activado |
| Fecha_Programada | Date | Initial value: TODAY(), Require activado |
| Estado | Enum | Valores: Programado, En proceso, Finalizado. Initial value: Programado. Input mode: Buttons |
| Tecnico | Ref | Source table: Tecnicos, Initial value: ANY(SELECT(Tecnicos[ID_Tecnico], [Email]=USEREMAIL())) |
| Descripcion | LongText | Require activado |
| Fecha_Realizada | Date | Show_If: [Estado]="Finalizado" y Require_If: [Estado]="Finalizado" |
| Foto_Antes | Image | Sin ajustes especiales |
| Foto_Despues | Image | Sin ajustes especiales |
| Observaciones | LongText | Sin ajustes especiales |
Gracias a la fórmula inicial de Tecnico, cuando un técnico crea un mantenimiento la app lo asigna automáticamente según el correo con el que inició sesión. Un administrador puede cambiarlo si lo necesita.
Agrega dos columnas virtuales
Titulo (tipo Text, con Label? activado). Sirve para que cada mantenimiento aparezca con un nombre claro en las listas:
[Equipo].[Nombre] & " - " & [Tipo] & " - " & TEXT([Fecha_Programada], "DD/MM/YYYY")
Total_Horas (tipo Number). Suma las horas de todas las actividades del mantenimiento:
SUM(SELECT(Actividades[Horas], [Mantenimiento]=[_THISROW].[ID_Mant]))
Paso 6: Configurar la tabla Actividades
| Columna | Tipo | Ajustes |
|---|---|---|
| ID_Act | Text | Key activado, Initial value: UNIQUEID(), Show? desmarcado |
| Mantenimiento | Ref | Source table: Mantenimientos, Require activado, Is a part of? activado |
| Actividad | Text | Require activado y Label? activado |
| Horas | Decimal | Initial value: 0 |
| Repuesto | Text | Sin ajustes especiales |
| Completada | Yes/No | Initial value: FALSE |
Al marcar Is a part of?, las actividades se registran dentro de cada mantenimiento y los mantenimientos dentro de cada equipo. Así, al abrir un equipo ves todo su historial de intervenciones.
Paso 7: Crear los botones Iniciar y Finalizar
Para que el técnico cierre un trabajo con un solo toque, crea una acción en Data → Actions → New action:
- Action name:
Finalizar. For a record of this table: Mantenimientos. - Do this: Data: set the values of some columns in this row.
- Set these columns:
Estado="Finalizado"yFecha_Realizada=TODAY(). - Only if this condition is true:
[Estado] <> "Finalizado". - En Prominence, elige Display prominently para que aparezca como botón principal.
Repite el proceso para crear la acción Iniciar, que cambia Estado a "En proceso" y solo se muestra cuando [Estado]="Programado".
Paso 8: Crear las vistas y el panel
Primero, tres slices
Un slice es un filtro guardado de una tabla. Ve a Data → Slices → New Slice y crea:
| Nombre | Tabla | Row filter condition |
|---|---|---|
| Equipos_Vencidos | Equipos | [Estado_Preventivo]="Vencido" |
| Mant_Pendientes | Mantenimientos | [Estado] <> "Finalizado" |
| Mant_Realizados | Mantenimientos | [Estado] = "Finalizado" |
Después, las vistas
En UX → Views configura:
- Equipos: tipo Deck. Primary header:
Nombre. Secondary header:Codigo. Summary column:Estado_Preventivo. Main image:Foto. - Mantenimientos: tipo Table o Deck, ordenado por
Fecha_Programadade forma descendente. - Calendario: tipo Calendar, tabla Mantenimientos, Start date:
Fecha_Programada. - Pendientes: tipo Deck basado en el slice
Mant_Pendientes, ordenado porFecha_Programadaascendente. - Vencidos: tipo Deck basado en el slice
Equipos_Vencidos. - Gráfico: tipo Chart, tabla Mantenimientos, Chart type: Column, Group by:
Estado, Aggregate:COUNT. - Panel: tipo Dashboard. En Views, agrega Pendientes, Vencidos y Gráfico, y activa Interactive mode.
En la barra inferior de la app deja como vistas principales Panel, Equipos, Mantenimientos y Calendario. Las demás puedes ponerlas en el menú lateral.
Colores de alerta
En UX → Format rules crea dos reglas para la tabla Equipos: texto rojo cuando [Estado_Preventivo]="Vencido" y texto naranja cuando [Estado_Preventivo]="Próximo".
Paso 9: Probar la app en el simulador
- Abre el equipo Camioneta Hilux y revisa su historial: debe aparecer el mantenimiento M001.
- Verifica el campo
Estado_Preventivo. Si la fecha del mantenimiento de ejemplo ya quedó atrás, debe decir Vencido. - Dentro del equipo, pulsa + para crear un mantenimiento Preventivo. Comprueba que el equipo ya viene seleccionado y que tu nombre aparece como técnico.
- Agrega dos actividades con sus horas y confirma que
Total_Horassuma correctamente. - Pulsa Iniciar y luego Finalizar. Comprueba que se pide la fecha realizada y que el equipo pasa a Al día.
- Revisa que el Panel y el Calendario muestran los datos nuevos.
Paso 10 (opcional): Automatizar con bots
Esta parte es la más avanzada, pero es la que convierte la app en un sistema de mantenimiento real. Ve a Automation → Bots → Create a new bot.
Bot 1: Programar solo el siguiente preventivo
Cuando se finaliza un mantenimiento preventivo, se crea automáticamente el siguiente.
- Event: Data change, tabla
Mantenimientos, solo Updates, con esta condición:AND([_THISROW_BEFORE].[Estado]<>"Finalizado", [_THISROW_AFTER].[Estado]="Finalizado", [_THISROW_AFTER].[Tipo]="Preventivo")
- Process: agrega un paso Run a data action y elige Add a new row to another table using values from this row. Tabla:
Mantenimientos. Asigna estas columnas:ID_Mant=UNIQUEID()Equipo=[Equipo]Tipo="Preventivo"Fecha_Programada=[Fecha_Realizada] + [Equipo].[Frecuencia_Dias]Estado="Programado"Tecnico=[Tecnico]Descripcion="Mantenimiento preventivo programado"
Bot 2: Avisar cuando hay un trabajo correctivo
- Event: Data change, tabla
Mantenimientos, solo Adds, con la condición[Tipo]="Correctivo". - Process: paso Send an email, dirigido al supervisor. Para el asunto puedes usar:
"Nuevo trabajo correctivo: " & [Equipo].[Nombre]
y en el cuerpo,[Descripcion].
Paso 11: Compartir la app con tu equipo
En el editor usa la opción Share para agregar los correos de los técnicos y supervisores, y en Security activa que se requiera iniciar sesión. Cada persona instala la app AppSheet en su celular y la abre con su cuenta de Google. Recuerda que el correo registrado en la tabla Tecnicos debe ser exactamente el de esa cuenta.
La ubicación exacta de algunos botones puede cambiar cuando AppSheet actualiza su editor.
Errores frecuentes y cómo resolverlos
- Ultimo_Mantenimiento sale vacío: revisa que el estado esté escrito exactamente como
Finalizadoy que la fecha realizada esté completa. - El técnico no se asigna solo: el correo de la tabla
Tecnicosdebe ser idéntico al de la cuenta con la que entras a la app. - En las listas aparecen códigos como E001: marca la columna de nombre de cada tabla como Label.
- El bot no se dispara: comprueba que esté activado, que el evento sea Updates y que la condición use
_THISROW_BEFOREy_THISROW_AFTERtal como aparece arriba. - Las fotos no se ven en la hoja: es normal. La hoja guarda solo la ruta del archivo y AppSheet sube las imágenes a una carpeta de tu Google Drive. No borres esa carpeta.
Preguntas frecuentes
¿Sirve para una flota de vehículos?
Sí. Usa el tipo Vehículo y agrega una columna de kilometraje en Mantenimientos. Así puedes registrar el kilometraje de cada servicio.
¿El técnico puede usarla sin internet?
AppSheet permite trabajar sin conexión y sincroniza los datos cuando vuelve la señal. Revisa la configuración del modo sin conexión de tu app antes de usarla en campo.
¿Cómo hago que cada técnico vea solo sus trabajos?
Con un filtro de seguridad (Security filter) en la tabla de mantenimientos. Consulta la documentación oficial de AppSheet para configurarlo según tus roles.
Siguientes pasos
Con esta base ya tienes un sistema de mantenimiento preventivo y correctivo funcionando. Si todavía no creaste la app de inventario, puedes combinarla con esta para controlar también los repuestos. Y si buscas más ideas, revisa nuestra lista completa de 10 ejemplos de aplicaciones hechas con AppSheet.














