簡體   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