Как l oop через все листы, чтобы получить значения ячеек для создания раскрывающегося списка? - PullRequest
1 голос
/ 05 августа 2020

У меня есть электронная таблица Google Sheets с несколькими листами, содержащими одинаковые заголовки столбцов. Я пытаюсь извлечь данные из диапазона «A2: A» со всех листов и создать раскрывающийся список со всеми значениями ячеек, но на данный момент он дает мне только раскрывающийся список со значениями ячеек из последнего листа.

function getCategoryList() {
   var spreadsheet = SpreadsheetApp.getActive();
   var lastrow = spreadsheet.getActiveSheet().getLastRow()
  
  
   var dynamicList = spreadsheet.getRange('A2:A' + lastrow); 
   var arrayValues = dynamicList.getValues();

   var rangeRule = SpreadsheetApp.newDataValidation().requireValueInList(arrayValues);

   console.log(arrayValues)

   spreadsheet.getRange('Main!C4').setDataValidation(rangeRule);

  
}


function doForAllTabs() {
  var spreadsheet = SpreadsheetApp.getActive();
     var lastrow = spreadsheet.getActiveSheet().getLastRow()
  var allSheets = spreadsheet.getSheets();
 
  
  allSheets.forEach(function(sheet) {
    if(sheet.getSheetName() !== "Main") {
      sheet.activate();
      
      getCategoryList()
      
    }    
  })
}

1 Ответ

2 голосов
/ 05 августа 2020

С текущим кодом проверка данных записывается в ячейку Main! C4 после обработки одного листа внутри листов-l oop. Другими словами, проверка данных перезаписывается снова и снова. Что необходимо, так это объединение значений в массив, который затем записывается в Main! C4. Посмотрите, поможет ли это.

function setDataValidation() {

var ss = SpreadsheetApp.getActive();
var values = allColsA(ss, 'Main', 'A2:A');
ss.getRange('Main!C4').setDataValidation(SpreadsheetApp.newDataValidation()
.requireValueInList(values));
}

EDITED, чтобы включить массив с исключенными листами ...

function allColsA(spreadsheet, targetSheetName, range) {
var arr, excluded; 
arr = [[]];
excluded = [targetSheetName, 'Sheet2', 'Sheet3'];
spreadsheet.getSheets().filter(sh => excluded.indexOf(sh.getName()) === -1)
    .forEach((s, i) => {
        arr = arr.concat(s.getRange(range)
                .getValues())
    })
return  arr.filter(String).reduce((a, b) => a.concat(b), []);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...