[英]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.