Найти строку между двумя таблицами, а затем найти строку, содержащую значение из этой первой строки - PullRequest
0 голосов
/ 01 июня 2019

У меня есть скрипт, в котором он ищет между двумя столбцами электронных таблиц A и B первую строку с разными значениями.Однако после того, как он найдет эту строку с другими значениями, я хочу, чтобы он получил эту строку, получил значение в электронной таблице 1 и нашел это конкретное значение в электронной таблице 2. А затем получил строку этого значения в электронной таблице 2. Я сделал этокод, который хорошо выполняет первую часть, но когда я пытаюсь получить вторую часть, я не могу понять, как ее собрать.

function checkAndPlace() {
  var sos = SpreadsheetApp.openById("Spreadsheet 1");
  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,2);
  var Sheet1BDataRange = s1.getRange(1,2,s1LastRow,1);
  var Sheet1Data = Sheet1DataRange.getValues();
  var Sheet1BData = Sheet1BDataRange.getValues();
  var Sheet1length = Sheet1Data.length;
  var sos2 = SpreadsheetApp.openById("Spreadsheet 2");
  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,2);
  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 falseRowARange = s2.getRange(falseRow,1,1,2);
      var falseRowAName = falseRowARange.getValues();
      var falseRowBRange = s2.getRange(falseRow,2,1,1);
      var falseRowBName = falseRowBRange.getValues();
      Logger.log("Line: "+i+". Sheets are NOT equal. Sheet1 = "+s1data+", Sheet2 = "+s2data);
      for (var j = 0; j < Sheet2Data.length; j++) {
        var s1data = Sheet1Data[j][0];
        Logger.log(s1data)
        var s1Bdata = Sheet1BData[j][0];
        Logger.log(s1Bdata)
!!!!        var falsejdata = falseRowAName[j][0]; "Cannot read property 0"
        Logger.log(falsejdata)
        var falsejBdata = falseRowBName[j][0];
        Logger.log(falsejBdata)
        if(falsejdata + falsejBdata == s1data + s1Bdata) {
          var trueRow = j+1
          Logger.log(trueRow)
        }
    }
      return false;
    }
    else {
      Logger.log("Line: "+i+". Sheets are equal, value: "+s1data);
    }
  }
}

он продолжает читать "не может прочитать свойство '0'из неопределенного. "Я отметил строку в коде, где это показывает.

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

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

Редактировать: Другая часть информации заключается в том, что электронная таблица 1 получает информацию, поступающую в нее, из запроса, полученного из редактируемой электронной таблицы.несколько раз в день.Это редактирование приводит к тому, что функция onChange (), доступная для установки, запускает функцию checkAndPlace ().

1 Ответ

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

Неважно, я думаю, что понял.придумал значения, которые я ожидал увидеть.

 for (var i = 0; i < Sheet1Data.length; i++) {
    var s1data = Sheet1Data[i][0];// s1 is spreadsheet 1's sheet.
    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 falseRow2ARange = s2.getRange(falseRow,1,1,1);//s2 is spreadsheet 2's sheet.
      var falseRow2AName = falseRow2ARange.getValues();
      var falseRow2BRange = s2.getRange(falseRow,2,1,1);
      var falseRow2BName = falseRow2BRange.getValues();
      Logger.log('falseRow is '+falseRow+' and its value is '+falseRow2AName+' '+falseRow2BName+'.');
      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)
        if(falseRow2AName + falseRow2BName == s1data + s1Bdata) {
          var trueRow = j+1
          Logger.log(trueRow)
        }
}
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...