appendRow возвращает [Ljava.lang.Object; @ вместо значений

Sep 28 2020

Я хочу скопировать отправленные формы на другой лист, чтобы скопированные данные можно было редактировать, не затрагивая исходные отправленные данные.

У меня такой код:

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будет нормально, но я хочу, чтобы информация была скопирована в столбец, отличный от первого.

Ответы

3 Marios Sep 28 2020 at 18:30

Пояснение:

  • Подход использования 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);
}
4 OlegValter Sep 28 2020 at 18:31

Почему 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, чтобы воспользоваться преимуществами новых языковых функций и повышенной скоростью.

3 AmitAgarwal Sep 28 2020 at 18:18

rowПеременная содержит массив , так что вы должны использовать оператор с расширеннымappendRow

Заменить:

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

с участием:

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

Убедитесь, что ваш проект поддерживает среду выполнения Chrome V8.