appendRow возвращает [Ljava.lang.Object; @ вместо значений
Я хочу скопировать отправленные формы на другой лист, чтобы скопированные данные можно было редактировать, не затрагивая исходные отправленные данные.
У меня такой код:
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]]);
Использование nullin appendRowпоможет вам переместить информацию в следующий столбец. Однако с row[0]массивом это не совсем работает . Если я удалю, все nullбудет нормально, но я хочу, чтобы информация была скопирована в столбец, отличный от первого.
Ответы
Пояснение:
- Подход использования
nullявно является обходным путем, а не надежным решением. А именно, если вы хотите начать вставку с столбца 4, вам придется сделать,[null,null,null,...row[0]]что, на мой взгляд, не является правильным способом. - Я бы посоветовал вам избавиться от
appendRowи,nullпоскольку вы хотите вставить данные из второго столбца и далее. Поэтому используйтеsetValues()вместо этого.
Заменить:
tracker.appendRow([null,row[0]]);
с участием:
tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);
Полное решение:
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);
}
Почему Ljava.lang.Object?
Потому что вы используете старую среду выполнения Rhino, написанную на Java. Следовательно, когда случается что-то неожиданное, вы получаете представление об инфраструктуре, на которой построен GAS. Теперь java.lang.objectэто базовый класс в Java, от которого происходят другие объекты, включая массивы.
Поскольку appendRowединственный параметр сигнатуры метода принимает одномерный массив значений, ваш row[0], который содержит массив (посмотрите, какой getvaluesметод возвращает), внесен в лист в виде строкового тега, указывающего, что это был объект во время выполнения.
Что делать в Rhino?
Все решения зависят от принятия в [ null ]качестве базового массива и использовать , concatчтобы добавить остальную часть первой строки, что - то вроде этого: [ null ].concat(row[0]). Вы также можете использовать pushпростой forцикл для повышения производительности.
Что делать в V8 0 ?
Как уже упоминалось в другом ответе, лучше всего использовать синтаксис распространения . Вы также можете выполнить a, push(...row[0])чтобы избежать объединения массивов (поскольку вы сразу используете и отбрасываете полученную копию [ null, ...row[0] ]).
0 См. Официальную документацию о том, как перейти на V8, чтобы воспользоваться преимуществами новых языковых функций и повышенной скоростью.
rowПеременная содержит массив , так что вы должны использовать оператор с расширеннымappendRow
Заменить:
tracker.appendRow([null,row[0]]);
с участием:
tracker.appendRow([null,...row[0]]);
Убедитесь, что ваш проект поддерживает среду выполнения Chrome V8.