Google Apps脚本计算2列中相同单元格的数量

时间:2017-06-23 06:00:10

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

所以我在google电子表格中有2列,A和B,我想逐行比较它们(A1到B1,A2到B2等),最后计算具有完全相同值的单元格数量(可以是字符串或整数,但必须相同)并将其放在另一个单元格中,例如D1。这是我到目前为止所得到的,但似乎没有做任何事情,并且也没有返回任何错误。

function compare() {
    var sss = SpreadsheetApp.getActiveSpreadsheet();
    var ss = sss.getSheetByName('theSheetINeed');
    var range1 = ss.getRange('A1:A'); //the first column
    var data1 = range1.getValues();
    var range2 = ss.getRange('B2:B'); //the second column
    var data2 = range2.getValues();
    var count = []; //to count the number of match
    for(var i =0;i 'smaller than' data1.length; i++){ //somehow i cant use '<'
        var abc = data1[i];
        var def = data2[i];
        if(abc == def){
            count += count;
        };
    };
    ss.getRange('D1').setValue(count.length);
}

编辑:所以我的代码实际上做了一些事情,每次都返回0 ...

2 个答案:

答案 0 :(得分:1)

修改要点:

  • getValues()检索的值是二维数组。
  • count被定义为数组。但它不用作数组。
  • i 'smaller than' data1.lengthi<data1.length
  • A列和B列的起始行分别为1,2。
  • 包括没有值的单元格。因此,当比较这些单元格时,值变得相同。 (如果您想比较这些单元格,请从以下脚本中删除&& abc && def。)

修改后的脚本:

您的脚本可以通过修改以上几点来编写。

function compare() {
  var sss = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sss.getSheetByName('theSheetINeed');
  var range1 = ss.getRange('A1:A'); //the first column
  var data1 = range1.getValues();
  var range2 = ss.getRange('B2:B'); //the second column
  var data2 = range2.getValues();
  var count = []; //to count the number of match
  for(var i=0; i<data1.length-1; i++){ //somehow i cant use '<'
    var abc = data1[i][0];
    var def = data2[i][0];
    if(abc == def && abc && def){
      count.push(abc);
    };
  };
  ss.getRange('D1').setValue(count.length);
}

如果我误解了你的问题,我很抱歉。

答案 1 :(得分:1)

需要在后台运行的Apps脚本的替代方案,您可以使用开箱即用的公式执行此操作,因此结果是实时的

=SUM(
   QUERY(
     FILTER(A1:B,A1:A<>"",A1:A<>0),
     "Select count(Col1)
        Where Col1=Col2 
        Group By Col1 
        Label count(Col1) ''"
     ,0)
 )

基于公式的解决方案的优势在于它们更加醒目,任何关注您的人都可以确定答案是正确的,而不必知道他们必须运行脚本来实现这一目标。

打破公式并从中间开始:

FILTER(A1:B, A1:A<>"", A1:A<>0)

这将返回存在非空单元格的所有行。我这样做是因为QUERY可能会误导查找空白单元格

"Select count(Col1)
    Where Col1=Col2 
    Group By Col1 
    Label count(Col1) ''"

这会进行您要求的比较,并返回A中与B匹配的每个值的计数。Select此处使用Col1代替A,因为FILTER返回一个数组而不是一个数组 范围。

从那时起,SUM将每个总数加起来。