En este tutorial aprenderás a crear una macro en Google Sheets que copia o mueve una fila completa a otra pestaña cuando seleccionas una casilla de verificación. Además, te mostraré cómo evitar que la fila se copie más de una vez y cómo adaptar el script para enviar datos a diferentes hojas según el valor seleccionado. Esta automatización te ayudará a gestionar mejor tus datos, como prospectos y clientes, sin perder tiempo con copias manuales.
Si prefieres ver el tutorial en video, te lo dejo a continuación para que puedas seguirlo paso a paso y con más detalles.
Paso 1: Preparar los datos en Google Sheets
Primero, organiza tus datos en Google Sheets. Supongamos que tienes una hoja llamada «Prospectos» con esta estructura:
| Nombre | Apellido | Fecha Contacto | Estado | … |
|---|---|---|---|---|
| Juan | Pérez | 2024-06-01 | No | … |
| Andrea | Fernández | 2024-06-02 | No | … |
| … | … | … | … | … |
Y otra hoja llamada «Clientes» donde quieres copiar o mover las filas seleccionadas.
Paso 2: Añadir casillas de verificación
En la hoja «Prospectos», selecciona la columna «Estado» (por ejemplo, la columna 4) y ve a Datos > Validación de datos. Allí, elige Casilla de verificación para que puedas marcar con un clic las filas que quieres copiar o mover.
Paso 3: Crear el script en Google Apps Script
Ahora vamos a crear el script que realizará la copia o el movimiento automático. Para eso, abre el editor de secuencias de comandos desde Google Sheets: Extensiones > Apps Script. Crea una función onEdit que se activará cada vez que edites una celda.
Este es el código mejorado que evita que la fila se copie dos veces y que permite mover o copiar según quieras. También incluye un condicional para enviar datos a diferentes hojas según el valor de la casilla:
function onEdit(e) {
var hojaOrigen = e.source.getActiveSheet();
var hojaNombre = hojaOrigen.getName();
var fila = e.range.getRow();
var columna = e.range.getColumn();
var valor = e.value;
// Solo actúa en la hoja "Prospectos", columna 4 (Estado) y cuando se marca la casilla (valor "TRUE")
if (hojaNombre === 'Prospectos' && columna === 4 && valor === 'TRUE') {
var hojaDestino;
// Puedes definir aquí a qué hoja enviar según el valor que quieras, por ejemplo:
// Si quieres enviar todo a "Clientes", deja esta línea fija:
hojaDestino = e.source.getSheetByName('Clientes');
// Si quieres enviar a diferentes hojas según un valor en otra columna, por ejemplo columna 5:
/*
var valorEstado = hojaOrigen.getRange(fila, 5).getValue();
if (valorEstado === 'Cliente Premium') {
hojaDestino = e.source.getSheetByName('Clientes Premium');
} else {
hojaDestino = e.source.getSheetByName('Clientes');
}
*/
// Tomar toda la fila de la hoja de origen
var rangoOrigen = hojaOrigen.getRange(fila, 1, 1, hojaOrigen.getLastColumn());
var valores = rangoOrigen.getValues()[0];
// Verificar si la fila ya existe en la hoja destino para evitar duplicados
var datosDestino = hojaDestino.getDataRange().getValues();
var existe = datosDestino.some(function(filaDestino) {
// Comparar todas las columnas para ver si la fila ya está copiada
return filaDestino.join() === valores.join();
});
if (!existe) {
// Añadir la fila al final de la hoja destino
hojaDestino.appendRow(valores);
// Opcional: borrar la fila original para mover en lugar de copiar
hojaOrigen.deleteRow(fila);
}
}
}
Explicación del código:
- El script se activa con cada edición (
onEdit). - Solo actúa si editas la columna 4 (donde están las casillas) en la hoja «Prospectos» y marcas la casilla (valor
TRUE). - Define la hoja destino donde se copiará la fila. Puedes usar un condicional para enviar a distintas hojas según un valor.
- Antes de copiar, verifica que la fila no esté ya en la hoja destino para evitar duplicados.
- Si no existe, copia la fila completa al final de la hoja destino.
- Por último, elimina la fila original para moverla en lugar de solo copiarla.
Paso 4: Probar y ajustar
Guarda el script y regresa a Google Sheets. Ahora al marcar una casilla en la columna «Estado» de la hoja «Prospectos», la fila se copiará (o moverá) automáticamente a la hoja «Clientes». Si quieres que se copie y no se elimine, simplemente comenta o elimina la línea hojaOrigen.deleteRow(fila);.
Si notas que la fila se copia dos veces, revisa en el editor de Apps Script la pestaña Ejecuciones para verificar si el disparador onEdit se está ejecutando más de una vez por edición. Esto puede pasar si tienes instalados otros disparadores o si editas celdas vinculadas a fórmulas que disparan el evento.
Conclusión
Con este tutorial has aprendido a crear una macro personalizada en Google Sheets para copiar o mover filas completas entre hojas con solo marcar una casilla de verificación. Además, te mostré cómo evitar duplicados y cómo adaptar el script para enviar datos a diferentes hojas según condiciones específicas.
Esta automatización es ideal para gestionar listas de prospectos, clientes o cualquier tipo de datos que necesites clasificar y mover fácilmente sin perder información ni hacer trabajo manual repetitivo.
Si quieres profundizar más en automatizaciones con Google Apps Script y Google Sheets, te recomiendo inscribirte en mi academia donde encontrarás cursos completos y soporte personalizado.
Si quieres aprender a usar Google Forms y Google Sheets desde cero, te invito a tomar un curso gratis de 2 horas.
XQUISIERA CORTAR Y PEGAR FILAS DE UNA HOJA A OTRA CON LA CONDICIONAL DE UNA PALABRA ESPECIFICA EN UNA COLUMNA ESPECIFICA PARA ES LINEA. POR EJEMPLO QUE CUANDO EN UNA COLUMNA QUE TENGO DESPLEGABLES CON UNA SERIE DE OPCIONES, AL SELECCIONAR UNA OPCION ESPECIFICA COPIE LA FILA A OTRA HOJA Y ELIMINE LA ORIGINAL
Te tocaría modificar el código para que tenga un condicional que dependiendo de la palabra te lleve a una hoja. Más fácil si la hoja y el valor se llaman igual. Algo asi
let valorSeleccionado=SpreadsheetApp.getActiveRange.getValue()
SpreadshetApp.getActiveSpreadsheet().getSheetByName(valorSeleccionado).appendRow()
Saludos!
Amigo genial tu trabajo Felicitaciones pero tengo una duda, si quieres eviar a distintas paginas dependiendo del cliente como podria hacer.
Es decir si -> «SI» lleva a la pagina «Cliente»
«Premium» lleve a la pagina «Cliente Premium»
como podria hacerlo?
de ante mano muchisimas gracias Brother
Hola!
Puedes usar un condicional
Algo asi
if(valor==»SI) hojaDestino=»Clientes»
else if(valor==»Cliente Premium) hojaDestino=»Clientes Premium»
Saludos!
Hola Juan! estoy utilizando este codigo en una planilla… solo que cuando me copia la fila lo hace dos veces… no se que puede estar mal para que eso suceda porque voy haciendo el paso a paso. te pego el codigo que escribipor las dudas, espero puedas ayudarme, gracias!
function onEdit(){
var archivo = SpreadsheetApp.getActiveSpreadsheet();
var hojaOrigen =archivo.getActiveSheet();
var nombreOrigen =hojaOrigen.getName();
var hojaDestino =archivo.getSheetByName(«RECIBIDO»);
var celdaActiva =hojaOrigen.getActiveCell();
var filaActiva =celdaActiva.getRow();
var colActiva =celdaActiva.getColumn();
var valor =celdaActiva.getValue();
Logger.log (filaActiva);
Logger.log (colActiva);
Logger.log (valor);
if(filaActiva>=2 && colActiva==11 && valor==»si» && nombreOrigen==»A INGRESAR» ){
var rangoOrigen =hojaOrigen.getRange(filaActiva,1,1,11);
var rangoDestino =hojaDestino.getRange(hojaDestino.getLastRow()+1,1);
rangoOrigen.copyTo(rangoDestino);
}
}
Hola!
Muy extraño
Tu código esta bien
Si te vas a «Ejecuciones» en el editor, te ejecuta dos veces el activador «Al editar»?
Saludos!