En este artículo aprenderás a duplicar registros de tablas relacionadas en AppSheet, incluyendo padres, hijos y múltiples niveles de relaciones, generando nuevos IDs y manteniendo las referencias correctamente vinculadas. Crearemos una aplicación de gestión de órdenes de trabajo y configuraremos acciones agrupadas para copiar órdenes, servicios y repuestos, sin bots ni scripts, utilizando únicamente acciones y la versión gratuita de AppSheet.
1. Crear la aplicación y configurar las tablas



Para este tutorial trabajaremos con una aplicación de gestión de órdenes de trabajo para un taller de mantenimiento y reparación de vehículos. El objetivo será aprender a duplicar una orden completa, incluyendo sus registros relacionados, mediante acciones de AppSheet, sin utilizar bots ni scripts.
Primero, debemos crear nuestra base de datos con las siguientes tres tablas:
- Ordenes: contiene la información principal de cada orden de trabajo.
- Servicios: almacena los servicios asociados a cada orden.
- Repuestos: contiene los repuestos relacionados con cada orden.
Cada tabla debe tener las columnas indicadas en el ejemplo del tutorial, respetando sus nombres y las relaciones entre ellas.
Puedes descargar y copiar la base de datos utilizada en este ejercicio desde el enlace que encontrarás al final de este artículo.
Una vez creada la base de datos, conecta las tres tablas a AppSheet y configura la aplicación siguiendo las indicaciones del video incluido en este mismo artículo. Verifica que las columnas, los identificadores y las referencias estén configurados correctamente antes de continuar.
Cuando tengas la aplicación funcionando con las tres tablas, estaremos listos para preparar la lógica que permitirá duplicar los registros relacionados.
2. Crear la columna Copiar en la tabla principal


El primer paso es agregar una nueva columna llamada Copiar en nuestra tabla principal, es decir, la tabla padre. En nuestro ejemplo, utilizaremos la tabla Ordenes de la aplicación de gestión de órdenes de trabajo.
Para hacerlo, sigue estos pasos:
- Abre la fuente de datos donde tienes almacenada la tabla
Ordenes. - Crea una nueva columna con el nombre
Copiar. - Regresa a AppSheet y actualiza la estructura de la tabla para que reconozca la nueva columna.
- Configura el tipo de dato de
Copiarcomo Number.
Por el momento, no necesitamos colocar ninguna fórmula, valor inicial ni expresión en esta columna. Simplemente debemos crearla y asegurarnos de que AppSheet la reconozca correctamente.
¿Para qué nos servirá esta columna?
Más adelante, utilizaremos Copiar como parte de la lógica que permitirá generar identificadores diferentes para los registros duplicados. De esta manera, podremos crear nuevas copias sin reutilizar los ID originales y preparar la estructura necesaria para duplicar también los registros relacionados.
Por ahora, basta con dejar la columna creada y configurada como Number. En los siguientes pasos veremos cómo aprovecharla dentro del proceso de duplicación.
3. Crear las acciones para duplicar Servicios y Repuestos
Ahora vamos a crear las acciones que nos permitirán duplicar los registros de las tablas Servicios y Repuestos. Ambas acciones tendrán prácticamente la misma configuración: crearán una nueva fila con un ID único y asignarán una nueva referencia a la orden duplicada.
Acción para duplicar los Repuestos

Primero, ingresamos a Actions y creamos una nueva acción con la siguiente configuración:
| Propiedad | Configuración |
|---|---|
| Action name | Copiar_RepuestosTabla |
| For a record of this table | Repuestos |
| Do this | Data: add a new row to another table using values from this row |
| Table to add to | Repuestos |
En la sección Set these columns, configuramos los siguientes valores:
| Columna | Expresión |
|---|---|
ID | UNIQUEID() |
ID_Orden | [ID_Orden]&"-"&[ID_Orden].[Copiar] |
Repuesto | [Repuesto] |
Precio | [Precio] |
Con esta acción podremos crear una copia de cada repuesto, asignándole un nuevo identificador y modificando el valor de ID_Orden para que corresponda a la nueva orden.
La expresión [ID_Orden]&"-"&[ID_Orden].[Copiar] utiliza el identificador de la orden original y le agrega el valor de la columna Copiar. De esta manera, generamos la referencia que utilizaremos para identificar los repuestos de la orden duplicada.
Acción para duplicar los Servicios

Ahora creamos una segunda acción, esta vez para la tabla Servicios. El procedimiento es prácticamente el mismo.
Configuramos la acción de la siguiente manera:
| Propiedad | Configuración |
|---|---|
| Action name | Copiar_ServiciosTabla |
| For a record of this table | Servicios |
| Do this | Data: add a new row to another table using values from this row |
| Table to add to | Servicios |
En Set these columns, colocamos los siguientes valores:
| Columna | Expresión |
|---|---|
ID | UNIQUEID() |
ID_Orden | [ID_Orden]&"-"&[ID_Orden].[Copiar] |
Servicio | [Servicio] |
Precio | [Precio] |
Esta acción crea una nueva fila por cada servicio que copiemos, conservando su nombre y precio, pero generando un ID diferente y asignándole la nueva referencia de la orden.
¿Qué conseguimos con estas dos acciones?
Ya tenemos preparadas las acciones que se encargarán de duplicar los registros de Servicios y Repuestos. Ambas generan identificadores únicos y utilizan la columna Copiar de la tabla padre para construir la nueva referencia.
Importante: estas acciones crean una copia por cada registro sobre el que se ejecutan. En los siguientes pasos configuraremos la lógica necesaria para ejecutarlas sobre todos los registros relacionados con la orden original y coordinarlas con la duplicación de la tabla principal.
4. Crear las acciones en Tabla Ordenes para ejecutar la copia de Servicios y Repuestos
Ahora vamos a trabajar en la tabla Ordenes. En este paso crearemos dos acciones que nos permitirán ejecutar, desde una orden, las acciones que configuramos anteriormente en las tablas Servicios y Repuestos.
Acción para activar la acción de copiar los Repuestos

Ingresamos a Actions y creamos una nueva acción con la siguiente configuración:
| Propiedad | Configuración |
|---|---|
| Action name | Copiar004_Repuestos |
| For a record of this table | Ordenes |
| Do this | Data: execute an action on a set of rows |
| Referenced table | Repuestos |
| Referenced Rows | [Related Repuestos] |
| Referenced action | Copiar_RepuestosTabla |
En Referenced Rows, seleccionamos [Related Repuestos], que corresponde a la relación entre la tabla Ordenes y la tabla Repuestos. Después, en Referenced action, seleccionamos Copiar_RepuestosTabla, la acción que creamos en el paso anterior.
De esta manera, cuando ejecutemos esta acción desde una orden, AppSheet ejecutará la acción de copia sobre los registros relacionados de la tabla Repuestos.
Acción para activar la acción de copiar los Servicios

Ahora creamos una segunda acción para la tabla Servicios. Para ahorrar tiempo, podemos duplicar la acción anterior y modificar su configuración.
Utilizamos los siguientes valores:
| Propiedad | Configuración |
|---|---|
| Action name | Copiar003_Servicios |
| For a record of this table | Ordenes |
| Do this | Data: execute an action on a set of rows |
| Referenced table | Servicios |
| Referenced Rows | [Related Servicios] |
| Referenced action | Copiar_ServiciosTabla |
En este caso, seleccionamos [Related Servicios] como conjunto de filas y Copiar_ServiciosTabla como acción referenciada.
¿Qué hemos conseguido?
Ya tenemos dos acciones configuradas en la tabla Ordenes: Copiar004_Repuestos y Copiar003_Servicios. Ambas permiten ejecutar, desde el registro padre, las acciones que creamos anteriormente para duplicar las filas de sus respectivas tablas.
Por ahora, estas acciones se encargan de copiar los registros relacionados con la orden sobre la que se ejecutan. En los siguientes pasos construiremos la secuencia necesaria para coordinar estas copias con la creación de la nueva orden y sus identificadores.
5. Crear la acción para copiar la tabla principal Ordenes

Ahora vamos a crear la acción que se encargará de duplicar el registro principal de nuestra aplicación, es decir, la tabla Ordenes.
Anteriormente creamos acciones para copiar los registros de Servicios y Repuestos. En esta ocasión haremos algo similar, pero trabajando con la tabla principal, que será la base para generar la nueva orden y relacionar posteriormente sus registros hijos.
Ingresamos a Actions y creamos una nueva acción con la siguiente configuración:
| Propiedad | Configuración |
|---|---|
| Action name | Copiar002_Ordenes |
| For a record of this table | Ordenes |
| Do this | Data: add a new row to another table using values from this row |
| Table to add to | Ordenes |
En la sección Set these columns, configuramos los siguientes valores:
| Columna | Expresión |
|---|---|
ID | [ID]&"-"&[Copiar] |
NUMERO_ORDEN | "OT"&[_RowNumber] |
FECHA | TODAY() |
CLIENTE | [Cliente] |
VEHICULO | [Vehiculo] |
Con esta configuración, la acción creará una nueva fila en la tabla Ordenes, utilizando los datos de la orden original para completar la información del cliente y del vehículo.
Observa que, en la columna ID, concatenamos el identificador original con el valor de Copiar. Esto nos permitirá generar un identificador diferente para la nueva orden. Además, asignamos la fecha actual mediante TODAY() y generamos un nuevo número de orden utilizando [_RowNumber].
Importante: en la propiedad Table to add to debemos seleccionar Ordenes, ya que esta acción tiene como objetivo duplicar un registro de la tabla principal, no crear una fila en Repuestos.
6. Crear la acción para incrementar la columna Copiar

