Почему при использовании скриптов Google Sheets мой оператор if всегда возвращает false при сравнении значений ячеек?

Мне нужно сравнить два значения ячеек и действовать на них, если они разные. Однако мой оператор «if» всегда возвращает false при сравнении содержимого ячеек, и я не могу понять, почему:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet1'); // apply to sheet name only 
  var testvalues = sheet.getRange('A1:A2').getValues(); // array of values to be tested
  var testvalue1 = testvalues[0]; // The contents from A1
  var testvalue2 = testvalues[1]; // The contents from A2
  var test1 = testvalue1 == testvalue2; // True False test
  var test2 = testvalue1 === testvalue2;// True False test
  Browser.msgBox(testvalue1 + " and " + testvalue2 + " being the same is " + test1 + " and " + test2); // Sentence revealing outcome
};

test1 и test2 всегда возвращают false независимо от содержимого ячеек A1 и A2 (пустое, число, текст, другое). Если я отредактирую тестовые значения на это:

  var testvalue1 = "We are the same value";
  var testvalue2 = "We are the same value";

or

  var testvalue1 = testvalues[0];
  var testvalue2 = testvalues[0];

затем внезапно оба теста возвращают True, как и ожидалось. Может кто подскажет, чего мне в этом не хватает, бесит? В настоящее время в A1 и A2 стоит значение 1 (прежде, чем меня спросят об этом).

Конечная цель - использовать границу для разделения различного содержимого ячеек. У меня все остальное работает отлично, но я изолировал проблему от вышеупомянутой концепции.

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


person ChaPPer5    schedule 06.04.2020    source источник
comment
Это сравнение объектов под капотом? Какие бывают типы testvalue1 и testvalue2?   -  person Ollie    schedule 06.04.2020
comment
Отвечает ли это на ваш вопрос? Как сравнивать массивы в JavaScript?   -  person TheMaster    schedule 06.04.2020
comment
getValues() всегда возвращает 2D-массив: [[A1],[A2]]. Связанный вопрос   -  person TheMaster    schedule 06.04.2020


Ответы (2)


Отвечать:

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

Больше информации:

Предположим, что и A1, и A2 содержат строку "THIS". Запуск следующей строки:

var testvalues = sheet.getRange('A1:A2').getValues();

присвоит массив [[THIS], [THIS]] testvalues.

Исправление кода:

Вам нужно изменить:

var testvalue1 = testvalues[0]; // The contents from A1
var testvalue2 = testvalues[1]; // The contents from A2

to:

var testvalue1 = testvalues[0][0]; // The contents from A1
var testvalue2 = testvalues[1][0]; // The contents from A2

Надеюсь, это будет вам полезно!

Использованная литература:

person Rafa Guillermo    schedule 06.04.2020
comment
Спасибо, у меня это работает :) Я знал, что это будет что-то простое, но вам нужно знать это, чтобы знать это! - person ChaPPer5; 07.04.2020

Следующая строка кода неверна, ниже она исправлена.

  var testvalue1 = testvalues[0][0]; // The contents from A1
  var testvalue2 = testvalues[1][0]; // The contents from A2

Изначально вы захватываете всю строку, а не одну ячейку.

person CodeCamper    schedule 06.04.2020
comment
Большое спасибо, у меня это сработало. Я отметил другой вариант, потому что он также верен и включает немного больше о причинах, по которым это может помочь другим, попадающим на эту страницу (не позволял мне отмечать оба варианта, я пробовал). - person ChaPPer5; 07.04.2020
comment
@ ChaPPer5 вы всегда можете поставить лайк один раз / если у вас достаточно репутации - person CodeCamper; 07.04.2020
comment
Дооооооооооооне :). - person ChaPPer5; 09.04.2020