这应该是SUMIF公式吗?

问题描述 投票:0回答:2

[我正在尝试创建一个公式,以便在A列中识别名称为Brooke B,例如,从此处,我想对该列特定用户的列I Cash Discounts中列出的值求和。

(是的,该用户没有现金折扣,因此第一列指出“非现金付款”。]

这里总共有80位用户,所以我希望自动在A列中进行名称识别。工作表:https://docs.google.com/spreadsheets/d/1xzzHT7VjG24UJ4ZXaiZWsfzroTpn7jCJLexuTOf6SQs/edit?usp=sharing

Cash Discounts表中列出的所需结果,每个用户在C列中列出。enter image description here

google-sheets sumifs
2个回答
0
投票

您正在尝试计算列表中给每个人的现金折扣总额。您具有从POS系统导出的数据,并已在其中添加了公式以逐行计算折扣的金额。您已推测是否可以使用SUMIFS公式计算折扣总额。

我认为,尽管Google表格具有功能,但电子表格的布局和POS报告的格式并不适合于分离离散的数据元素(尽管毫无疑问,具有比我更高的技能的人会反驳这一理论)。包含名称的A列还包括子分组(及其小计)以及交易日期。有83位独特的人员和31,900多个交易行。

此答案是基于脚本的解决方案,它使用折扣总额的名称和值来更新工作表。执行时间为@ 11秒。


function so5882893202() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get the Discounts sheet
  var discsheetname = "Discounts";
  var disc = ss.getSheetByName(discsheetname);

  //get the Discounts data
  var discStartrow = 3;
  var discLR = disc.getLastRow();
  var discRange = disc.getRange(discStartrow, 1, discLR-discStartrow+1, 9);
  var discValues = discRange.getValues();

  // isolate Column A
  var discnameCol = discValues.map(function(e){return e[0];});//[[e],[e],[e]]=>[e,e,e]
  //Logger.log(discnameCol); // DEBUG

  // isolate Column I
  var discDiscounts = discValues.map(function(e){return e[8];});//[[e],[e],[e]]=>[e,e,e]
  //Logger.log(discDiscounts); // DEBUG

  // create an array to build a names list
  var names =[]

  // get the number of rows on the Discounts sheet
  var discNumrows = discLR-discStartrow+1;
  // Logger.log("DEBUG: number of rows = "+discNumrows);

  // identify search terms
  var searchPercent = "%";
  var searchTotal = "Total";

  // loop through Column A
  for (var i=0; i<discNumrows; i++){
    //Logger.log("DEBUG: i="+i+", content = "+discnameCol[i]);

    // test if value is a date
    if (Object.prototype.toString.call(discnameCol[i]) != "[object Date]") {
       //Logger.log("it isn't a date") 

      // test whether the value contains a % sign
      if ( discnameCol[i].indexOf(searchPercent) === -1){
        //Logger.log("it doesn't have a % character in the content");

        // test whether the value contains the word Total
        if ( discnameCol[i].indexOf(searchTotal) === -1){
          //Logger.log("it doesn't have the word total in the content");

          // test whether the value is a blank
          if (discnameCol[i] != ""){
            //Logger.log("it isn't empty");

            // this is a name; add it to the list
            names.push(discnameCol[i])

          }// end test for empty

        }// end test for Total

      } // end for percentage

     }  // end test for date

  }// end for

  //Logger.log(names);

  // get the number of names
  var numnames = names.length;
  //Logger.log("DEBUG: number of names = "+numnames)

  // create an array for the discount details
  var discounts=[];

  // loop through the names
  for (var i=0;i<numnames;i++){
    // Logger.log("DEBUG: name = "+names[i]);

    // get the first row and last rows for this name 
    var startrow = discnameCol.indexOf(names[i]);
    var endrow = discnameCol.lastIndexOf(names[i]+" Total:");
    var x = 0;
    var value = 0;
    // Logger.log("name = "+names[i]+", start row ="+ startrow+", end row = "+endrow);

    // loop through the Cash Discounts Column (Column I) for this name 
    // from the start row to the end row
    for (var r = startrow; r<endrow;r++){ 

      // get the vaue of the cell
      value = discDiscounts[r];

      // test that it is a value
      if (!isNaN(value)){

        // increment x by the value
        x = +x+value;
        // Logger.log("DEBUG: r = "+r+", value = "+value+", x = "+x);
      }

    }
    // push the name and the total discount onto the array
    discounts.push([names[i],x]);

  }

  //Logger.log(discounts)

  // get the reporting sheet
  var reportsheet = "Sheet10";
  var report = ss.getSheetByName(reportsheet);

  // define the range (allow row 1 for headers)
  var reportRange = report.getRange(2,1,numnames,2);

  // clear any existing content
  reportRange.clearContent();

  //update the values
  reportRange.setValues(discounts);


}

报告表-摘录

Report Sheet extract


0
投票

