繁体   English   中英

根据多个条件重新启动 COUNTIF function

[英]Restarting a COUNTIF function depending on multiple criteria

我有一个包含 4 列的工作表,如下所示:

1个 日期 项目名 柜台 旗帜
3个 日期 1 项目A 1个
4个 日期 1 B项 1个
5个 日期 2 B项 2个
6个 日期 3 项目A 2个 1个
7 日期 3 B项 3个
8个 日期 4 项目A 1个
9 日期 5 项目A 2个

目前,我正在使用 countif function [=countif(B$2:B2,B2)] 来计算特定项目在电子表格中出现的次数。 但是,如果 D 列中有 1,我需要找到一种重新启动计数器的方法。在这种情况下,这意味着第 8 行第 C 列中的公式将是 [=COUNTIF(B$8:B8,B8)]并将继续计数,直到在 D 列中找到另一行为 1(例如,第 C 列第 9 行中的公式为 =COUNTIF(B$8:B9,B9)。理想情况下,它还会检查是否有前一行带有D 列中的 1,不是通过工作表的顺序,而是通过检查它的日期是否较小(但最接近 D 列中的 1 的日期)。

我编写了以下脚本,它将 D 列中带有 1 的行设置为 0,并将起始行的 countif 正确设置为 [=countif(B$2:B2,B2)],但它设置了之后的任何行是 D 列中带有 1 的行,与相同的公式相同,起始范围为 B$2。

function setCountifFormula() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test");
  var data = sheet.getDataRange().getValues();
  
  for (var i = 1; i < data.length; i++) { //iterate through each row
    var colBValue = data[i][1]; //get columnB in i
    var colAValue = data[i][0]; // get date in i
    var colDValue = data[i][3]; // get flag in i
    var closestRow = 1; // empty variable
    
    if( colDValue == "1") { //if columnD = 1 
      sheet.getRange(i+1,3).setValue(0); // set columnC = 0
    } else {
      for (var j = 1; j < data.length; j++) { //iterate through other rows
        if (data[j][1] === colBValue && data[j][3] === "1") { // if columnB in j = ColumnB in i, and flag in row j = 1 
          var dateToCompare = data[j][0]; //set datetoCompare = date in row j
          closestRow = j;
          if (dateToCompare < colAValue) {
            var range = "B$" + (closestRow + 1) + ":B" + (i + 1);
            var formula = "=COUNTIF(" + range + ",B" + (i + 1) + ")";
            sheet.getRange(i + 1, 3).setFormula(formula);
          } else {
            var range = "B$2:B" + (i+1);
            var formula = "=COUNTIF(" + range + ",B" + (i+1) + ")";
            sheet.getRange(i+1, 3).setFormula(formula);
          }
        }
      }
      if (closestRow === 1) {
        var range = "B$2:B" +(i+1);
        var formula = "=COUNTIF("+range +",B"+(i+1)+")";
        sheet.getRange(i+1,3).setFormula(formula);
      }
    }
  }
}

如果需要,我可以发布电子表格。 如果有不使用脚本或 COUNTIF 的不同方式,我们将不胜感激。 谢谢!

与复杂的公式相比,我更擅长编写脚本,所以这里是我将如何做的一个例子。

在此处输入图像描述

function myCountif() {
  try {
    let values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
    values.shift(); // remove headers
    let unique = values.map( row => row[1] );
    unique = [...new Set(unique)];
    let count = unique.map( row => 0 );
    let counts = values.map( row => 0 );
    values.forEach( (row,rIndex) => {
        let cIndex = unique.findIndex( item => item === row[1] );
        count[cIndex] = count[cIndex]+1;
        counts[rIndex] = count[cIndex];
        if( row[3] === 1 ) count[cIndex] = 0;
      }
    )
    return counts;
  }
  catch(err) {
    console.log(err);
  }
}

参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM