Как получить конкретную строку из цикла for ().Он продолжает работать, когда должен остановиться - PullRequest
1 голос
/ 03 июня 2019

У меня есть такой цикл:

for (var i = 0; i < Sheet1Data.length; i++) {

И я пытаюсь получить значение i, когда оно равно определенной строке, строка должна быть строкой, в которой два значения в двух разных электронных таблицах не совпадают, что я получаю вот так.

 var s1data = Sheet1Data[i][0];
 var s2data = Sheet2Data[i][0];
if (s1data != s2data){
      var falseRow = i+1
}

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

0: Аанг = Аанг

1: Корра = Корра

2: Сакка! = Toph -> var falseRow = 2 + 1 = 3

Причина, по которой я добавляю плюс 1, состоит в том, чтобы изменить число с целого 0 = первая строка на целое число, понятное другим функциям .. Когда он получает эту ложную строку, он решает что-то с ней делать в зависимости от того, где найденные значения находятся на листе. Например:"; ;" представляет изменение в электронной таблице.

0: Аанг; ; Аанг

1: Корра; ; Korra

2: Сакка; ; Тоф * * 1 021

3: Toph; ; (пробел)

он использует другой цикл, чтобы найти эти значения на другом листе

   var s1falseRowARange = s1.getRange(falseRow,1,1,1);
   var s1falseRowAName = s1falseRowARange.getValues();
for (var j = 0; j < Sheet1Data.length; j++) {
   var s1dataj = Sheet1Data[j][0];
   var s2dataj = Sheet2Data[j][0];
   if(s1falseRowAName == s2dataj){
      var s2trueRow = j+1;
}
}

это также делает это, но для sheet2. Таким образом, он находит, где Toph будет в Листе 2, который является 4-м рядом, так что

var s1trueRow =j+1;//or 4

Но в Листе 2 нет Сакки? Таким образом, он определяет, что его там нет, используя

  if(falseRow > s2trueRow) {
    var fm2t = 'true';
  }
  else if(falseRow < s2trueRow) {
    var fl2t = 'true';
  }
    var s2Rowfound = 'true';
}
  else if(j+1 == s2LastRow && s2Rowfound != 'true'){
     s2.insertRows(falseRow);
     s2.getRange(falseRow,1,1,1).setValue(s1data)
  }
function insertCell(cellRange) {
  var sos = SpreadsheetApp.openById("Sheet1");
  var sas = SpreadsheetApp.setActiveSpreadsheet(sos);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getActiveSheet();
  s1.getRange(cellRange).insertCells(SpreadsheetApp.Dimension.ROWS);
}

function deleteCell(cellRange){
  var sos = SpreadsheetApp.openById("Sheet1");
  var sas = SpreadsheetApp.setActiveSpreadsheet(sos);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getActiveSheet();
  s1.getRange(cellRange).deleteCells(SpreadsheetApp.Dimension.ROWS);
}

переменная s2Rowfound никогда не была равна истине. Таким образом, он определил, что он не существует на листе 2, и добавил его на лист 2.

Вот тут-то и возникает моя проблема! falseRow равно значению цикла i. Таким образом, при добавлении этой новой строки функция цикла все еще может работать в случае аварии, которая вызывает такие инциденты после добавления Сакки в список:

0: Аанг; ; Аанг

1: Корра; ; Korra

2: Сакка; ; Sakka

3: Toph; ; (пробел)

4: (пробел); ; Тоф

Он вставил строку в следующую строку, когда этого не должно было быть. Это связано с тем, что falseRow является переменной цикла i. И это не просто добавление строк, это также удаление строк (у меня есть ситуация, когда, если этого не существует на sheet1, он удаляет эту строку). Иногда это будет работать нормально, но иногда он будет добавлять или удалять строки после цикла. Как заставить его не продолжать цикл до тех пор, пока он не удалит или не добавит строки, чтобы предотвратить это двойное добавление или двойное удаление?

EDIT: Итак, я сделал больше испытаний с ним. Похоже, что проблема может быть связана с функциями deleteCell() и insertCell() и insertRows(). Есть икота, где это повторится без видимой причины. Возможно, мне придется задать другой вопрос, который вращается вокруг этого больше, чем циклы. Но на случай, если у кого-нибудь возникнут какие-либо идеи, я расскажу вам больше об этом.

if(j+1 == s1LastRow && fnot1t == 'true' && 'F3' != 'RUNNING'){
          s1.getRange('F3').setValue('RUNNING');

Я пробовал много вещей, таких как установка ячейки на «RUNNING» в начале функции и установка ее на «». когда это было закончено с этой частью. Чтобы он не участвовал в гонках. Это по крайней мере дало мне преимущество наличия визуального индикатора того, что функция делала в то время.

          var falseRow = falseRowC.getRow();
          s1.getRange('F4').setValue(falseRow);
          var F4 = s1.getRange('F4').getValue();
          s2.deleteRow(F4);

Затем я попытался преобразовать falseRow в другие типы переменных, чтобы получить его как можно дальше от «i», думая, что именно это и делало ошибки. Это дошло до записи строки в ячейку и получения значения этой ячейки вместо строки, которую мне нужно было изменить.

          s1.getRange('C'+F4).deleteCells(SpreadsheetApp.Dimension.ROWS);
          Logger.log('Delete row '+F4+' from Mirror Sheet.');
          s1.getRange('F3').setValue('');
        }

Здесь ячейка F3 возвращается к нулю, чтобы указать, что этот процесс завершен и ему разрешено выполнять процесс с самого начала. Вы также видите, что функция deleteCells находится здесь, так как она может работать дважды, если она записана только один раз И эта функция не может быть запущена до тех пор, пока индикатор RUNNING не погаснет? Вот в чем вопрос.

        else if(j+1 == s1LastRow && fnot2t == 'true' && fl1t == 'true' && 'F3' != 'RUNNING') {
          s1.getRange('F3').setValue('RUNNING');
          var falseRow = falseRowC.getRow();
          s1.getRange('F4').setValue(falseRow);
          var F4 = s1.getRange('F4').getValue();
          s1.getRange('C' + F4).insertCells(SpreadsheetApp.Dimension.ROWS);
          s1.getRange('C' + F4).setValue('HOME');
          var SRange = s1.getRange(F4,1,1,2);
          var A1Range = SRange.getA1Notation();
          var SData = SRange.getValues();
          s2.insertRows(F4);
          s2.getRange(A1Range).setValues(SData);
          s1.getRange('F3').setValue('');
        }

И это тот же процесс, но когда он добавляет строки. Та же проблема. Сделано F3 = RUNNING, чтобы предотвратить запуск этого процесса insertRows. Но по какой-то причине он добавляет несколько строк.

1 Ответ

0 голосов
/ 04 июня 2019

Согласно документации по методу getValues() (ссылка ниже), он «возвращает двумерный массив значений, проиндексированный по строке, а затем по столбцу».Поэтому, когда вы сравниваете его с s2dataj, который является единственным значением, это может вызвать проблемы.Поскольку вы устанавливаете диапазон для получения единственной ячейки при вызове s1.getRange(falseRow,1,1,1), я считаю, что ваш чек должен быть:

if(s1falseRowAName[0][0] == s2dataj){
      var s2trueRow = j+1;
}

getValues() Ссылка на документацию: https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues

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