appendRow retorna [Ljava.lang.Object; @ em vez de valores

Sep 28 2020

Desejo copiar os envios do formulário para uma planilha diferente para que os dados copiados possam ser editados sem afetar os envios originais.

Eu tenho o seguinte código:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues();

  tracker.appendRow([null,row[0]]);

Usar nullem appendRowajuda a mover as informações para a próxima coluna. No entanto, não funciona muito bem com o row[0]array. Se eu remover o, nullele funcionará bem, mas quero que as informações sejam copiadas em uma coluna diferente da primeira.

Respostas

3 Marios Sep 28 2020 at 18:30

Explicação:

  • A abordagem de uso nullé claramente uma solução alternativa e não uma solução à prova de futuro. Ou seja, se você quiser começar a colar a partir da coluna 4, terá que fazer o [null,null,null,...row[0]]que não é a maneira correta de fazer isso, na minha opinião.
  • Aconselho você a se livrar de appendRowe, nulluma vez que deseja colar os dados da segunda coluna em diante. Portanto, use em setValues()vez disso.

Substituir:

tracker.appendRow([null,row[0]]);

com:

tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);


Solução Completa:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues(); 
  tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);
}
4 OlegValter Sep 28 2020 at 18:31

Por que Ljava.lang.Object?

Porque você está usando o tempo de execução Rhino mais antigo que foi escrito em Java. Portanto, quando algo inesperado acontece, você tem um vislumbre da infraestrutura em que o GAS foi construído. Agora, java.lang.objecté uma classe base em Java da qual outros objetos, incluindo arrays, são derivados.

Como o appendRowúnico parâmetro da assinatura do método aceita uma matriz unidimensional de valores, seu row[0], que contém uma matriz (veja o que o getvaluesmétodo retorna), foi para a planilha como uma tag de string indicando que era um objeto em tempo de execução.

O que fazer no Rhino?

Todas as soluções dependem de tomar [ null ]como sua matriz de base e usar concatpara anexar o resto da primeira linha, algo como isto: [ null ].concat(row[0]). Você também pode usar pushcom um forloop simples para melhor desempenho.

O que fazer no V8 0 ?

Como a outra resposta mencionada, sua melhor aposta é a sintaxe de propagação . Você também pode fazer um push(...row[0])para evitar a concatenação de arrays (já que você usa e descarta imediatamente a cópia resultante [ null, ...row[0] ]).


0 Veja os documentos oficiais sobre como migrar para o V8 para aproveitar as vantagens dos novos recursos de idioma e velocidade aprimorada.

3 AmitAgarwal Sep 28 2020 at 18:18

A rowvariável contém um array, então você deve usar o operador spread comappendRow

Substituir:

tracker.appendRow([null,row[0]]);

com:

tracker.appendRow([null,...row[0]]);

Certifique-se de que seu projeto esteja habilitado para o tempo de execução do Chrome V8.