比较两列,同一行,查找不匹配的第一个值

时间:2019-05-18 04:22:10

标签: javascript google-apps-script google-sheets

我有两张纸,一张是镜像纸“ Sheet2”,用于存储另一张纸“ Sheet1”的值。我的目标是让一个函数比较两个表的差异。我能想到的最好方法是将Sheet1的A列与Sheet2的A列进行比较。我找到了一些比较2列的函数,但它确实从一个列中查找值,然后在另一列中找到它。或者通过返回那些具有匹配值的单元格中的所有值,而不管它在哪一行中。但是我并不需要单元格中的值。我想找到两列停止匹配的第一行。我是Java语言的新手,所以我仍然无法理解整个for (var j = 0; j < range.length; j++)的内容。

但是我确定我需要知道如何将其用于所需的功能。这是我尝试使用的方法,但没有给我行范围,而是给了我一个相同的值数组,如果我将其更改为if(lookup[i][0]!==range[j][0]){,它给了我所有不匹配的可能组合。来自stackoverflow.com/questions/42044903

function findDifference() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getSheetByName("Sheet1")
  var lr=s.getLastRow()
  var lookup = s.getRange(2,1,lr-1,2).getValues();
  var s1=ss.getSheetByName("Sheet2") 
  var lr1=s1.getLastRow()
  var range = s1.getRange(2,1,lr1-1,2).getValues();
  var lookupRange = [];
  for (var i = 0; i < lookup.length; i++) {
     for (var j = 0; j < range.length; j++) {
     var  test=lookup[i][0]
         if(lookup[i][0]!==range[j][0]){
           lookupRange.push([range[j][0],range[j][1],lookup[i][0],lookup[i][1],]);
     }}}
   s1.getRange(10,1,lookupRange.length,4).setValues(lookupRange); 
}

我觉得我想做的事情已经有一个非常相似的功能,但是我似乎找不到或想出它如何工作,因为我是新手并且不知道所有的花招。 像这样:

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1=ss.getSheetByName("Sheet1")
  var s2=ss.getSheetByName("Sheet2")
var ColumnA1 = s1.getRange('A:A').getValues()
var ColumnA2 = s2.getRange('A:A').getValues()
var Row = Function()
///Some function I can't think of using where
if(ColumnA1 + Row !== ColumnA2 + Row){
???.getRow()
}

1 个答案:

答案 0 :(得分:0)

您使用的代码“很有帮助”,但是并不能解决您的特定问题。另一方面,您的if(ColumnA1 + Row !== ColumnA2 + Row){也没有帮助。

遗憾的是,您确实需要“理解(var j = 0; j

在下面的答案中,基本上有三个要素。

  • 设置sheet1,并获取数据
  • 设置sheet2,并获取数据
  • 循环浏览各行,并比较给定行中一张纸与另一张纸上的值。

  • for语句表示循环

  • i只是一个计数器变量
  • i=0表示起始值为零。在javascript数组中,第一个值集始终为零。
  • i < Sheet1Data.length表示循环将运行多少次。在这种情况下,它将在i小于数组中的行数时运行。记住,我从零开始,所以总行数“小于”就可以了。
  • i++意味着每次代码循环时,i都会递增1。因此,i从0开始,然后是1、2、3,依此类推。

如何找到两列停止匹配的第一行

  • 查看日志(“查看”>“日志”)。

您可以在代码Logger.log语句的第32和38行上看到。这些记录行号以及每个工作表中的行值是否匹配。


function so56195933() {
  // setup Spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // setup Sheet1
  var s1 = ss.getSheetByName("Sheet1")
  var s1LastRow = s1.getLastRow();
  //Logger.log("DEBUG: Sheet 1 Last row = "+s1LastRow);
  var Sheet1DataRange = s1.getRange(1,1,s1LastRow);
  var Sheet1Data = Sheet1DataRange.getValues();
  //Logger.log("DEBUG: Sheet 1 data range = "+Sheet1DataRange.getA1Notation());
  var Sheet1length = Sheet1Data.length;
  //Logger.log("DEBUG: Sheet1 length = "+Sheet1length);

  // setup Sheet2
  var s2=ss.getSheetByName("Sheet2") 
  var s2LastRow=s2.getLastRow();
  //Logger.log("DEBUG: Sheet 2 Last row = "+s2LastRow);
  var Sheet2DataRange = s2.getRange(1,1,s2LastRow);
  var Sheet2Data = Sheet2DataRange.getValues();
  //Logger.log("DEBUG: Sheet 2 data range = "+Sheet2DataRange.getA1Notation());
  var Sheet2length = Sheet2Data.length;
  //Logger.log("DEBUG: Sheet2 length = "+Sheet2length);

  // Loop through rows compare value per each sheet
  for (var i = 0; i < Sheet1Data.length; i++) {
    var s1data = Sheet1Data[i][0];
    var s2data = Sheet2Data[i][0];
    //Logger.log("DEBUG: Line: "+i+", s1data: "+s1data+" Vs s2data: "+s2data);
    if (s1data !=s2data){
      // sheets values don't balance
      Logger.log("Line: "+i+". Sheets are NOT equal. Sheet1 = "+s1data+", Sheet2 = "+s2data);
      return false;
    }
    else
    {
      // sheets values balance
      Logger.log("Line: "+i+". Sheets are equal, value: "+s1data);
    }
  }
}

这是我的测试数据

My Test Data