Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Reduzir o código na Apps Scrit

Boa tarde!

Tenho uma planilha no google sheets, nela tem duas abas "Dados e Filtro"; na aba filtro eu faço uma query que retorna informação pela Grupo, status, data inicial e Data final.

Esse é a Query: =QUERY(DADOS!A1:G;"SELECT A,D,E,F WHERE B = '"&A2&"' and D ='"&B2&"' and E >= date '"&TEXTO(C2;"yyyy-MM-dd")&"' and F <= date '"&TEXTO(D2;"yyyy-MM-dd")&"' ";1)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Aba Dados

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Criei uma macro com base nas informações que a Query me retorna, onde copia os dado da horizontal e cola na vertical, eu gostaria de um auxílio para verificar uma maneira de deixar o script menos extenso. Abaixo código da macro no google sheets:

function Macro2() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('B4').activate();
  spreadsheet.getRange('F4').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B5').activate();
  spreadsheet.getRange('G4').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B6').activate();
  spreadsheet.getRange('H4').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B7').activate();
  spreadsheet.getRange('I5').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B9').activate();
  spreadsheet.getRange('F5').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B10').activate();
  spreadsheet.getRange('G5').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B11').activate();
  spreadsheet.getRange('H5').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B12').activate();
  spreadsheet.getRange('I5').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B14').activate();
  spreadsheet.getRange('F6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B15').activate();
  spreadsheet.getRange('G6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B16').activate();
  spreadsheet.getRange('H6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('B17').activate();
  spreadsheet.getRange('I6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);  
};

Abaixo imagem de como precisaria ser o layout das informações:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Desde agradeço ajuda dos colegas.

1 resposta
solução!

Olá, Luciano! Tudo bem com você?

Peço desculpa pela demora em responder o seu tópico.

Seu código atual está fazendo isso de forma muito manual, copiando e colando cada célula individualmente. Podemos otimizar isso usando loops e arrays.

Aqui está um exemplo de como você pode fazer isso:

function Macro2() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sourceData = spreadsheet.getSheetByName('Dados').getRange('F4:I6').getValues(); // ajuste o range conforme necessário
  var targetRange = spreadsheet.getSheetByName('Filtro').getRange('B4:B17'); // ajuste o range conforme necessário

  var flattenedData = [].concat.apply([], sourceData); // isso irá "achatar" o array 2D em um array 1D

  targetRange.setValues(flattenedData.map(function(row) { return [row]; })); // isso irá converter o array 1D de volta para um array 2D para que possa ser usado com setValues()
}

Neste exemplo, estamos pegando os dados de um range específico na aba 'Dados', achatando esses dados em um array 1D (porque getValues() retorna um array 2D), e então colocando esses dados na aba 'Filtro'. Estou presumindo que você quer colocar esses dados na coluna B, mas você pode ajustar isso conforme necessário.

Espero que isso ajude a simplificar o seu código! Lembre-se de ajustar os ranges conforme necessário para o seu caso específico.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.