AppScript: «количество столбцов в данных не соответствует количеству столбцов в диапазоне». Метод setValues ​​неправильно читает массив? - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь автоматизировать сбор телефонных номеров из API в Google Sheet с помощью скрипта приложения. Я могу получить данные и поместить их в массив со следующим кодом:

  const options = {
    method: 'GET',
    headers: {
      Authorization: 'Bearer XXXXXXXXXXXXXXX',
      Accept: 'Application/JSON',
  }
  };
var serviceUrl = "dummyurl.com/?params";
 var data=UrlFetchApp.fetch(serviceUrl, options);
  if(data.getResponseCode() == 200) {
   var response = JSON.parse(data.getContentText());
    if (response !== null){
      var keys = Object.keys(response.call).length;
      var phoneArray = [];
      for(i = 0; i < keys; i++) {
           phoneArray.push(response.call[i].caller.caller_id);
      }

Это работает, как и ожидалось, - оно получает вчерашние значения идентификатора вызывающего абонента из определенной маркетинговой кампании из моего API. Далее я хочу импортировать эти данные в столбец в моей электронной таблице. Для этого я использую метод setValues ​​следующим образом:

      Logger.log(phoneArray);
      var arrayWrapper = [];
      arrayWrapper.push(phoneArray);
      Logger.log(arrayWrapper);

      for(i = 0; i < keys; i++) {
        var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
        var cell = sheet.getRange("A8");
        cell.setValues(arrayWrapper);


      }
    }
 }
}

Я знаю, что мне нужно, чтобы длина моего массива была равна длине выбранного диапазона ячеек на моем листе. Однако, я получаю конфликтующие ошибки в зависимости от длины, которую я установил для моего метода getRange. Если я установлю его на одну ячейку, как вы видите выше, я получу ошибку:

Количество столбцов в данных не соответствует количеству столбцов в диапазоне. У данных есть 8, но у диапазона есть 1.

Однако, если я установлю длину моего диапазона на 8 (или любое значение, кроме 1), я получу ошибку:

Количество столбцов в данных не соответствует количеству столбцов в диапазоне. У данных есть 1, но диапазон имеет 8.

Как видите, ошибка меняет значения. Теперь у меня есть соответствующее количество столбцов в диапазоне, но мой сценарий находит только 1 ячейку данных. Когда я проверяю журнал, я вижу, что мой 2D-массив выглядит нормально в обоих случаях - 8 телефонных номеров в массиве, помещенном в другой массив.

Что вызывает эту ошибку? Я не могу найти ссылку на подобные ошибки в SO или где-либо еще.

Также, пожалуйста, обратите внимание, что я знаю, что этот код немного шаткий (странные переменные и два для циклов for, которые можно было бы сделать). Я устранял это в течение пары часов и первоначально использовал setValue вместо setValues. При попытке отладки все было разбито и много перемещалось.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Итак, я разобрался, как заставить это работать, хотя я не могу говорить с , почему возникает ошибка, или, скорее, почему кто-то получает обратные сообщения об ошибках в зависимости от значения setRange.

Вместо того, чтобы помещать весь список значений из API в phoneArray, я структурировал свой первый цикл for, чтобы сбросить значение phoneArray для каждого цикла и передать массив значений в мой arrayWrapper, например:

for(i = 0; i < keys; i++) {
        var phoneArray = [];
        var phoneNumber = response.call[i].caller.caller_id;
        phoneNumber = phoneNumber.replace(/-/g,'');
        phoneArray.push(phoneNumber);
        arrayWrapper.push(phoneArray);
      }

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

[[1235556789],[0987776543],[0009872345]]

Вместо того, что у меня было раньше, что было примерно так:

[[1235556789,0987776543,0009872345]]

Может показаться, что этокак метод setValues ​​хочет структурировать свои данные, хотя документация предлагает иное.

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

0 голосов
/ 24 октября 2019
  • Размер вашего диапазона - одна строка и несколько столбцов
  • Если вы поместите массив в другой массив, размер будет [[...],[...],[...]] - т.е. у вас есть один столбец и несколько строк
  • Вместо этого вам нужна одна строка и несколько столбцов: [[...,...,...]]
  • Для этого вам необходимо создать двумерный массив и поместить все записи в первую строку вашего массива: phoneArray[0]=[]; phoneArray[0].push(...);

Образец:

  var phoneArray = [];
  phoneArray[0]=[];
  for(i = 0; i < keys; i++) {
        var phoneNumber = response.call[i].caller.caller_id;
        phoneNumber = phoneNumber.replace(/-/g,'');
        phoneArray[0].push(phoneNumber);
      }
  var range = sheet.getRange(1,8,1, keys);
  range.setValues(phoneArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...