【问题标题】:Comparing two columns, same row, for first value that doesn't match比较两列,同一行,以获得不匹配的第一个值
【发布时间】:2019-05-18 21:25:55
【问题描述】:

我有两张表,一张是镜像表“Sheet2”,我用它来存储另一张表“Sheet1”的值。我的目标是有一个函数比较两张纸的差异。我能想到的最好方法是将Sheet1中的A列与Sheet2中的A列进行比较。我发现了一些比较两列的函数,但它确实从一列中查找值并在另一列中找到它。或者通过返回那些具有匹配值的单元格中的所有值,无论它在哪一行。但我不希望单元格中的值,必然。我想找到两列停止匹配的第一行。我对 Javascript 还很陌生,所以我仍然无法理解整个 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()
}

【问题讨论】:

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


    【解决方案1】:

    您拥有的代码“有点”有用,但它并没有解决您的特定问题。另一方面,您的 if(ColumnA1 + Row !== ColumnA2 + Row){ 也没有真正的帮助。

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

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

    • 设置 sheet1,获取数据
    • 设置 sheet2,获取数据
    • 遍历行并比较给定行上从一张纸到另一张纸的值。

    • for 语句表示循环

    • i 只是一个计数器变量
    • i=0 表示起始值为零。在 javascript 数组中,零始终是第一个值集。
    • i &lt; Sheet1Data.length 表示循环将运行多少次。在这种情况下,它将在 i 小于数组中的行数时运行。请记住,我从零开始,因此“小于”总行数就可以了。
    • i++ 表示每次代码循环时,都会将 i 加一。所以,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);
        }
      }
    }
    

    这是我的测试数据

    【讨论】:

    • 这真的很有帮助而且很有见地!谢谢你。我只是想知道在这种情况下 return false 会做什么?我如何让它从值中返回单元格、行或列?
    • 第一个if条件是“+i+”吗?我输入了var falseRow = +i+ Logger.log(falseRow) 并返回了“3Logger” 所以我想我很接近了吗?
    • 哦,就这样吧= i
    • return false; 实际上并没有增加任何额外的价值,我的错。它与return; 一样有效
    • And how would I get it to return a cell, row, or column from values? 关键是“i”的值。行:+i+1(因为它是从零开始的);列:在这种情况下,我们只查看单个列(列 A),在数组值“Sheet1Data[i][0]”中,右侧值 - 0;再次,添加一个以获得实际的电子表格列号。单元格:行和列为您提供单元格 - 如果您想要 A1 表示法,请查看 Convert column index into corresponding column letter
    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    相关资源
    最近更新 更多