Cómo copiar o mover filas automáticamente en Google Sheets con Apps Script

En este tutorial aprenderemos a crear una macro con Google Apps Script para Google Sheets que nos permita copiar o mover una fila completa de una pestaña a otra automáticamente, basado en un valor que ingresemos en una celda. Esta automatización es ideal para gestionar prospectos o clientes en un CRM sencillo, donde al marcar un «sí» en una columna específica, la fila se copie a otra hoja para su seguimiento, y opcionalmente se elimine de la hoja original. Así evitamos copiar y pegar manualmente, ahorrando tiempo y reduciendo errores.

¿Qué vamos a lograr con esta macro?

La idea es que cuando cambies el valor de una celda en una fila específica (por ejemplo, en la columna 5), y ese valor sea «sí», el script copie toda esa fila a otra pestaña llamada «Clientes» automáticamente. Además, podemos configurar para que la fila original se elimine, simulando un «cortar y pegar». Esto es muy útil para llevar un control dinámico de prospectos que se convierten en clientes sin hacer tareas manuales repetitivas.

Paso 1: Preparar las hojas y el gatillo

Primero, necesitamos tener dos pestañas en nuestro archivo de Google Sheets: una llamada Prospectos donde estarán todos los posibles clientes, y otra llamada Clientes donde se copiarán las filas seleccionadas. En la pestaña Prospectos, en la columna 5 (por ejemplo), pondremos una lista desplegable o una casilla de verificación que al marcarla con «sí» active la macro.

El gatillo para que el script se ejecute será la función especial onEdit(e), que se activa cada vez que haces un cambio en cualquier celda del documento. Dentro de esta función verificaremos que el cambio se haya hecho en la hoja Prospectos, en una fila válida (mayor a 1 para no afectar encabezados), en la columna correcta (columna 5) y que el valor sea «sí». Solo entonces procederemos a copiar o mover la fila.

Paso 2: Crear la función onEdit y variables básicas

Vamos a abrir el Editor de secuencias de comandos desde Google Sheets (Extensiones > Apps Script) y escribir la función onEdit. En ella, definiremos variables para:

  • El archivo actual (spreadsheet)
  • La hoja de origen («Prospectos»)
  • La hoja de destino («Clientes»)
  • La celda activa donde se hizo el cambio
  • La fila y columna de esa celda
  • El valor ingresado en esa celda
function onEdit(e) {
  var archivo = SpreadsheetApp.getActiveSpreadsheet();
  var hojaOrigen = archivo.getSheetByName('Prospectos');
  var hojaDestino = archivo.getSheetByName('Clientes');

  var celdaActiva = e.range;
  var filaActiva = celdaActiva.getRow();
  var columnaActiva = celdaActiva.getColumn();
  var valor = celdaActiva.getValue();

  // Aquí seguiremos con las condiciones y lógica
}

Paso 3: Condiciones para ejecutar la copia

Antes de copiar, debemos asegurarnos que:

  • La fila activa sea mayor a 1 (para evitar encabezados)
  • La hoja activa sea «Prospectos»
  • La columna activa sea la que elegimos para el gatillo (columna 5 en este ejemplo)
  • El valor sea exactamente «sí» (en minúsculas para evitar errores)
if (filaActiva > 1 &&
    e.source.getActiveSheet().getName() === 'Prospectos' &&
    columnaActiva === 5 &&
    valor.toString().toLowerCase() === 'sí') {
  // Aquí va la lógica para copiar la fila
}

Paso 4: Definir el rango de origen y destino para copiar

Una vez que confirmamos que debemos copiar, definimos el rango completo de la fila que vamos a copiar. Por ejemplo, si nuestros datos ocupan las columnas 1 a 5, tomaremos ese rango de la fila activa. Luego, en la hoja destino, buscamos la última fila con datos para pegar justo debajo, sin sobreescribir encabezados ni datos previos.

var rangoOrigen = hojaOrigen.getRange(filaActiva; 1; 1; 5);
var ultimaFilaDestino = hojaDestino.getLastRow();
var filaDestino = ultimaFilaDestino + 1; // Pegamos en la siguiente fila vacía
var rangoDestino = hojaDestino.getRange(filaDestino; 1; 1; 5);

rangoOrigen.copyTo(rangoDestino);

Paso 5: Opcional – Borrar la fila original para mover (cortar y pegar)

Si queremos que la fila se mueva en vez de copiarse (es decir, que desaparezca de Prospectos y aparezca en Clientes), podemos borrar la fila original después de copiarla. Para esto usamos el método deleteRow() de la hoja origen, pasando la fila activa.

hojaOrigen.deleteRow(filaActiva);

Ten en cuenta que borrar la fila cambiará la posición de las filas siguientes, así que si usas esta opción, asegúrate de que no haya procesos simultáneos que puedan causar conflictos.

Código completo básico para copiar fila al marcar «sí»

function onEdit(e) {
  var archivo = SpreadsheetApp.getActiveSpreadsheet();
  var hojaOrigen = archivo.getSheetByName('Prospectos');
  var hojaDestino = archivo.getSheetByName('Clientes');

  var celdaActiva = e.range;
  var filaActiva = celdaActiva.getRow();
  var columnaActiva = celdaActiva.getColumn();
  var valor = celdaActiva.getValue();

  if (filaActiva > 1 &&
      e.source.getActiveSheet().getName() === 'Prospectos' &&
      columnaActiva === 5 &&
      valor.toString().toLowerCase() === 'sí') {

    var rangoOrigen = hojaOrigen.getRange(filaActiva; 1; 1; 5);
    var ultimaFilaDestino = hojaDestino.getLastRow();
    var filaDestino = ultimaFilaDestino + 1;
    var rangoDestino = hojaDestino.getRange(filaDestino; 1; 1; 5);

    rangoOrigen.copyTo(rangoDestino);

    // Para mover en vez de copiar, descomenta la siguiente línea:
    // hojaOrigen.deleteRow(filaActiva);
  }
}

Cómo mejorar esta macro

Esta macro es un punto de partida. Puedes mejorarla agregando validación de datos en la columna gatillo para que solo acepte «sí» o «no», usar casillas de verificación, o manejar varios rangos de columnas según tus necesidades. También puedes extenderla para que actualice otros datos relacionados, o para que envíe notificaciones cuando un prospecto se convierte en cliente.

Si quieres aprender a crear automatizaciones más avanzadas y dominar Google Apps Script para potenciar tus hojas de cálculo, te recomiendo inscribirte en mi academia online JuanSGuzman, donde profundizamos en estos temas con proyectos prácticos y soporte personalizado.

Conclusión

En resumen, creamos una función onEdit que detecta cuando marcas «sí» en una columna específica de la hoja Prospectos, y con ello copia toda la fila a otra hoja llamada Clientes. Esto facilita la gestión de prospectos y clientes sin necesidad de copiar y pegar manualmente. Además, vimos cómo opcionalmente mover la fila eliminándola de la hoja original. Este tipo de automatización es muy útil para emprendedores y pequeñas empresas que quieren ahorrar tiempo y mantener sus listas actualizadas automáticamente.

El siguiente paso que te sugiero es probar este código en tu propio archivo y adaptarlo a tus columnas y nombres de hoja. También puedes explorar cómo agregar validaciones o notificaciones para hacerlo aún más potente.

Si quieres aprender a usar Google Forms y Google Sheets desde cero, te invito a tomar un curso gratis de 2 horas.

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.