Macro para copiar o mover filas con casilla en Google Sheets

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:

NombreApellidoFecha ContactoEstado…
JuanPérez2024-06-01No…
AndreaFernández2024-06-02No…
……………

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.

6 comentarios en “Macro para copiar o mover filas con casilla en Google Sheets”

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

    1. 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!

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

    1. Hola!
      Puedes usar un condicional
      Algo asi
      if(valor==»SI) hojaDestino=»Clientes»
      else if(valor==»Cliente Premium) hojaDestino=»Clientes Premium»
      Saludos!

  3. 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);

    }

    }

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

JuanSGuzman
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.