appendRow restituisce [Ljava.lang.Object; @ invece dei valori
Desidero copiare gli invii del modulo su un foglio diverso in modo che i dati copiati possano essere modificati senza influire sugli invii originali.
Ho il codice seguente:
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]]);
L'uso di nullin appendRowti aiuta a spostare le informazioni nella colonna successiva. Tuttavia, non funziona abbastanza con l' row[0]array. Se rimuovo il nullfunziona bene, ma voglio che le informazioni vengano copiate su una colonna diversa dalla prima.
Risposte
Spiegazione:
- L'approccio all'utilizzo
nullè chiaramente una soluzione alternativa e non una soluzione a prova di futuro. Vale a dire, se vuoi iniziare a incollare dalla colonna 4 dovresti farlo, il[null,null,null,...row[0]]che non è il modo corretto per farlo secondo me. - Ti consiglio di sbarazzartene
appendRowenulldato che vuoi incollare i dati dalla seconda colonna in poi. Pertanto, usasetValues()invece.
Sostituire:
tracker.appendRow([null,row[0]]);
con:
tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);
Soluzione 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);
}
Perché Ljava.lang.Object?
Perché stai usando il vecchio runtime di Rhino scritto in Java. Quindi, quando accade qualcosa di inaspettato, si ha un'idea dell'infrastruttura su cui si basa GAS. Ora, java.lang.objectè una classe base in Java da cui derivano altri oggetti, inclusi gli array.
Poiché l' appendRowunico parametro della firma del metodo accetta un array unidimensionale di valori, il tuo row[0], che contiene un array (vedi quale getvaluesmetodo restituisce), è arrivato al foglio come un tag di stringa che indica che questo era un oggetto in fase di esecuzione.
Cosa fare in Rhino?
Tutte le soluzioni dipendono da prendere [ null ]come la matrice di base e l'utilizzo concatdi aggiungere il resto della prima fila, qualcosa di simile a questo: [ null ].concat(row[0]). Puoi anche usarlo pushcon un semplice forloop per prestazioni migliori.
Cosa fare in V8 0 ?
Come menzionato nell'altra risposta, la soluzione migliore è la sintassi di diffusione . Puoi anche fare una push(...row[0])per evitare la concatenazione di array (poiché usi e scarti immediatamente la copia risultante da [ null, ...row[0] ]).
0 Consulta i documenti ufficiali su come migrare alla V8 per sfruttare le nuove funzionalità linguistiche e una maggiore velocità.
La rowvariabile contiene un array quindi dovresti usare l'operatore spread conappendRow
Sostituire:
tracker.appendRow([null,row[0]]);
con:
tracker.appendRow([null,...row[0]]);
Assicurati che il tuo progetto sia abilitato per il runtime di Chrome V8.