¿Cómo insertar automáticamente una nueva fila y retener funciones / fórmulas de la última fila?

24

Tengo una tabla con celdas que tienen funciones / fórmulas, como esta:

ingrese la descripción de la imagen aquí

Necesito un script que cree una nueva fila, copiando con él las funciones / fórmulas de la última fila utilizada. Encuentro este script que crea una nueva fila pero no copia funciones / fórmulas . ¿Cómo podría implementar esta tarea de copia de formateo en Google Apps Script sin tener que seleccionar y copiar manualmente?

Aprendiz de Pythonista
fuente
si mi fórmula de fila anterior es = HTTPResponse (C4), ¿cómo puedo copiar la misma fórmula pero el nuevo número de celda para la nueva fila?
user1788736

Respuestas:

20

Use el siguiente código para copiar también las fórmulas como valores normales. Agregue el código seleccionando Herramientas en el menú de la hoja de cálculo. Luego seleccione editor de script y agregue el código. Asegúrese de presionar el botón "error" y autenticar el script.

Código

// global 
var ss = SpreadsheetApp.getActive();

function onOpen() {
  var menu = [{name:"Add New Last Row", functionName:"addRow"}];
  ss.addMenu("Extra", menu);
}

function addRow() {
  var sh = ss.getActiveSheet(), lRow = sh.getLastRow(); 
  var lCol = sh.getLastColumn(), range = sh.getRange(lRow,1,1,lCol);
  sh.insertRowsAfter(lRow, 1);
  range.copyTo(sh.getRange(lRow+1, 1, 1, lCol), {contentsOnly:false});
}

Observación

Establecer el contenido Solo para falseproducirá una copia estándar. Al configurarlo true, pegará solo los valores. El script de ejemplo que encontraste hace mucho más que pegar valores .....

Ejemplo

He creado un archivo de ejemplo para usted: Agregar fila con fórmulas

Jacob Jan Tuinstra
fuente
3

Este ArrayFormula puede hacer lo mismo sin involucrar un script. Ingrese en D4, y se transferirá automáticamente en cualquier cantidad de celdas vacías debajo de él.

ArrayFormula(vlookup(B4:B:tax_table!$A$2:$G$8;3;true))

Notas: "B4: B" significa, mira todas las celdas comenzando desde B4 hasta el final de la columna.

Mientras, ArrayFormula se encarga de copiarse en las celdas debajo de él. Solo asegúrate de que las celdas debajo estén vacías.

usuario3660579
fuente
3

En caso de que necesite agregar una nueva fila en la parte superior (primera fila) y copiar la fórmula desde la primera fila superior, deberá copiar las fórmulas mediante el uso de getFormulas()y las setFormulas()funciones. Puede cambiar el valor de firstRowa 2 si su hoja de cálculo tiene encabezados, por ejemplo.

function addFirstRow() {
    var firstRow = 1;
    var sh = ss.getActiveSheet();
    var lCol = sh.getLastColumn();
    var range = sh.getRange(firstRow, 1, 1, lCol);
    var formulas = range.getFormulas();
    sh.insertRowsAfter(1, 1);
    newRange = sh.getRange(firstRow, 1, 1, lCol);
    newRange.setFormulas(formulas);
}
dgpro
fuente
1
Hola Denis, ¿te refieres a la publicación que creé? Solo reviso el script y todavía funciona. Saludos Jacob Jan
Jacob Jan Tuinstra
Hola @JacobJanTuinstra, sí, tienes razón. Realmente estaba tratando de agregar una nueva fila en la parte superior y retener la fórmula de la misma fila y no funcionó porque el script estaba tratando de copiar datos de una fila vacía recién creada. Actualizaré mi respuesta para reflejar esto. Gracias
dgpro
Hola @DenGordo! Gracias por esto. ¿Cómo modificaría esto si solo tengo valores para mover, y no fórmulas también? ¡Gracias!
Drewdavid
Oh PD: ¿Dónde hago referencia a la pestaña con la que estoy tratando? Gracias de nuevo.
Drewdavid
-2

Para resolver este problema, he usado setFormula(range), por ejemplo:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var cell = sheet.getRange("B5");
 cell.setFormula("=SUM(B3:B4)");

Su fórmula aumentará automáticamente de acuerdo con el índice de la fila.

Por último, puede agregar un activador onUpdate o onEdit.

usuario70790
fuente
-1; ¿Cómo se evoca el código? Estás agregando una suma, pero necesitas agregar una fila físicamente. El onUpdatedisparador no existe.
Jacob Jan Tuinstra