Скрипт приложения Google, загружающий массив неизвестных размеров в электронную таблицу, получает противоречивые сообщения

  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")

Как они оба могут быть правдой? Как правильно определить размеры неизвестного массива и загрузить его в электронную таблицу?

setValues() требует прямоугольного массива

Cooper 22.12.2020 22:51

Ваша отладка неверна. Должно быть maCols = mysteryArr[i].length; не [0]

TheMaster 22.12.2020 23:25

Спасибо - я был так осторожен!

L.Klein 22.12.2020 23:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
77
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Решение:

В первой строке ваших данных есть элементы 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

L.Klein 22.12.2020 23:15

setValues ​​будет предполагать, что увеличенный размер является правильным, и, следовательно, несоответствие. Это неверно. Нет никаких предположений. Он просто перебирает предоставленный массив от первого до последнего. Однако диапазон остается постоянным = аргументы, предоставленные getRange(). Обратите внимание, что OP исключил/изменил/перепутал сообщения об ошибках, вызывающие это неверное предположение.

TheMaster 22.12.2020 23:31

@TheMaster, мы говорим то же самое. Он будет перебирать каждую строку. Если строка имеет другой размер, чем следующая (следовательно, строки с разными размерами), сценарий завершится ошибкой. ОП изменил свой вопрос. Я предоставил решение, которое работает для его первоначального вопроса. Теперь он добавил новый код, который генерирует новую ошибку. Не стесняйтесь помочь ему, если хотите. Я не думаю, что я должен делать.

Marios 22.12.2020 23:37

Возможно Вы правы. Прочитав ваш ответ еще раз, я, возможно, неправильно его истолковал. Благодаря запутанным изменениям ОП.

TheMaster 22.12.2020 23:40

Согласно документам 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 22.12.2020 23:15

@L.Klein в цикле for, который вы используете для отладки maCols = mysteryArr[0].length, означает, что вы всегда регистрируете результат первого элемента mysteryArr

RayGun 22.12.2020 23:33

Выравнивание длины всех строк массива:

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);
}

Другие вопросы по теме