Google sheets 制定包含嵌套IFs的GSheets公式

Google sheets 制定包含嵌套IFs的GSheets公式,google-sheets,formula,Google Sheets,Formula,我为我们的小企业创建了一个谷歌电子表格,列出了所有的发票。我已经上传了一个简化的格式 1.每张发票可以有1-5个产品 2.G列是该发票中所有产品的总和。我想为此列创建一个公式 目前,我的公式很长,效率很低。 列(G)使用以下公式计算产品数量: =IF(B3<>"",IF(OFFSET(B3,1,0)="",IF(OFFSET(B3,2,0)="",if(OFFSET(B3,3,0)="",if(OFFSET(B3,4,0)="",if(OFFSET(B3,5,0)="",5,5),

我为我们的小企业创建了一个谷歌电子表格,列出了所有的发票。我已经上传了一个简化的格式

1.每张发票可以有1-5个产品

2.G列是该发票中所有产品的总和。我想为此列创建一个公式

目前,我的公式很长,效率很低。 列(G)使用以下公式计算产品数量:

=IF(B3<>"",IF(OFFSET(B3,1,0)="",IF(OFFSET(B3,2,0)="",if(OFFSET(B3,3,0)="",if(OFFSET(B3,4,0)="",if(OFFSET(B3,5,0)="",5,5),4),3),2),1),0)
=如果(B3)”,如果(偏移量(B3,1,0)=“”,如果(偏移量(B3,2,0)=“”,如果(偏移量(B3,3,0)=“”,如果(偏移量(B3,4,0)=“”,如果(偏移量(B3,5,0)=“”,5,5,4),3),2),1),0)
另一列(H)用以下内容汇总乘积值:
=IF(G3>0,SUM(偏移量(D3,0,0,G3,1)),“”)

请帮助我修改计算产品数量的G列公式。如果有任何方法可以合并G和H,那也太好了

注:(I)列只是(H)列的替代


另外,请不要将此标记为基于意见的问题。这纯粹是一个解决问题的问题。

如果您能够使用VBA,您可以使用用户定义的功能。将此代码插入新模块并像调用普通excel函数一样调用它:

Public Function InvoiceDetail(Invoice As Range, ReturnType As Integer)

Dim varCount As Long
Dim varSheet As Worksheet
Dim varInvoiceID As String
Dim varPartyName As String
Dim varInvoiceTotal As Double
Dim varInvoiceCount As Integer

Set varSheet = ThisWorkbook.Sheets(Invoice.Parent.Name)

If varSheet.Range("A" & Invoice.Row).Value <> "" Then

    varInvoiceID = varSheet.Range("A" & Invoice.Row).Value
    varPartyName = varSheet.Range("B" & Invoice.Row).Value

    For varCount = Invoice.Row To 1000000

        If varSheet.Range("D" & varCount).Value = "" Then

            Exit For

        End If

        If varInvoiceID = varSheet.Range("A" & varCount).Value And varPartyName = varSheet.Range("B" & varCount).Value Then

            varInvoiceTotal = varInvoiceTotal + varSheet.Range("D" & varCount).Value
            varInvoiceCount = varInvoiceCount + 1

        ElseIf varSheet.Range("A" & varCount).Value = "" And varSheet.Range("B" & varCount).Value = "" Then

            varInvoiceTotal = varInvoiceTotal + varSheet.Range("D" & varCount).Value
            varInvoiceCount = varInvoiceCount + 1

        Else

            Exit For

        End If

    Next

End If

Set varSheet = Nothing

Select Case ReturnType

    Case 1 '// Count Only

        InvoiceDetail = varInvoiceCount

    Case 2 '// Total Only

        InvoiceDetail = varInvoiceTotal

    Case 3 '// Total [Count]

        InvoiceDetail = varInvoiceTotal & " [" & varInvoiceCount & "]"

    Case Else

        InvoiceDetail = "Error"

End Select


End Function
公共函数InvoiceDetail(发票作为范围,返回类型作为整数)
变长变长
将工作表设置为工作表
Dim varInvoiceID作为字符串
Dim varPartyName作为字符串
Dim VarienVoicetotal为双人
Dim varInvoiceCount为整数
Set varSheet=thisvoolk.Sheets(Invoice.Parent.Name)
如果varSheet.Range(“A”&Invoice.Row).Value为“”,则
varInvoiceID=varSheet.Range(“A”和Invoice.Row).值
varPartyName=varSheet.Range(“B”和Invoice.Row).Value
对于varCount=发票。行到1000000
如果varSheet.Range(“D”&varCount.Value=”“,则
退出
如果结束
如果varenvoiceid=varSheet.Range(“A”&varCount).Value和varPartyName=varSheet.Range(“B”&varCount).Value,则
varInvoiceTotal=varInvoiceTotal+varSheet.Range(“D”和varCount).Value
varInvoiceCount=varInvoiceCount+1
ElseIf varSheet.Range(“A”&varCount).Value=”“和varSheet.Range(“B”&varCount).Value=”“然后
varInvoiceTotal=varInvoiceTotal+varSheet.Range(“D”和varCount).Value
varInvoiceCount=varInvoiceCount+1
其他的
退出
如果结束
下一个
如果结束
设置varSheet=Nothing
选择案例返回类型
案例1'//仅计数
InvoiceDetail=varInvoiceCount
案例2'//仅限总数
InvoiceDetail=varInvoiceTotal
案例3'//总计[计数]
InvoiceDetail=varInvoiceTotal&“[”和varInvoiceCount&“]”
其他情况
InvoiceDetail=“错误”
结束选择
端函数
此代码显然假设您的发票ID在A列,您的参与方名称在B列,您的金额在D列。我也为您实现了一些选项:

=InvoiceDetail(A3,1)
返回发票上的项目数(整数)

=InvoiceDetail(A3,2)
返回发票上项目的总和(双倍)


=InvoiceDetail(A3,3)
返回sum和[count](作为字符串)

如果您能够使用VBA,则可以使用用户定义的函数。将此代码插入新模块并像调用普通excel函数一样调用它:

Public Function InvoiceDetail(Invoice As Range, ReturnType As Integer)

Dim varCount As Long
Dim varSheet As Worksheet
Dim varInvoiceID As String
Dim varPartyName As String
Dim varInvoiceTotal As Double
Dim varInvoiceCount As Integer

Set varSheet = ThisWorkbook.Sheets(Invoice.Parent.Name)

If varSheet.Range("A" & Invoice.Row).Value <> "" Then

    varInvoiceID = varSheet.Range("A" & Invoice.Row).Value
    varPartyName = varSheet.Range("B" & Invoice.Row).Value

    For varCount = Invoice.Row To 1000000

        If varSheet.Range("D" & varCount).Value = "" Then

            Exit For

        End If

        If varInvoiceID = varSheet.Range("A" & varCount).Value And varPartyName = varSheet.Range("B" & varCount).Value Then

            varInvoiceTotal = varInvoiceTotal + varSheet.Range("D" & varCount).Value
            varInvoiceCount = varInvoiceCount + 1

        ElseIf varSheet.Range("A" & varCount).Value = "" And varSheet.Range("B" & varCount).Value = "" Then

            varInvoiceTotal = varInvoiceTotal + varSheet.Range("D" & varCount).Value
            varInvoiceCount = varInvoiceCount + 1

        Else

            Exit For

        End If

    Next

End If

Set varSheet = Nothing

Select Case ReturnType

    Case 1 '// Count Only

        InvoiceDetail = varInvoiceCount

    Case 2 '// Total Only

        InvoiceDetail = varInvoiceTotal

    Case 3 '// Total [Count]

        InvoiceDetail = varInvoiceTotal & " [" & varInvoiceCount & "]"

    Case Else

        InvoiceDetail = "Error"

End Select


End Function
公共函数InvoiceDetail(发票作为范围,返回类型作为整数)
变长变长
将工作表设置为工作表
Dim varInvoiceID作为字符串
Dim varPartyName作为字符串
Dim VarienVoicetotal为双人
Dim varInvoiceCount为整数
Set varSheet=thisvoolk.Sheets(Invoice.Parent.Name)
如果varSheet.Range(“A”&Invoice.Row).Value为“”,则
varInvoiceID=varSheet.Range(“A”和Invoice.Row).值
varPartyName=varSheet.Range(“B”和Invoice.Row).Value
对于varCount=发票。行到1000000
如果varSheet.Range(“D”&varCount.Value=”“,则
退出
如果结束
如果varenvoiceid=varSheet.Range(“A”&varCount).Value和varPartyName=varSheet.Range(“B”&varCount).Value,则
varInvoiceTotal=varInvoiceTotal+varSheet.Range(“D”和varCount).Value
varInvoiceCount=varInvoiceCount+1
ElseIf varSheet.Range(“A”&varCount).Value=”“和varSheet.Range(“B”&varCount).Value=”“然后
varInvoiceTotal=varInvoiceTotal+varSheet.Range(“D”和varCount).Value
varInvoiceCount=varInvoiceCount+1
其他的
退出
如果结束
下一个
如果结束
设置varSheet=Nothing
选择案例返回类型
案例1'//仅计数
InvoiceDetail=varInvoiceCount
案例2'//仅限总数
InvoiceDetail=varInvoiceTotal
案例3'//总计[计数]
InvoiceDetail=varInvoiceTotal&“[”和varInvoiceCount&“]”
其他情况
InvoiceDetail=“错误”
结束选择
端函数
此代码显然假设您的发票ID在A列,您的参与方名称在B列,您的金额在D列。我也为您实现了一些选项:

=InvoiceDetail(A3,1)
返回发票上的项目数(整数)

=InvoiceDetail(A3,2)
返回发票上项目的总和(双倍)


=InvoiceDetail(A3,3)
返回sum和[count](作为字符串)

既然您可以选择将helper列置于一旁或隐藏,我们可以执行以下操作

在第3行开始的K列中,我放置了以下公式:

=IF(A3<>"",A3,K2)
IF(COUNTIF($K$3:K3,K3)=1,COUNTIF(K:K,K3),0)
这将给出与G列相同的结果。IF语句的第一部分是检查发票号是否是发票号的第一次出现。如果是计数发票编号出现的次数,则显示0

现在,如果要跳过计算发票中有多少项,可以使用sumproduct公式,如下所示:

=IF(A3<>"",SUMPRODUCT(($K$3:$K$12=A3)*$D$3:$D$12),"")
=IF(A3<>"",SUMPRODUCT((OFFSET($K$3,0,0,COUNT(K:K),1)=A3)*OFFSET($D$3,0,0,COUNT(K:K),1)),"")
=IF(A3“”,SUMPRODUCT($K$3:$K$12=A3)*$D$3:$D$12),“”)
现在来说明一个可变大小的列表
=ArrayFormula(if(A3:A>0,SUMIF(O3:O,O3:O,D3:D),""))