appendRow zwraca [Ljava.lang.Object; @ zamiast wartości

Sep 28 2020

Chcę skopiować przesłane formularze do innego arkusza, aby skopiowane dane można było edytować bez wpływu na oryginalne zgłoszenia.

Mam następujący kod:

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

Użycie nullin appendRowpomaga przenieść informacje do następnej kolumny. Jednak nie działa to całkiem z row[0]tablicą. Jeśli usunę, nullto działa dobrze, ale chcę, aby informacje zostały skopiowane do kolumny innej niż pierwsza.

Odpowiedzi

3 Marios Sep 28 2020 at 18:30

Wyjaśnienie:

  • Podejście polegające na używaniu nulljest wyraźnie obejściem, a nie przyszłościowym rozwiązaniem. Mianowicie, jeśli chcesz rozpocząć wklejanie z kolumny 4, musisz to zrobić, [null,null,null,...row[0]]co moim zdaniem nie jest właściwym sposobem.
  • Radziłbym się pozbyć, appendRowa nullponieważ chcesz wkleić dane od drugiej kolumny . Dlatego użyj setValues()zamiast tego.

Zastąpić:

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

z:

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


Kompletne rozwiązanie:

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

Dlaczego Ljava.lang.Object?

Ponieważ używasz starszego środowiska wykonawczego Rhino, które zostało napisane w języku Java. Dlatego też, gdy dzieje się coś nieoczekiwanego, można rzucić okiem na infrastrukturę, na której zbudowany jest GAS. Teraz java.lang.objectjest klasą bazową w Javie, z której pochodzą inne obiekty, w tym tablice.

Ponieważ appendRowjedyny parametr sygnatury metody akceptuje jednowymiarową tablicę wartości, your row[0], który zawiera tablicę (zobacz, która getvaluesmetoda zwraca), trafił do arkusza jako znacznik typu string wskazujący, że był to obiekt w czasie wykonywania.

Co robić w Rhino?

Wszystkie rozwiązania zależą biorąc [ null ]jako macierzy podstawowej i stosując concatsię do dołączania do końca pierwszego rzędu, coś takiego: [ null ].concat(row[0]). Możesz również użyć pushprostej forpętli, aby uzyskać lepszą wydajność.

Co robić w V8 0 ?

Jak wspomniano w drugiej odpowiedzi, najlepszym rozwiązaniem jest składnia spreadu . Możesz także zrobić a, push(...row[0])aby uniknąć łączenia tablic (ponieważ natychmiast używasz i odrzucasz kopię wynikającą z [ null, ...row[0] ]).


0 Zobacz oficjalne dokumenty dotyczące migracji do V8, aby skorzystać z nowych funkcji językowych i zwiększonej szybkości.

3 AmitAgarwal Sep 28 2020 at 18:18

rowZmienna zawiera tablicę więc należy użyć operatora posmarowaćappendRow

Zastąpić:

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

z:

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

Upewnij się, że Twój projekt obsługuje środowisko wykonawcze Chrome V8.