Como inserir automaticamente uma nova linha e reter funções / fórmulas da última linha?


24

Eu tenho uma tabela com células que possuem funções / fórmulas, como esta:

insira a descrição da imagem aqui

Preciso de um script que crie uma nova linha, copiando com ela as funções / fórmulas da última linha usada. Acho esse script que cria uma nova linha, mas não copia funções / fórmulas . Como implementar essa tarefa de cópia de formatação no Script do Google Apps sem precisar selecionar e copiar manualmente?


se minha fórmula de linha anterior for = HTTPResponse (C4), como posso copiar a mesma fórmula, mas o novo número de célula para a nova linha?
user1788736

Respostas:


20

Use o código abaixo para copiar também as fórmulas como valores normais. Adicione o código selecionando Ferramentas no menu da planilha. Em seguida, selecione o editor de scripts e adicione o código. Certifique-se de pressionar o botão "bug" e autenticar o 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});
}

Observação

Definir o contentOnly para falseproduzirá uma cópia padrão. Se definir como true, irá colar apenas valores. O script de exemplo que você encontrou faz muito mais do que colar valores ...

Exemplo

Criei um arquivo de exemplo para você: Adicionar linha com fórmula


3

Esse ArrayFormula pode fazer o mesmo sem envolver um script. Digite-o em D4 e ele será transportado automaticamente em qualquer quantidade de células vazias abaixo dele.

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

Notas: "B4: B" significa procurar todas as células, começando de B4 até o final da coluna.

Enquanto, o ArrayFormula cuida de se copiar para as células abaixo dele. Apenas verifique se as células abaixo dela estão vazias.


3

Caso você precise adicionar uma nova linha na parte superior (primeira linha) e copiar a fórmula da primeira linha superior, será necessário copiar as fórmulas usando as funções getFormulas()e setFormulas(). Você pode alterar o valor de firstRow2 se sua planilha tiver cabeçalhos, por exemplo.

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);
}

1
Oi Denis, você está se referindo ao post que eu criei? Acabei de verificar o script e ele ainda está funcionando. Atenciosamente, Jacob Jan
Jacob Jan Tuinstra

Oi @JacobJanTuinstra, sim, você está certo. Na verdade, eu estava tentando adicionar uma nova linha na parte superior e manter a fórmula da mesma linha e não funcionou porque o script estava tentando copiar dados da linha vazia recém-criada. Vou atualizar minha resposta para refletir isso. Obrigado
dgpro

Olá @DenGordo! Obrigado por isso. Como eu modificaria isso se apenas tivesse valores para mover, e não fórmulas também? Obrigado!
Drewdavid

Oh PS - Onde faço referência com qual guia estou lidando? Obrigado novamente.
Drewdavid

-2

Para resolver esse problema, usei o setFormula(range), por exemplo:

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

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

Sua fórmula aumentará automaticamente de acordo com o índice de linhas.

Por fim, você pode adicionar um gatilho onUpdate ou onEdit.


-1; Como o código é evocado? Você está adicionando uma soma, mas precisa adicionar uma linha fisicamente. O onUpdategatilho não existe.
Jacob Jan Tuinstra
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.