Как: цикл по рядам; if (Value1 = Value2) {getRow}; еще если (строка не найдена) {удалить значение2} - PullRequest
0 голосов
/ 02 июня 2019

Я использую циклы, чтобы просмотреть список имен в одной электронной таблице и сравнить их со списком имен в другой электронной таблице.Если имя существует в Spreadsheet1, но не в Spreadsheet2, оно должно добавить это имя в Spreadsheet2, но если имя в Spreadsheet2 не отображается в Spreadsheet1, оно должно удалить это имя в Spreadsheet2.Идея состоит в том, чтобы заставить их соответствовать друг другу.Чтобы узнать, что меняется, а что нет, чтобы добавить значения в другие ячейки рядом с именами.Он делает это, находя строку, в которой находятся эти различия, а затем просто добавляя или удаляя ячейку в неизменном столбце с найденной строкой.

Тем не менее, выяснить, как это сделать точно, было затруднительно, потому что я хочу, чтобы функция делала это сама, используя функцию onChange (), которая активируется при каждом изменении списка.Список составлен по запросу, полному названий, в алфавитном порядке.Существуют случаи, когда имена добавляются и удаляются из таблицы на расстоянии 1 секунды друг от друга, что вызывает путаницу в отношении того, следует ли удалять или добавлять информацию.

Сначала я просто сравнил длину двух листов, для которых длина больше.Но если имена добавляются и удаляются, сравнение длин является плохой идеей, потому что они могут быть одинаковыми или добавятся, когда должны были быть удалены, и так далее.Все выходит из строя, вот что я говорю.

Поэтому я решил, что более точный, если не более длинный метод - найти строку, не совпадающую на обоих листах «falseRow», как это уже было, и затем получить значение из Spreadsheet1,давайте теперь будем называть это ss1 и ss2.Затем он ищет то же значение в ss2.Если он находит значение, он получает строку в ss2 о том, что он попадает в «trueRow».

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

function checkAndPlace() {
  var sos = SpreadsheetApp.openById("Spreadsheet1");
  var sas = SpreadsheetApp.setActiveSpreadsheet(sos);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getActiveSheet();
  ss.getRange('F2').setValue('RUNNING')
  var Avals = s1.getRange("A1:A").getValues();
  var Alast1 = Avals.filter(String).length;
  var s1LastRow = s1.getLastRow()+1;                           
  var Sheet1DataRange = s1.getRange(1,1,s1LastRow,1);
  var Sheet1BDataRange = s1.getRange(1,2,s1LastRow,1);
  var Sheet1Data = Sheet1DataRange.getValues();
  var Sheet1BData = Sheet1BDataRange.getValues();
  var Sheet1length = Sheet1Data.length;
  var sos2 = SpreadsheetApp.openById("Spreadsheet2");
  var sas2 = SpreadsheetApp.setActiveSpreadsheet(sos2);
  var ss2 = SpreadsheetApp.getActiveSpreadsheet();
  var s2 = ss2.getActiveSheet();
  var Avals2 = s2.getRange("A1:A").getValues();
  var Alast2 = Avals2.filter(String).length;
  var s2LastRow = s2.getLastRow()+1;
  var Sheet2DataRange = s2.getRange(1,1,s2LastRow,1);
  var Sheet2BDataRange = s2.getRange(1,2,s2LastRow,1);
  var Sheet2Data = Sheet2DataRange.getValues();
  var Sheet2BData = Sheet2BDataRange.getValues();
  var Sheet2length = Sheet2Data.length;
  for (var i = 0; i < Sheet1Data.length; i++) {
    var s1data = Sheet1Data[i][0];
    Logger.log(s1data)
    var s1Bdata = Sheet1BData[i][0];
    Logger.log(s1Bdata)
    var s2data = Sheet2Data[i][0];
    Logger.log(s2data)
    var s2Bdata = Sheet2BData[i][0];
    Logger.log(s2Bdata)
    if (s1data + s1Bdata != s2data + s2Bdata){
      var falseRow = i+1
      var s1falseRowARange = s1.getRange(falseRow,1,1,1);
      var s1falseRowAName = s1falseRowARange.getValues();
      var s1falseRowBRange = s1.getRange(falseRow,2,1,1);
      var s1falseRowBName = s1falseRowBRange.getValues();
      var s2falseRowARange = s2.getRange(falseRow,1,1,1);
      var s2falseRowAName = s2falseRowARange.getValues();
      var s2falseRowBRange = s2.getRange(falseRow,2,1,1);
      var s2falseRowBName = s2falseRowBRange.getValues();
      Logger.log('falseRow is '+falseRow+' and its value on Sheet1 is '+s1falseRowAName+' '+s1falseRowBName+' and its value on Sheet2 is '+s2falseRowAName+' '+s2falseRowBName+'.');
      Logger.log("Line: "+i+". Sheets are NOT equal. Sheet1 = "+s1data+", Sheet2 = "+s2data);
      for (var j = 0; j < Sheet1Data.length; j++) {
        var s1data = Sheet1Data[j][0];
        Logger.log(s1data)
        var s1Bdata = Sheet1BData[j][0];
        Logger.log(s1Bdata)
        var s2data = Sheet2Data[j][0];
        Logger.log(s2data)
        var s2Bdata = Sheet2BData[j][0];
        Logger.log(s2Bdata)
        if(s1falseRowAName + s1falseRowBName == s2data + s2Bdata){
          var s2trueRow = j+1
          Logger.log(s2trueRow);
          if(falseRow > s2trueRow) {
          }
          else if(falseRow < s2trueRow) {
          }

        }
        else(
          Logger.log(s1falseRowAName+' '+s1falseRowBName+' is not on Sheet2.  Adding him/her is recommended.')
        )

        if(s2falseRowAName + s2falseRowBName == s1data + s1Bdata) {
          var s1trueRow = j+1
          Logger.log(s1trueRow)
          if(falseRow > s1trueRow) {
          }
          else if(falseRow < s1trueRow){
          }

        }
        else(
          Logger.log(s2falseRowAName+' '+s2falseRowBName+' is not on Sheet1.  Deleting him/her is recommended.')
        )
 }
      return false;

    }
}


  ss.getRange('F2').setValue('')
  }

Прямо сейчасэто все просто логи, пока что не предназначено ничего делать.Но, как вы можете видеть else() функции в конце обеих if() функций, которые ищут falseRowNames на других листах.Они будут повторять свои записи в каждом ряду, что они не совпадают.Например: s2falseRowNames.Имя находится на sheet1, но оно будет проходить по всем строкам, говоря, что это не так, пока не найдет правильную строку и не даст строку.Я хочу, чтобы он только сказал, что его нет на листе, если функция if () НИКОГДА не дает ответа.Я не могу просто поместить функцию else() в if(), потому что тогда никогда не будет сказано, если функция if() никогда не имеет ничего = Как мне это сделать?

1 Ответ

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

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

Здесь для учебника: https://www.ablebits.com/office-addins-blog/2017/07/05/vlookup-google-sheets-example/

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