不是每个人都希望脚本解决他们的问题。该答案试图使用常见的花园品种公式/函数提供可重复解决方案。

[如其他地方所述,电子表格的布局并不适合快速/简单的解决方案,但是可以分解数据以编译非脚本答案。尽管以下公式似乎比“简单”似乎“看起来”要少,但一次使用它们是合乎逻辑的,非常容易创建,并且非常容易验证成功的结果。

注意:从一开始就知道数据的第一行=第3行,数据的最后一行=第3319行。

Step#1-从ColumnA中获取Text

  • 在单元格J3中输入此公式,然后复制到第31916行
    • =if(isdate(A3),"",A3)
    • 评估列A,如果内容是日期,则返回空白,否则,返回上下文
  • 以客户“ AJ”为例,此时的内容包括:
  • AJ
  • 10%建筑物折扣
  • 建筑物总折扣10%:
  • 西北10%
  • 西北10%,总计:
  • AJ合计:

Step#2-忽略包含“ 10%”的值(这将删除标题和小计]]

  • 在单元格K3中输入此公式并复制到第31916行
  • [=iferror(if(search("10%",J3)>0,"",J3),J3):在J列中搜索“ 10%”。返回除包含“ 10%”的那些值以外的所有值。
  • 以客户“ AJ”为例,此时的内容包括:
    • AJ
  • AJ合计:

**步骤#3-忽略包含单词“ Total”的值

  • 在单元格L3中输入此公式,然后复制到第31916行。
    • =iferror(if(search("total",K3)>0,"",K3),K3)
  • 以客户“ AJ”为例,此时的内容包括:
    • AJ

步骤3之后的结果

Step3 results


您可能会想,“ 难道不能在一个公式中完成吗?

”和/或“ 数组公式会更有效”。这两种想法都是正确的,但是我们正在寻找简单而容易的方法,而一个公式并不简单(如下所示);考虑到这一点,除非/直到专家可以在数据上挥动魔杖,否则数组公式就毫无疑问。

FWIW-合并步骤#1、2和3

  • 每个步骤#1、2和3都是相互依存的。因此,有可能创建一个结合了这些步骤的公式。在单元格J3中输入此公式,并将dow复制到#31916行。
    • =iferror(if(search("total",iferror(if(search("10%",if(isdate(A3),"",A3))>0,"",if(isdate(A3),"",A3)),if(isdate(A3),"",A3)))>0,"",iferror(if(search("10%",if(isdate(A3),"",A3))>0,"",if(isdate(A3),"",A3)),if(isdate(A3),"",A3))),iferror(if(search("10%",if(isdate(A3),"",A3))>0,"",if(isdate(A3),"",A3)),if(isdate(A3),"",A3)))

  • 如图所示,第3步以L列中的主要空白单元格结束;唯一填充的单元格是客户在交易开始时的第一个实例名称,例如本例中的“ Alec”。但是,(@Rubén的道具)可以填充L列中的空白交易单元。Webapps上的An arrayformula to find the previous non-empty cell in another column说明了如何。
  • [Step#4-为每个交易行创建一个客户名称。

      在单元格M3中输入此公式,它将自动将单元格填充到行#31916
      • =ArrayFormula(vlookup(ROW(3:31916),{IF(LEN(L3:L31916)>0,ROW(3:31916),""),L3:L31916},2))
  • [Step#5

  • -获取每个交易金额的折扣金额
      折扣值已经显示在第I列中。它们已经散布在文本值中,因此,通过测试D列中的值,可以测试公式是否为总行;仅当存在淡谷(产品项)时,才进行公式计算,然后测试第一列中是否存在值。
      • 在单元格N3中输入此公式,它将自动将单元格填充到行#31916
        • =ArrayFormula(if(len(D3:D31914)>0,if(ISNUMBER(I3:I31916),I3:I31916,0),""))

  • 第5步后的屏幕截图

  • Post Step 5 screenshot


    按查询报告

    报告通过查询完成。这些可以放在任何地方,但是将其放在单独的纸上可能更方便。

    [Step#6.1

    -查询结果以创建显示所有客户总计的报告
      =query(Discounts_analysis!$M$2:$N$31916,"select M, sum(N) where N is not null group by M label M 'Customer', sum(N) 'Total Discount' ",1)
  • [Step#6.2

  • -查询结果以创建显示客户总额的报告客户获得折扣的位置
      =query(Discounts_analysis!$M$2:$N$31916,"select M, sum(N) where N >0 group by M label M 'Customer', sum(N) 'Total Discount' ",1)
  • [Step#6.3

  • -查询结果以创建显示没有折扣的客户的报告- `=query(query(Discounts_analysis!$M$2:$N$31916,"select M, sum(N) where N is not null group by M label M 'Customer', sum(N) 'Total Discount' ",1),"select Col1 where Col2=0")`

    查询屏幕快照

    Queries snapshot
    © www.soinside.com 2019 - 2024. All rights reserved.