#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 массива.