appendRow renvoie [Ljava.lang.Object; @ au lieu de valeurs

Sep 28 2020

Je souhaite copier les soumissions de formulaire sur une autre feuille afin que les données copiées puissent être modifiées sans affecter les soumissions originales.

J'ai le code suivant:

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'utilisation de nulldans appendRowvous aide à déplacer les informations vers la colonne suivante. Cependant, cela ne fonctionne pas tout à fait avec le row[0]tableau. Si je supprime le, nullcela fonctionne bien, mais je veux que les informations soient copiées sur une colonne différente de la première.

Réponses

3 Marios Sep 28 2020 at 18:30

Explication:

  • L'approche d'utilisation nullest clairement une solution de contournement et non une solution pérenne. À savoir, si vous voulez commencer à coller à partir de la colonne 4, vous devrez faire ce [null,null,null,...row[0]]qui n'est pas la bonne façon de le faire à mon avis.
  • Je vous conseille de vous débarrasser de appendRowet nullpuisque vous souhaitez coller les données à partir de la deuxième colonne . Par conséquent, utilisez à la setValues()place.

Remplacer:

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

avec:

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


Solution complète:

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

Pourquoi Ljava.lang.Object?

Parce que vous utilisez l'ancien runtime Rhino qui a été écrit en Java. Par conséquent, lorsque quelque chose d'inattendu se produit, vous avez un aperçu de l'infrastructure sur laquelle GAS est construit. Désormais, le java.lang.objectest une classe de base en Java à partir de laquelle d'autres objets, y compris des tableaux, sont dérivés.

Étant donné que le appendRowseul paramètre de la signature de méthode accepte un tableau unidimensionnel de valeurs, votre row[0], qui contient un tableau (voir quelle getvaluesméthode retourne), l'a fait dans la feuille comme une balise de chaîne indiquant qu'il s'agissait d'un objet à l'exécution.

Que faire dans Rhino?

Toutes les solutions dépendent de la prise [ null ]comme matrice de base et en utilisant concatpour ajouter le reste de la première rangée, quelque chose comme ceci: [ null ].concat(row[0]). Vous pouvez également utiliser pushavec une simple forboucle pour de meilleures performances.

Que faire en V8 0 ?

Comme l'autre réponse mentionnée, votre meilleur pari est la syntaxe de propagation . Vous pouvez également faire a push(...row[0])pour éviter la concaténation de tableaux (puisque vous utilisez et supprimez immédiatement la copie résultant de [ null, ...row[0] ]).


0 Consultez la documentation officielle sur la migration vers la V8 pour profiter des nouvelles fonctionnalités linguistiques et une vitesse améliorée.

3 AmitAgarwal Sep 28 2020 at 18:18

La rowvariable contient un tableau, vous devez donc utiliser l'opérateur de diffusion avecappendRow

Remplacer:

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

avec:

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

Assurez-vous que votre projet est activé pour l'exécution de Chrome V8.