Сравнение значений из двух массивов выполняется, но не может оценить

Я провел два полных рабочих дня в поисках форумов и устранении неполадок в целом, но, поскольку я относительно новичок в java, это может быть случай, когда новичок нарушает основы. Если это правда, прошу прощения.

Контекст: экономическое обоснование, для которого я кодирую, требует сравнения записей между двумя отдельными файлами электронных таблиц Google, очень похоже на то, как sql запрашивает две таблицы с использованием первичных и внешних ключей. Для облегчения два диапазона из соответствующих файлов электронных таблиц загружаются в отдельные массивы, а затем поля, действующие как первичные и внешние ключи, сравниваются на соответствие.

Проблема: код выполняется, и, судя по тому, что я наблюдал с помощью отладчика, совпадение должно быть определено, если оператор IF должен был оценить, но оператор IF не может оценить, и поэтому такого соответствия нет. идентифицировано. Я попытался сделать так, чтобы это было легко увидеть в журнале, который будет создан при запуске кода в сопутствующая реконструкция (где i = 2, а совпадающее значение – 32).

Я проверил, что типы данных сравниваемых полей одинаковы в двух электронных таблицах, и поэкспериментировал с разными операторами сравнения в случае, если значения массива были числами с плавающей запятой. Кроме того, я попытался загрузить массивы с помощью цикла for после объявления их с помощью синтаксиса [ [ ],[ ] ] вместо синтаксиса, используемого в сопутствующей реконструкции. И, наконец, я сделал так, чтобы оператор IF правильно вычислялся только тогда, когда аргументы функции вообще не хранятся в массиве. Однако это неудовлетворительное решение из-за упомянутого ниже ограничения.

Ограничения. Обходные пути, исключающие использование массивов, скорее всего, нецелесообразны, если они увеличивают число обращений к серверу, как это было в случае, когда я пытался использовать метод getValue() в единственном числе (вместо метода getValues() во множественном числе). ) для загрузки массива по одному значению за раз. Это явление не будет наблюдаться в сопроводительной реконструкции, поскольку две таблицы, предназначенные для сравнения, находятся в одном файле.

Кроме того, в то время как две серии, загруженные в массив, находятся в соседних столбцах в сопутствующей реконструкции, в моем реальном случае их нет. По этой причине любые обходные пути, объединяющие два метода getValues() в один, скорее всего, также будут непрактичными.

Как будет выглядеть успех: когда переменная с именем «return» перестанет быть неопределенной в журнале после выполнения кода, значит, совпадение было идентифицировано и сохранено!

Дополнительный материал: суть этой проблемы воссоздана для вас в этот Google Sheet для иллюстрации, и я скопирую приведенный ниже код.

function simulation() {

  var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var nameObj = {}
  var nameArray = []
  nameObj.name = thisSheet.getRange(2,1,3,1).getValues();
  nameObj.number = thisSheet.getRange(2,2,3,1).getValues();
  nameArray.push(nameObj);

  var vendorObj = {}
  var vendorArray = []
  vendorObj.vendorName = thisSheet.getRange(2,4,3,1).getValues();
  vendorObj.vendorNumber = thisSheet.getRange(2,5,3,1).getValues();
  vendorArray.push(vendorObj);

  for (var i = 1; i < vendorArray[0].vendorNumber.length + 1; i++) {
    matchOnNumber(nameArray,vendorArray[0].vendorNumber[i - 1]);
  }
}


function matchOnNumber(nameArray, vendorNumber) {
  var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  for (var i = 0; i < nameArray[0].name.length; i++) {
    Logger.log("vendorNumber = " + vendorNumber + ", i = " + i + ", Matched against: " + nameArray[0].number[i]);
    if (nameArray[0].number[i] == vendorNumber) {
      var result = nameArray[0].number[i];
    }
  }
  Logger.log("Result: " + result);
  return result;
}

person Bryton Beesley    schedule 15.09.2016    source источник
comment
Итак, что вы видите в логе?   -  person johnnyaug    schedule 16.09.2016
comment
Добро пожаловать в Stackoverflow. Хорошо задан вопрос!   -  person Robin Gertenbach    schedule 16.09.2016


Ответы (1)


Вы можете исправить это, изменив

if (nameArray[0].number[i] == vendorNumber)

to

if (nameArray[0].number[i][0] == vendorNumber)

Тогда результаты будут undefined, 32 и undefined (что имеет смысл, учитывая, что 23 и 100 отсутствуют в таблице Data for Name Array.

Причина этого в том, что getValues() всегда возвращает двумерный массив строк и столбцов, чтобы однозначно определить расположение данных.

nameArray содержит один элемент (индекс 0), который является nameObj.
nameObj.number получает результат getValues таблицы.
Это якобы вектор-столбец, но с точки зрения скрипта Google Apps это матрица 3x1.
Чтобы получить доступ к фактическому значению, вам нужно сослаться на строку, а затем проиндексировать 0 для единственного доступного столбца.

person Robin Gertenbach    schedule 16.09.2016