Поиск элементов в массиве по определенному тексту и сравнение с другой ячейкой вне массива - PullRequest
0 голосов
/ 21 февраля 2019

Я ищу помощи в сравнении ячейки внутри массива, чтобы сказать конкретное слово, и если это слово произнесено, чтобы проверить, содержит ли другая соответствующая ячейка строку.(В данном случае «Apple» - это конкретное слово, а тип яблока указан как «Золотой».) Я не знаю, сколько там пользователей, так что это помогает также проверять каждого действительного пользователя подряд.

В этом примере я смотрю на пользователей, вводящих три варианта фруктов, и если они задают Apple, Pear, Banana или Plum, они должны заполнить соответствующие ячейки, чтобы сказать, какой тип зависит отбыл ли это их первый, второй или третий выбор.Некоторые из выбранных ключевых слов могут появляться в других вариантах, таких как Apple, которые отображаются в качестве первого варианта для Jessica, но в качестве третьего варианта для John.Нам все равно, появится ли он во втором или третьем варианте.Обращайте внимание только на следующие варианты: Apple должен быть первым выбором, Pear должен быть первым выбором, Banana должен быть вторым выбором, и Plum должен быть третьим выбором.Затем я получу скрипт, который подтвердит, является ли информация истинной или ложной.

Ниже приводится то, на что я ссылаюсь:

Name    Fruit 1 Fruit 2 Fruit 3
Joanne  Pear    Orange  Kiwi
John    Berries Peach   Apple
Juno    Tomato  Grapes  Lemon
Jessica Apple   Banana  Pomegranate


(Type of Apple)  =  Golden  
(Type of Pear)   =  Barley  
(Type of Banana) =      
(Type of Plum)   =  

На изображении выше "Банан" был указан какВторой выбор фруктов Джессики, но там он не заполнен ниже в «Типе банана», так что это должно вернуть false.Если бы в Banana содержалась случайная строка и один из пользователей указывал ее в качестве своего второго выбора, это вернуло бы значение true.

Вот код, который я пробовал, но он постоянно возвращает false, а я - нетзнаю почему:

function validateInfo() {
  var data = SpreadsheetApp.getActive().getSheetByName('Sheet1')
      .getDataRange().getValues();
  Logger.log(data[8][2]);
  var valid = true,
      notBlank;
  data.slice(8).every(function(row) {
    notBlank = row[1].toString().length;
    if (notBlank) {
      valid = (row[2] === 'Apple' && data[0][6].toString().length > 0 || row[2] === 'Pear' && data[1][6].toString().length > 0  || row[3] === 'Banana' && data[2][6].toString().length > 0 || row[4] === 'Plum' && data[3][6].toString().length > 0);
    }
    return (notBlank && valid);
  });
  Logger.log(valid);
} 

Ссылка на лист .

1 Ответ

0 голосов
/ 24 февраля 2019

Проблема

Код OP постоянно возвращал false.Кроме того, основываясь на моем собственном тестировании, код не оценивал каждого человека и не оценивал выбор фруктов точно.

