appendRow zwraca [Ljava.lang.Object; @ zamiast wartości
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
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ć,
appendRowanullponieważ chcesz wkleić dane od drugiej kolumny . Dlatego użyjsetValues()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);
}
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.
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.