DataValidation на основе скрипта не получает все значения (таблицы) - PullRequest
0 голосов
/ 06 мая 2020

Этот код работал, и хотя я не припомню, чтобы менял что-либо в структуре, он частично перестал работать. Когда я выбираю элемент в ячейке W4, он, по-видимому, дает мне только первый вариант из другого листа в столбце C, связанный с этим элементом, в то время как в раскрывающемся списке должно быть около 04 элементов. Я не могу найти недостаток:

function onEdit(){
  var tabLists = "ArquivoItens";
  var tabValidation = "EditarItem";
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);
  var activeCell = ss.getActiveCell();

  //It checks if the active cell is where the product name is
  if(activeCell.getColumn() == 23 && activeCell.getRow() == 4 && ss.getSheetName() == tabValidation){
    //if it is, it clears the Versão cell, so you can choose the ones related to the product of choice.
    activeCell.offset(0, 6).clearContent().clearDataValidations();

    //specifies the data range where the Product and the related field you want filtered is on
    var makes = datass.getRange(2, 1, datass.getLastRow(), 3).getValues();
    Logger.log(makes);

    //this is what I need to study - map function
    var searchArray = makes.map(function(e){return e[1];});
    var makeIndex = searchArray.indexOf(activeCell.getValue());
    Logger.log(searchArray);

    //if anything on B (where desired column data is) is found related to A, where the product sits
    if(makeIndex != -1){
    //push found items to the datavalidation list
      var validationRange = datass.getRange("C" + (2+makeIndex));
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 6).setDataValidation(validationRule);
     }
  } 
}

Большое спасибо за помощь в создании нужных мне решений при изучении тонны на js.

Ура,

Ответы [ 2 ]

1 голос
/ 06 мая 2020

indexOf() находит только первый экземпляр ключа поиска

Если вы ожидаете, что activeCell.getValue() будет присутствовать более одного раза, вам нужно либо реализовать al oop, где вы вызываете indexOf() multiple раз или - проще - используйте метод скрипта приложений createTextFinder (). findAll () .

Кроме того, если интересующие вас значения не содержатся в соседнем диапазоне, вы не можете использовать requireValueInRange(). Вместо этого используйте requireValueInList () .

Пример:

  ...
  if(activeCell.getColumn() == 23 && activeCell.getRow() == 4 && ss.getSheetName() == tabValidation){
    var makes = datass.getRange(2, 1, datass.getLastRow(), 3).getValues();
    var validationList = [];
    var searchArray = datass.getRange(2, 2, datass.getLastRow(), 1).createTextFinder(activeCell.getValue()).findAll();
    for(var i = 0; i < searchArray.length; i++){
      var row = searchArray[i].getRow();
      var Cvalue = makes[row-1][2];
      validationList.push(Cvalue);      
    }
    if(validationList.length > 0){
      var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(validationList).build();
      activeCell.offset(0, 6).setDataValidation(validationRule);
    }
  }
  ...
0 голосов
/ 12 мая 2020

Мои ограниченные знания не позволяют мне играть с расширенными сценариями, поэтому я искал другой подход, и вот как я в итоге заставил это работать:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();

  var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ArquivoItens");
  var versionList = new Array();
  var activeCell = ss.getActiveCell();
  if(activeCell.getColumn() == 23 && activeCell.getRow() == 4 && ss.getSheetName() == "EditarItem"){
    activeCell.offset(0, 6).clearContent().clearDataValidations();

    var dataRng = dataSheet.getSheetValues(2, 2, dataSheet.getLastRow(), 2);

    for (var i = 0; i < dataRng.length; i++){
    if(dataRng[i].indexOf(activeCell.getValue())!=-1){
    versionList.push(dataRng[i][1])
    }
    }
    var validation = SpreadsheetApp.newDataValidation();
    validation.setAllowInvalid(false);
    validation.requireValueInList(versionList, true);
    activeCell.offset(0, 6).setDataValidation(validation.build());

  }
}

Большое спасибо за вашу помощь !

...