let mysteryArr = [["question1","","","","","","","",""]
,["apple","banana","cantalope","date","grapes","apricot","tangerine","orange","pineapple","prune"]
,[24,16,8,20,8,8,4,16,12,4]]
let maRows, maCols;
if (mysteryArr.length != '') {
maRows = mysteryArr.length;
console.info('num rows: ' + maRows);
} else {
console.info('No array');
return;
}
for (i = 0 ; i < maRows ; i++ ) {
if (mysteryArr[i].length != '') {
maCols = mysteryArr[0].length;
console.info('num cols in row ' + i + ' is ' + maCols);
console.info(JSON.stringify(mysteryArr[0] ) );
} else {
console.info('Array was 1D');
return;
}
}
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Sheet1');
if ( sheet == '' ) {
ss.insertSheet('Sheet1');
} else {
sheet.clear();
}
Детали сообщения Исключение: количество столбцов в данных не соответствует количеству столбцов в диапазоне. В данных 9, но в диапазоне 10. (строка 47, файл "array2Sheet1")
Как они оба могут быть правдой? Как правильно определить размеры неизвестного массива и загрузить его в электронную таблицу?
Ваша отладка неверна. Должно быть maCols = mysteryArr[i].length;
не [0]
Спасибо - я был так осторожен!
Решение:
В первой строке ваших данных есть элементы 9
, но в ней должно быть 10
, как и в двух других строках. Добавление нового элемента решит проблему:
let mysteryArr = [["question1","","","","","","","","",""] // a new "" is added here
,["apple","banana","cantalope","date","grapes","apricot","tangerine","orange","pineapple","prune"]
,[24,16,8,20,8,8,4,16,12,4]]
const shtRng = sheet.getRange(1, 1, mysteryArr.length, mysteryArr[0].length);
shtRng.setValues(mysteryArr);
Проблема:
Вы также можете увидеть проблему в длинах.
mysteryArr[0].length
имеет длину 9
.Но наибольший размер в вашем массиве равен 10
, потому что другие строки содержат 10
элементов:
mysteryArr[1].length
имеет длину 10
,mysteryArr[2].length
имеет длину 10
.setValues
будет считать увеличенный размер правильным и, следовательно, несоответствие. Каждая строка в данных должна иметь одинаковую длину.
22 декабря 2020 г., 15:38:40 Отладка, количество строк: 3 22 декабря 2020 г., 15:38:40 Отладка, количество столбцов в строке 0 равно 9 22 декабря 2020 г., 15:38:40 Отладка ["question1 ","","","","","","","",""] 22 декабря 2020 г., 15:38:40 Число столбцов отладки в строке 1 равно 9 22 декабря 2020 г., 15:38:40 Debug ["question1","","","","","","","",""] 22 декабря 2020 г., 15:38:40 Debug num cols в строке 2 — 9. 22 декабря 2020 г., 15:38:40 Отладка ["вопрос1","","","","","","","",""] Используемый код для определения длина каждой строки, и все они были 9
setValues будет предполагать, что увеличенный размер является правильным, и, следовательно, несоответствие. Это неверно. Нет никаких предположений. Он просто перебирает предоставленный массив от первого до последнего. Однако диапазон остается постоянным = аргументы, предоставленные getRange()
. Обратите внимание, что OP исключил/изменил/перепутал сообщения об ошибках, вызывающие это неверное предположение.
@TheMaster, мы говорим то же самое. Он будет перебирать каждую строку. Если строка имеет другой размер, чем следующая (следовательно, строки с разными размерами), сценарий завершится ошибкой. ОП изменил свой вопрос. Я предоставил решение, которое работает для его первоначального вопроса. Теперь он добавил новый код, который генерирует новую ошибку. Не стесняйтесь помочь ему, если хотите. Я не думаю, что я должен делать.
Возможно Вы правы. Прочитав ваш ответ еще раз, я, возможно, неправильно его истолковал. Благодаря запутанным изменениям ОП.
Согласно документам Google — range.setValues — размер двумерного массива должен соответствовать размеру диапазона.
mysteryArr[i]
должны иметь одинаковую длину для всех i
.
22 декабря 2020 г., 15:38:40 Отладка, количество строк: 3 22 декабря 2020 г., 15:38:40 Отладка, количество столбцов в строке 0 равно 9 22 декабря 2020 г., 15:38:40 Отладка ["question1 ","","","","","","","",""] 22 декабря 2020 г., 15:38:40 Число столбцов отладки в строке 1 равно 9 22 декабря 2020 г., 15:38:40 Debug ["question1","","","","","","","",""] 22 декабря 2020 г., 15:38:40 Debug num cols в строке 2 — 9. 22 декабря 2020 г., 15:38:40 Отладка ["вопрос1","","","","","","","",""] Используемый код для определения длина каждой строки, и все они были 9
@L.Klein в цикле for, который вы используете для отладки maCols = mysteryArr[0].length
, означает, что вы всегда регистрируете результат первого элемента mysteryArr
Выравнивание длины всех строк массива:
function equalize(arr) {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
let m=0;
arr.forEach(r=>{if (r.length>m)m=r.length;});
let orr=arr.map(r=>{while(r.length<m){r.push('');}return r;});
sh.getRange(1,1,orr.length,m).setValues(orr);
}
setValues() требует прямоугольного массива