Cómo crear una app de mantenimiento de equipos en AppSheet paso a paso

Crea una app de mantenimiento de equipos en AppSheet: preventivos, correctivos, fotos, historial por equipo y alertas de vencimiento. Paso a paso

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.

Qué vas a lograr: una app que registra equipos, técnicos, mantenimientos preventivos y correctivos y sus actividades, calcula cuándo vence la próxima revisión de cada equipo y muestra un panel con lo pendiente.
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_EquipoCodigoNombreTipoUbicacionFrecuencia_DiasEstadoFoto
E001VEH-001Camioneta HiluxVehículoPatio principal90Operativo
E002MAQ-001Compresor de aireMaquinariaTaller60Operativo

Pestaña "Tecnicos"

ID_TecnicoNombreEmailTelefonoEspecialidad
T001Tu nombretu-correo@gmail.com999000111Mecánica
T002Técnico 2otro@ejemplo.com999000222Electricidad

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_MantEquipoTipoFecha_ProgramadaEstadoTecnicoDescripcionFecha_RealizadaFoto_AntesFoto_DespuesObservaciones
M001E001Preventivo10/07/2026FinalizadoT001Cambio de aceite y filtros10/07/2026Sin novedades

Usa el formato de fecha que tenga configurado tu hoja de cálculo.

Pestaña "Actividades"

ID_ActMantenimientoActividadHorasRepuestoCompletada
A001M001Cambio de aceite1Aceite 15W40TRUE
A002M001Cambio de filtro de aire0.5Filtro de aireTRUE

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

  1. 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.
  2. 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:

ColumnaTipoAjustes
ID_EquipoTextKey activado, Initial value: UNIQUEID(), Show? desmarcado
CodigoTextRequire activado y Scannable activado (para escanear una etiqueta o código QR del equipo)
NombreNameRequire activado y Label? activado
TipoEnumValores: Vehículo, Maquinaria, Herramienta, Otro
UbicacionTextSin ajustes especiales
Frecuencia_DiasNumberRequire activado, Initial value: 90
EstadoEnumValores: Operativo, En mantenimiento, Fuera de servicio. Initial value: Operativo
FotoImageSin 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.

Si las fórmulas dan error, revisa que los nombres de columnas y de tablas estén escritos exactamente igual que en tu hoja, respetando mayúsculas.

Paso 4: Configurar la tabla Tecnicos

ColumnaTipoAjustes
ID_TecnicoTextKey activado, Initial value: UNIQUEID(), Show? desmarcado
NombreNameRequire activado y Label? activado
EmailEmailRequire activado
TelefonoPhoneSin ajustes especiales
EspecialidadEnumValores: Mecánica, Electricidad, Soldadura, General

Paso 5: Configurar la tabla Mantenimientos

ColumnaTipoAjustes
ID_MantTextKey activado, Initial value: UNIQUEID(), Show? desmarcado
EquipoRefSource table: Equipos, Require activado, Is a part of? activado
TipoEnumValores: Preventivo, Correctivo. Input mode: Buttons. Require activado
Fecha_ProgramadaDateInitial value: TODAY(), Require activado
EstadoEnumValores: Programado, En proceso, Finalizado. Initial value: Programado. Input mode: Buttons
TecnicoRefSource table: Tecnicos, Initial value: ANY(SELECT(Tecnicos[ID_Tecnico], [Email]=USEREMAIL()))
DescripcionLongTextRequire activado
Fecha_RealizadaDateShow_If: [Estado]="Finalizado" y Require_If: [Estado]="Finalizado"
Foto_AntesImageSin ajustes especiales
Foto_DespuesImageSin ajustes especiales
ObservacionesLongTextSin 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

ColumnaTipoAjustes
ID_ActTextKey activado, Initial value: UNIQUEID(), Show? desmarcado
MantenimientoRefSource table: Mantenimientos, Require activado, Is a part of? activado
ActividadTextRequire activado y Label? activado
HorasDecimalInitial value: 0
RepuestoTextSin ajustes especiales
CompletadaYes/NoInitial 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:

  1. Action name: Finalizar. For a record of this table: Mantenimientos.
  2. Do this: Data: set the values of some columns in this row.
  3. Set these columns: Estado = "Finalizado" y Fecha_Realizada = TODAY().
  4. Only if this condition is true: [Estado] <> "Finalizado".
  5. 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:

NombreTablaRow filter condition
Equipos_VencidosEquipos[Estado_Preventivo]="Vencido"
Mant_PendientesMantenimientos[Estado] <> "Finalizado"
Mant_RealizadosMantenimientos[Estado] = "Finalizado"

Después, las vistas

En UX → Views configura:

  1. Equipos: tipo Deck. Primary header: Nombre. Secondary header: Codigo. Summary column: Estado_Preventivo. Main image: Foto.
  2. Mantenimientos: tipo Table o Deck, ordenado por Fecha_Programada de forma descendente.
  3. Calendario: tipo Calendar, tabla Mantenimientos, Start date: Fecha_Programada.
  4. Pendientes: tipo Deck basado en el slice Mant_Pendientes, ordenado por Fecha_Programada ascendente.
  5. Vencidos: tipo Deck basado en el slice Equipos_Vencidos.
  6. Gráfico: tipo Chart, tabla Mantenimientos, Chart type: Column, Group by: Estado, Aggregate: COUNT.
  7. 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

  1. Abre el equipo Camioneta Hilux y revisa su historial: debe aparecer el mantenimiento M001.
  2. Verifica el campo Estado_Preventivo. Si la fecha del mantenimiento de ejemplo ya quedó atrás, debe decir Vencido.
  3. Dentro del equipo, pulsa + para crear un mantenimiento Preventivo. Comprueba que el equipo ya viene seleccionado y que tu nombre aparece como técnico.
  4. Agrega dos actividades con sus horas y confirma que Total_Horas suma correctamente.
  5. Pulsa Iniciar y luego Finalizar. Comprueba que se pide la fecha realizada y que el equipo pasa a Al día.
  6. 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.

  1. Event: Data change, tabla Mantenimientos, solo Updates, con esta condición:
    AND([_THISROW_BEFORE].[Estado]<>"Finalizado", [_THISROW_AFTER].[Estado]="Finalizado", [_THISROW_AFTER].[Tipo]="Preventivo")
  2. 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

  1. Event: Data change, tabla Mantenimientos, solo Adds, con la condición [Tipo]="Correctivo".
  2. Process: paso Send an email, dirigido al supervisor. Para el asunto puedes usar:
    "Nuevo trabajo correctivo: " & [Equipo].[Nombre]
    y en el cuerpo, [Descripcion].
Los bots y el uso de la app con usuarios reales pueden requerir un plan de pago de AppSheet. Revisa los precios vigentes en su página oficial antes de implementarla en tu empresa.

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 Finalizado y que la fecha realizada esté completa.
  • El técnico no se asigna solo: el correo de la tabla Tecnicos debe 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_BEFORE y _THISROW_AFTER tal 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.