Сценарий приложения не сравнивает 2 значения в выражении if - PullRequest
0 голосов
/ 01 мая 2018

Я создал новый проект, который должен сравнивать имя из Sheet1 со списком имен в Sheet2 и проверять, есть ли имя уже в этом списке. Для этого я выбрал цикл for, чтобы пройти через список в Sheet2 и сравнить каждую запись в списке с именем из Sheet1. Только в том случае, если имя уже существует в списке, это должно произойти.

function myFunction() {
  var tabSheet1 = 'Sheet1';
  var tabSheet2 = 'Sheet2';

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName(tabSheet1);
  var sheet2 = ss.getSheetByName(tabSheet2);
  var lastRow1 = sheet2.getLastRow() + 1;
  var playerNameSheet1 = sheet1.getRange(1, 1).getValue();

  for (var j = 1; j < lastRow1; j++) {
    var playerNameSheet2 = sheet2.getRange(j, 1).getValue();
    if (playerNameSheet2 == playerNameSheet1) {
      ...stuff...
    }
  }
}

Теперь моя проблема в том, что сценарий не может определить, что имя уже существует в списке. Оба значения (playerNameSheet1 и playerNameSheet2) полностью идентичны (без пробелов и других скрытых препятствий), однако сценарий никогда не продолжит работу с оператором if. Моим примером имени для проверки моего сценария было «Оливер Бауманн».

Я немного озадачен этим - даже больше, потому что другое сравнение чуть позже в коде скрипта работает просто отлично.

Я уже пытался сменить оператора на ===, но это тоже не сработало.

if (playerNameSheet2 === playerNameSheet1) {
   ...stuff...
}

Я также заметил, что если поставить точку за обеими переменными, я могу выбирать дополнительные функции только с playerNameSheet2, но не с playerNameSheet1. Может быть, я допустил опечатку и просто слишком слеп, чтобы ее увидеть? Я не знаю. У кого-нибудь есть идеи, как решить проблему?

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

вы можете попытаться преобразовать данные в массив и сравнить в цикле:

  var dataRangeSpieler = sheetSpieler.getDataRange().getValues();
  var dataRangeDBSpiele = sheetDBSpieler.getDataRange().getValues();


  for (i in dataRangeSpieler ) {

    for (j in dataRangeDBSpiele) {

      if (dataRangeSpieler[i][1] == dataRangeDBSpiele[j][0]) {

      Logger.log(dataRangeSpieler[i][1]); //Oliver Baumann

      }
    }

  }
0 голосов
/ 01 мая 2018

Вы, вероятно, выиграете от изменения вашей процедуры проверки - в настоящее время то, что у вас есть, не масштабируется из-за медленных, повторных вызовов *1002* в службу электронных таблиц. Используйте пакетный метод - getValues() - чтобы вернуть Javascript Array, который содержит все содержимое, которое вы могли бы хотеть из своего «основного списка» имен:

// Create an N x 1 array of arrays, e.g. [ [r1c1], [r2c1], [r3c1], ... [rNc1] ],
// of data in column A in sheet2. There will be blanks at the end if other columns have more data.
var allNames = sheet2.getRange(1, 1, sheet2.getLastRow(), 1).getValues();

Чтобы проверить, присутствует ли имя из первого листа, мы можем заменить этот код:

for (var j = 1; j < lastRow1; j++) {
  var playerNameSheet2 = sheet2.getRange(j, 1).getValue();
  if (playerNameSheet2 == playerNameSheet1) {
    /* do stuff */

с этим кодом (примечание j теперь начинается с 0):

for (var j = 0; j < allNames.length; ++j) {
  if (playerNameSheet1 === allNames[j][0]) {
    /* do stuff */

Если вам нужно только do stuff для имени один раз в вызове функции (например, вам не нужно выполнять тело цикла двадцать раз, когда имя листа 1 - "Боб" и там двадцать листов на листе 2), вы можете упростить проверку значения allNames с помощью метода Array#indexOf. Во-первых, нужно свернуть «2D» массив массивов значений в массив значений. Мы хотим применить функцию к каждому элементу внешнего массива и создать массив его выходных данных, поэтому мы решили вызвать для него Array#map:

var db = allNames.map(function (row) { return row[0]; });

Используемая нами функция просто возвращает первый элемент переданного элемента, то есть значение в первом столбце, что приводит к выводу, подобному [ r1c1, r2c1, r3c1, ... rNc1 ].

Код замены:

if (db.indexOf(playerNameSheet1) === -1) {
  console.log({
    message: "Did not find '" + playerNameSheet1 + "' in database.",
    database: db, original: allNames, searched: playerNameSheet1
  });
  return;
}
/* do stuff */

В котором написано «если имя отсутствует на листе 2, зарегистрируйте неудачный поиск и затем прекратите запуск функции.» Для обеспечения фактического ведения журнала журнал отправляется в Stackdriver, который будет хранить его для намного дольше, чем класс Logger.

Если ваши do stuff биты используют индекс j, вы все равно можете получить этот индекс и использовать соответствующую строку на листе 2:

var index = db.indexOf(playerNameSheet1);
if (index === -1) {
  console.log({
    message: "Did not find '" + playerNameSheet1 + "' in database.",
    database: db, original: allNames, searched: playerNameSheet1
  });
  return;
}
/* do stuff with the user's existing row of data, e.g.

var userDataRow = sheet2.getRange(index + 1, 1, 1, sheet2.getLastColumn()).getValues();
var userData = userDataRow[0];
...
 */

Возможное улучшение модификации indexOf, которую я оставляю вам для изучения и / или реализации, - это использование Object для хранения имен в качестве «ключей» (свойств объекта) и индекса связанные листовые данные (или даже данные напрямую) в качестве ассоциированного значения пары ключ-значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...