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