Добавить 5-кратный массив в нижнюю часть n-кратного массива — это Google script

#javascript #arrays #google-apps-script #google-sheets

#javascript #массивы #google-apps-script #google-sheets

Вопрос:

У меня есть два массива, Ary1 имеет n столбцов и длину p, его табличные данные выглядят так

введите описание изображения здесь

Ary2 имеет 5 столбцов и длину q, его табличные данные выглядят следующим образом

введите описание изображения здесь Я выводил данные следующим образом

   sh.getRange(1, 1, Ary1.length, Ary1[0].length).setValues(Ary1);

  sh.getRange(sh.getLastRow() 1, 1, Ary2.length, Ary2[0].length).setValues(Ary2);
  

Я хочу добавить Ary2 в Ary1, чтобы получить результирующий массив длины p q
с табличными данными

введите описание изображения здесь Поэтому мне нужно только один раз вывести данные

Я пробовал

  var result = Ary1.concat(Ary2);
sh.getRange(1,1,result.length,result[0].length).setValues(result);

and

Ary1.push(...Ary2);
sh.getRange(1,1,Ary1.length,Ary1[0].length).setValues(Ary1);

 sh.getRange(1,1,result.length,result[0].length).setValues(result);
  

Но я получаю

 The number of columns in the data does not match the number of columns in the range. The data has 5 but the range has 25.
  

Было бы лучше мутировать Ary1 или Ary2, а затем создать новый массив

Спасибо

Ответ №1:

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

Шаблон 1:

В этом шаблоне используется служба электронных таблиц.

Модифицированный скрипт:

 var Ary1 = ,,,  // Please set the value.
var Ary2 = ,,,  // Please set the value.

if (Ary1[0].length > Ary2[0].length) {
  var len = Ary1[0].length - Ary2[0].length;
  Ary2 = Ary2.map(r => r.concat(Array(len).fill("")));
} else if (Ary1[0].length < Ary2[0].length) {
  var len = Ary2[0].length - Ary1[0].length;
  Ary1 = Ary1.map(r => r.concat(Array(len).fill("")));
}
var values = Ary1.concat(Ary2);
sh.getRange(1, 1, values.length, values[0].length).setValues(values);
  

Шаблон 2:

В этом шаблоне используется API Sheets. При использовании API Sheets не требуется, чтобы длина столбца в массиве была одинаковой.

Модифицированный скрипт:

Перед использованием этого скрипта, пожалуйста, включите Sheets API в расширенных службах Google.

 var spreadsheetId = "###";  // Please set Spreadsheet ID.
var sheetName = "Sheet1";  // Please set sheet name.
var Ary1 = ,,,  // Please set the value.
var Ary2 = ,,,  // Please set the value.
var values = Ary1.concat(Ary2);
Sheets.Spreadsheets.Values.update({values: values}, spreadsheetId, sheetName, {valueInputOption: "USER_ENTERED"});
  

Ссылки:

Комментарии:

1. Привет, Танайке, после настройки api и получения идентификатора листа я получаю сообщение об ошибке The number of columns in the range must be at least 1 при получении values

2. @xyz333 Спасибо за ответ. Я приношу извинения за неудобства. К сожалению, я не могу воспроизвести вашу текущую ситуацию. Потому что, когда я тестировал значения выборки, ошибок не возникало. Это связано с моим плохим навыком. Я глубоко извиняюсь за это. Итак, чтобы правильно понять вашу текущую ситуацию, можете ли вы предоставить образец электронной таблицы, включающий ваш текущий сценарий для воспроизведения вашей проблемы? Этим я хотел бы подтвердить это. Как насчет этого?

3. Я использую ваш первый оператор, цикл. Это работает нормально. Спасибо!. Можете ли вы сказать мне, это быстрее, объединяя два массива и выводя их, а затем выводя оба массива отдельно? Еще раз спасибо

4. @xyz333 Спасибо за ответ. Я рад, что ваша проблема была решена. В этом случае я думаю, что когда значения помещаются в электронную таблицу в виде одного массива путем объединения 2 массивов, стоимость ниже, чем у метода, использующего по отдельности 2 массива.