Как вы отфильтровываете продукты из списка продуктов, основываясь на 2 требованиях? - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать скрипт, который отфильтровывает товары из списка из более чем 100 000 товаров. Требуется отфильтровать недоступные товары и товары из категорий, которые я не могу включить sh. У меня есть 2 листа, один со списком продуктов, а другой со списком категорий с утверждениями истина / ложь, когда они должны быть включены. Мой код до сих пор выглядит следующим образом:

  function deleteUnavailable() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var rss = ss.getSheetByName("Kategorier");
  var rRows = rss.getDataRange();
  var rNumRows = rRows.getNumRows();
  var rValues = rRows.getValues();

  var ass = ss.getSheets()[0];
  var aRows = ass.getDataRange();
  var aNumRows = aRows.getNumRows();
  var aValues = aRows.getValues();

  var resultArray = [];

  for (var i = 1; i <= aNumRows -1; i++) {
    var keep = true;

    for (var j = 1; j <= rNumRows -1; j++) {

      if (aValues[i][3] == rValues[j][0]) {
        if (rValues[j][2] && aValues[i][9] == "JA") {break ;}
        else keep = false ; break ;
      }

    }
    if (keep) {
      resultArray.push(aValues[i]);
    }
  }
  ass.clear();
  ass.getRange(2, 1, resultArray.length, resultArray[0].length).setValues(resultArray);
}

Попытка получить этот код:

    for (var i = 1; i <= aNumRows -1; i++) {
    var keep = true;

    for (var j = 1; j <= rNumRows -1; j++) {

      if (aValues[i][3] == rValues[j][0]) {
        if (rValues[j][2] && aValues[i][9] == "JA") {break ;}
        else keep = false ; break ;
      }

    }
    if (keep) {
      resultArray.push(aValues[i]);
    }
  }

Чтобы скопировать продукты и опубликовать их с этим:

ass.clear();
ass.getRange(2, 1, resultArray.length, resultArray[0].length).setValues(resultArray);

Странно, использование этого кода, но с разными местами размещения, работает в моих тестовых листах, но не в этом. Может кто-нибудь сказать мне, почему этот код оставляет некоторые продукты нетронутыми, когда их условия должны быть ЛОЖНЫМИ в моем заявлении IF?

Ответы [ 2 ]

0 голосов
/ 10 января 2020

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

  var rValues = rRows.getValues();
  var aValues = aRows.getValues();

// Create a pojo hash of information we should keep from rValues
// We care about matching the value in columns A (0) if C (2) is truthy.
const shouldKeep = rValues.slice(1) // skip the header row
  .reduce(function (hash, row) {
    if (row[2]) {
      // Column C is truthy, so store the value from column A
      hash[row[0]] = true;
    }
    return hash;
  }, {});

// Inspect all the data rows to see if the compare column D has a 
// value in the hash, and if so, that the other column J has the value "JA".
const rowsToKeep = aValues.slice(1)
  .filter(function (row) {
    return (
      // The tenth column must have the value "JA".
      row[9] === "JA"
        &&
      // The fourth column's value must be in our hash
      shouldKeep.hasOwnProperty(row[3])
    );
  });
// Do something with `rowsToKeep`

Приведенный выше подход также удаляет вложенное значение для l * 1006. *, что должно значительно улучшить производительность сценария по мере увеличения размера листов rValues ​​и aValues, поскольку для построения ha sh.

вам нужно всего лишь l oop rValues.
0 голосов
/ 10 января 2020

Оказывается, мой код работал нормально. Были некоторые несоответствия с информацией, с которой он пытался работать, из-за чего код думал, что все в порядке. : P

...