Ahora vamos a crear una acción que nos permitirá generar un valor diferente cada vez que dupliquemos una orden. Para ello, utilizaremos la columna Copiar que creamos al inicio del tutorial.
Ingresamos a Actions y creamos una nueva acción con la siguiente configuración:
| Propiedad | Configuración |
|---|---|
| Action name | Copiar001 |
| For a record of this table | Ordenes |
| Do this | Data: set the values of some columns in this row |
En la sección Set these columns, configuramos lo siguiente:
| Columna | Expresión |
|---|---|
Copiar | [Copiar]+1 |
Esta acción incrementa en una unidad el valor de la columna Copiar cada vez que se ejecuta. Si su valor inicial es 0, la primera ejecución lo cambiará a 1; la siguiente, a 2; después, a 3, y así sucesivamente.
¿Por qué necesitamos esta acción?
Recordemos que, al duplicar la orden principal, utilizamos la expresión [ID]&"-"&[Copiar] para generar el nuevo identificador.
Por ejemplo, si la orden original tiene el ID ORD001, las copias podrán generar los siguientes identificadores:
- Primera copia:
ORD001-1 - Segunda copia:
ORD001-2 - Tercera copia:
ORD001-3
De esta manera, podemos duplicar el mismo registro varias veces y obtener un identificador diferente para cada copia, sin reutilizar el ID de las copias anteriores.
Importante: para que este mecanismo funcione correctamente, la columna Copiar debe tener un valor inicial numérico, por ejemplo 0, antes de ejecutar la acción por primera vez. Además, debemos controlar el orden de ejecución de las acciones para que el valor utilizado al crear la copia corresponda al número esperado.
7. Agrupar todas las acciones para duplicar una orden completa

Llegamos al último paso de la configuración. Ahora vamos a agrupar todas las acciones que hemos creado para que se ejecuten en secuencia desde un único botón. De esta manera, el usuario no tendrá que activar cada acción por separado para duplicar una orden y sus registros relacionados.
Ingresamos a Actions y creamos una nueva acción con la siguiente configuración:
| Propiedad | Configuración |
|---|---|
| Action name | Copiar000_AgruparAcciones |
| For a record of this table | Ordenes |
| Do this | Grouped: execute a sequence of actions |
En la sección Actions, agregamos las acciones en el siguiente orden:
Copiar001Copiar002_OrdenesCopiar003_ServiciosCopiar004_Repuestos
Es importante respetar este orden, ya que cada acción cumple una función dentro del proceso de duplicación: incrementar el contador, crear la nueva orden y ejecutar las acciones que copian los servicios y los repuestos relacionados.
Configurar el botón Duplicar
Una vez agrupadas las acciones, vamos a configurar su apariencia para que el usuario pueda identificarla fácilmente dentro de la aplicación.
- Position: selecciona
PrimaryoProminent, según dónde prefieras mostrar el botón. - Display name: escribe
Duplicar. - Icon: selecciona un icono relacionado con la acción de copiar, como el de
Ocultar las acciones individuales
Para finalizar, debemos ocultar las acciones que creamos anteriormente, ya que no necesitamos que aparezcan individualmente en la interfaz de la aplicación.
Para hacerlo, ingresamos en cada una de las acciones auxiliares y cambiamos la propiedad Position a Hide.
De esta manera, únicamente mostraremos el botón Duplicar, mientras que las demás acciones se ejecutarán internamente como parte del proceso.
¡Listo! Ya tenemos todas las acciones agrupadas para intentar duplicar una orden de trabajo con sus servicios y repuestos desde un solo botón, sin utilizar bots ni scripts.
🎥 Aprende esto y mucho más en mi canal de YouTube
Todo lo que te he explicado aquí lo muestro paso a paso en mi canal de YouTube, con ejemplos prácticos y visuales para que lo entiendas fácilmente. Aquí te dejo el video:
📥 Base de Datos para Practicar
Haz clic en el siguiente enlace para acceder a la hoja de cálculo (base de datos) que utilizamos en este curso. Recuerda que debes hacer una copia en tu propio Google Drive para poder editarla y conectarla a tu app en AppSheet.



