首页 > 解决方案 > 在两个电子表格之间查找一行,然后查找包含第一行中的值的行

问题描述

我有一个脚本,它在两个电子表格列 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() 函数。

标签: google-apps-scriptgoogle-sheets

解决方案


没关系,我想我明白了。想出了我期望看到的价值观。

 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)
        }
}
}
}

推荐阅读