Попытка записать список именованных диапазонов в моем Листе Google на отдельный лист - PullRequest
0 голосов
/ 19 марта 2020

Я новичок в кодировании. У меня есть Google Sheet, который включает в себя 314 именованных переменных диапазона. Я пытаюсь распечатать список всех названных диапазонов на отдельном листе в моей рабочей тетради. Ошибка, которую я получаю, сбивает с толку. Он читает

Исключение: количество строк в данных не соответствует количеству строк в диапазоне. У данных есть 1, но диапазон имеет 314. (строка 47, файл "Код")

Вот мой код. Я не уверен, что мне не хватает?

function myFunction() {

//Declaring the Active Sheet
var mySheet = SpreadsheetApp.getActiveSheet();

//Declaring Array 
var myArray = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();

//Clearing a range on the Google Sheet
mySheet.getRange('Named Ranges!A1:A314').clearContent();

//Printing Array to Google Sheet
mySheet.getRange('Named Ranges!A1:A314').setValues([myArray]);  

}

1 Ответ

0 голосов
/ 19 марта 2020

Метод getNamedRanges() возвращает вам объекты диапазона, а не их имена, а setValues работает только в том случае, если измерения значений соответствуют измерению диапазона

  • Для извлечения диапазонов имен вам нужно перебрать все объекты диапазона и извлечь имя каждого отдельного диапазона с помощью getName()
  • [myArray] будет иметь содержимое [[range1, range2, ...]], которое будет интерпретировано как вложенный массив будет несколько столбцов и только одна строка
  • Чтобы создать массив с несколькими столбцами и только одну строку, вы можете сделать следующее:
  var myRanges = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();
  Logger.log(myRanges);
  var myArray = [];
  for (var i = 0; i< myRanges.length; i++){
    myArray[i] = [];
    myArray[i].push(myRanges[i].getName());
  }
  • Учитывая, что ваш лист mySheet всегда активный лист, вы можете указать другое имя листа в getRange(). Вместо этого укажите
SpreadsheetApp.getActiveSpreadsheet().getRange('Named Ranges!A1:A314')

или, что еще лучше, динамически:

var myRangeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Named Ranges');
myRangeSheet.getRange(1,1, myArray.length, 1)
  • Поскольку число строк и столбцов в данных должно соответствовать количеству строк в диапазон, последний подход к последнему позволяет динамически оценивать номер строки, соответствующий количеству записей списка, независимо от количества именованных диапазонов.
  • Нет необходимости clearContent() перед перезаписью возможные данные с setValues

Пример изменения вашего кода:

function myFunction() {
  var myRanges = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();
  var myArray = [];
  for (var i = 0; i< myRanges.length; i++){
    myArray[i] = [];
    myArray[i].push(myRanges[i].getName());
  }
  var myRangeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Named Ranges');
  myRangeSheet.getRange(1,1, myArray.length, 1).setValues(myArray);    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...