Причина

  • Похоже, что every(function(row) не работал эффективно.Это было заменено простым циклом «для»
  • Было три варианта фруктов, но оператор IF не оценивал каждый вариант эффективно.Поскольку в любом из трех полей может присутствовать любой выбор фруктов, значение каждого поля фруктов необходимо оценивать по основному списку фруктов.

Код

  • Было неясно, какие действия необходимо предпринять для обновления любых недостающих сортов фруктов.Я просто вставил «TBA» в поле, OP может выбрать предпочитаемое действие.
  • Для каждой строки есть четыре набора операторов IF.Я не уверен, что это самое эффективное решение, но оно действительно работает .

function so5480624202() {

  // setup spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get data range and values
  var range = ss.getSheetByName('Sheet1').getDataRange();
  //Logger.log("DEBUG: the range is "+range.getA1Notation());//DEBUG
  var data = range.getValues();

  // define variables and existing values for the fruit types
  var appletype = data[0][6];
  var peartype = data[1][6];
  var bananatype = data[2][6];
  var plumtype = data[3][6];
  //Logger.log("DEBUG: apple type: "+appletype+"("+appletype.toString().length+"), pear type: "+peartype+"("+peartype.toString().length+"), banana type: "+bananatype+"("+bananatype.toString().length+"), plum type:"+plumtype+"("+plumtype.toString().length+")");//DEBUG

  // define variables
  var valid = true,
    notBlank;

  // slice the data from the eight row to thr end.
  var newdata = data.slice(8);
  //Logger.log("DEBUG: newdata length: "+newdata.length);//DEBUG

  // Loop through the sliced rows
  for (x = 0; x < newdata.length; x++) {
    // check the length of the name; if name - 0, then row is blank
    notBlank = newdata[x][1].toString().length;

    // define the fruittypes for this person
    var fruittype1 = newdata[x][2];
    var fruittype2 = newdata[x][3];
    var fruittype3 = newdata[x][4];
    // Logger.log("DEBUG: Loop#:"+x+" Name:"+newdata[x][1]+" Fruits: "+fruittype1+", "+fruittype2+", and "+fruittype3);//DEBUG

    // if there is a name
    if (notBlank) {

      // test for "Apple"
      if (fruittype1 == "Apple" || fruittype2 == "Apple" || fruittype3 == "Apple") {

        // the Person has chosen an Apple
        // Logger.log("DEBUG: there is an apple in this row"); //DEBUG

        // if the appletype has a value
        if (appletype.toString().length > 0) {
          // do nothing
          // Logger.log("DEBUG: there is an entry in the apple type, so do nothing");//DEBUG
        } else {
          //Logger.log("DEBUG: there is NO  entry in the apple type, so something");//DEBUG
          data[0][6] = "TBA";
        }
      } else {
        // Logger.log("DEBUG: there was no Apple chosen in this row - ignore Apple Type\n"); //DEBUG
      }

      // test for Pear
      if (fruittype1 == "Pear" || fruittype2 == "Pear" || fruittype3 == "Pear") {

        // the Person has chosen a Pear
        // Logger.log("DEBUG: there is a pear in this row");//DEBUG

        // if the peartype has a value
        if (peartype.toString().length > 0) {
          // do nothing
          // Logger.log("DEBUG: there is an entry in the Pear type, so do nothing\n");      
        } else {
          // Logger.log("DEBUG: there is NO  entry in the pear type, so something");// DEBUG
          data[1][6] = "TBA";
        }
      } else {
        // Logger.log("DEBUG: there was no pear chosen in this row - ignore Pear Type\n");//DEBUG
      }


      // test for Banana
      if (fruittype1 == "Banana" || fruittype2 == "Banana" || fruittype3 == "Banana") {
        // the Person has chosen a Banana
        // Logger.log("DEBUG: there is a banana in this row");//DEBUG

        // if the banana type has a value
        if (bananatype.toString().length > 0) {
          // do nothing  
          // Logger.log("DEBUG: there is an entry in the banana type, so do nothing\n");      
        } else {
          // Logger.log("DEBUG: there is NO  entry in the banana type, so something"); //DEBUG
          data[2][6] = "TBA";
        }
      } else {
        // Logger.log("DEBUG: there was no banana chosen in this row - ignore Banana Type\n");
      }


      // Test for Plum 
      if (fruittype1 == "Plum" || fruittype2 == "Plum" || fruittype3 == "Plum") {
        // the Person has chosen a Plum
        //Logger.log("DEBUG: there is a plum in this row");//DEBUG

        // if the plum type has a value
        if (plumtype.toString().length > 0) {
          // do nothing
          // Logger.log("DEBUG: there is an entry in the plum type, so do nothing\n");      
        } else {
          // Logger.log("DEBUG: there is NO  entry in the plum type, so something"); //DEBUG
          data[3][6] = "TBA";
        }
      } else {
        // Logger.log("DEBUG: there was no Plus chosen in this row - ignore Plum Type\n");
      }
    } else {
      // Logger.log("this item must be blank");
    }

  }

    // Update values
  range.setValues(data);

}

ADDENDUM Я неправильно понял цель ОП.ОП желает вернуть "false" в целом или вернуть "true", если инструкция выполняется для каждого элемента в массиве. Следующая модификация выполнена исключительно для удовлетворения этого требования.


function so5480624203() {

  // setup spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get data range and values
  var range = ss.getSheetByName('Sheet1').getDataRange();
  //Logger.log("DEBUG: the range is "+range.getA1Notation());//DEBUG
  var data = range.getValues();

  // define variables and existing values for the fruit types
  var appletype = data[0][6];
  var peartype = data[1][6];
  var bananatype = data[2][6];
  var plumtype = data[3][6];
  //Logger.log("DEBUG: apple type: "+appletype+"("+appletype.toString().length+"), pear type: "+peartype+"("+peartype.toString().length+"), banana type: "+bananatype+"("+bananatype.toString().length+"), plum type:"+plumtype+"("+plumtype.toString().length+")");//DEBUG

  // define variables
  var valid = true,
    notBlank;
  var mismatch = 0;
  // slice the data from the eight row to thr end.
  var newdata = data.slice(8);
  //Logger.log("DEBUG: newdata length: "+newdata.length);//DEBUG

  // Loop through the sliced rows
  for (x = 0; x < newdata.length; x++) {
    // check the length of the name; if name - 0, then row is blank
    notBlank = newdata[x][1].toString().length;

    // define the fruittypes for this person
    var fruittype1 = newdata[x][2];
    var fruittype2 = newdata[x][3];
    var fruittype3 = newdata[x][4];
    //Logger.log("DEBUG: Loop#:"+x+" "+newdata[x][1]+" Fruits: "+fruittype1+", "+fruittype2+", and "+fruittype3);//DEBUG

    // if there is a name
    if (notBlank) {
      //if (mismatch !=0) { break;}
      // test for "Apple"
      if (fruittype1 == "Apple" || fruittype2 == "Apple" || fruittype3 == "Apple") {

        // the Person has chosen an Apple
        //Logger.log("DEBUG: there is an apple in this row"); //DEBUG

        // if the appletype has a value
        if (appletype.toString().length > 0) {
          // do nothing
          //Logger.log("DEBUG: there is an entry in the apple type, so do nothing");//DEBUG
        } else {
          //Logger.log("DEBUG: there is NO  entry in the apple type, so something");//DEBUG
          //data[0][6] = "TBA";
          mismatch = 1;
          //Logger.log("there is a mismatch");
          break;
        }
      } else {
        //Logger.log("DEBUG: there was no Apple chosen in this row - ignore Apple Type\n"); //DEBUG
      }

      // test for Pear
      if (fruittype1 == "Pear" || fruittype2 == "Pear" || fruittype3 == "Pear") {

        // the Person has chosen a Pear
        //Logger.log("DEBUG: there is a pear in this row");//DEBUG

        // if the peartype has a value
        if (peartype.toString().length > 0) {
          // do nothing
          //Logger.log("DEBUG: there is an entry in the Pear Variety, so do nothing\n");      
        } else {
          //Logger.log("DEBUG: there is NO  entry in the Pear Variety, so something");// DEBUG
          //data[1][6] = "TBA";
          mismatch = 1;
          //Logger.log("there is a mismatch");
          break;
        }
      } else {
        //Logger.log("DEBUG: there was no pear chosen in this row - ignore Pear Type\n");//DEBUG
      }


      // test for Banana
      if (fruittype1 == "Banana" || fruittype2 == "Banana" || fruittype3 == "Banana") {
        // the Person has chosen a Banana
        //Logger.log("DEBUG: there is a banana in this row");//DEBUG

        // if the banana type has a value
        if (bananatype.toString().length > 0) {
          // do nothing  
          //Logger.log("DEBUG: there is an entry in the banana type, so do nothing\n");      
        } else {
          //Logger.log("DEBUG: there is NO  entry in the banana type, so something"); //DEBUG
          //data[2][6] = "TBA";          
          mismatch = 1;
          //Logger.log("there is a mismatch");
          break;
        }
      } else {
        //Logger.log("DEBUG: there was no banana chosen in this row - ignore Banana Type\n");
      }


      // Test for Plum 
      if (fruittype1 == "Plum" || fruittype2 == "Plum" || fruittype3 == "Plum") {
        // the Person has chosen a Plum
        //Logger.log("DEBUG: there is a plum in this row");//DEBUG

        // if the plum type has a value
        if (plumtype.toString().length > 0) {
          // do nothing
          //Logger.log("DEBUG: there is an entry in the Plum variety, so do nothing\n");      
        } else {
          //Logger.log("DEBUG: there is NO  entry in the Plum variety, so something"); //DEBUG
          //data[3][6] = "TBA";  
          mismatch = 1;
          //Logger.log("there is a mismatch");
          break;
        }
      } else {
        //Logger.log("DEBUG: there was no Plum chosen in this row - ignore Plum Type\n");
      }
    } else {
      //Logger.log("DEBUG: this item must be blank");//DEBUG
    }

  }


  if (mismatch != 0) {
    // there must be a mismatch somewhere
    // return false
    //Logger.log("DEBUG: There was a mis-match somewhere, so return false");//DEBUG
    return false;
  } else {
    // there was no mismatch
    // return true
    //Logger.log("DEBUG: There was NO mis-match anywhere, so return true");//DEBUG
    return true;
  }

}
...