Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google sheets 用于查找Google工作表中包含值的最后一行的数组公式_Google Sheets_Array Formulas - Fatal编程技术网

Google sheets 用于查找Google工作表中包含值的最后一行的数组公式

Google sheets 用于查找Google工作表中包含值的最后一行的数组公式,google-sheets,array-formulas,Google Sheets,Array Formulas,我有一个通过Zapier集成自动填充的Google表单。对于添加的每一行,我都需要计算一个给定的单元格(Shipper Name),以查找前几行中Shipper Name的最后一个实例,如果是,则返回最后一个条目的行# 我试图创建一个公式,它只查看新行中的名称,并返回具有该名称的最近一行的编号 公式需要作为数组公式运行,以便使用添加到工作表中的每一新行自动填充数据 我尝试过使用这个公式,但是当重构为数组公式时,它不会为新行填充新值,它只是为所有行重复第一个值 第J行: =sumproduct(

我有一个通过Zapier集成自动填充的Google表单。对于添加的每一行,我都需要计算一个给定的单元格(Shipper Name),以查找前几行中Shipper Name的最后一个实例,如果是,则返回最后一个条目的行#

我试图创建一个公式,它只查看新行中的名称,并返回具有该名称的最近一行的编号

公式需要作为数组公式运行,以便使用添加到工作表中的每一新行自动填充数据

我尝试过使用这个公式,但是当重构为数组公式时,它不会为新行填充新值,它只是为所有行重复第一个值

第J行:

=sumproduct(max(row(A$1:A3)*(F4=F$1:F3)))
我需要将这个公式重构为一个数组公式,自动填充它下面的所有单元格

我尝试过这个版本,但不起作用:

=ArrayFormula(IF(ISBLANK($A2:$A),"",sumproduct(max(row(A$1:A3)*($F4:$F=F$1:F3))))
脚本(可能是自定义函数?)会更好

解决方案1 下面是一个可以放入标题中的公式(放入
J1
,删除下面的所有内容)

它的工作速度比第二种解决方案快得多,并且没有N²大小限制。它也适用于空托运人(
&)♥"
用于那些空的列):只要
A:A
列有一些值,它就不会被忽略

={
“最后一项的行”;
阵列公式(
如果(
A2:A=“”,
"",
瓦卢库普(
行(F2:F)
+瓦卢库普(
F2:F&“♥", 
{
唯一(F2:F&“♥"),
序列(行(唯一(F2:F)))
*功率(10,整数(LOG10行(F:F))+1)
},
2.
0
),
分类(
{
行(F2:F)+1
+瓦卢库普(
F2:F&“♥", 
{
唯一(F2:F&“♥"),
序列(行(唯一(F2:F)))
*功率(10,整数(LOG10行(F:F))+1)
},
2.
0
),
行(F2:F);
{
序列(行(唯一(F2:F)))
*功率(10,整数(对数10(F:F)))+1,
序列(行(唯一(F2:F)),1,0,0)
}
},
1.
1.
),
2.
1.
)
)
)
}

有关其工作原理的详细信息
  • 对于每一行,我们使用
    VLOOKUP
    在已排序的虚拟范围内搜索一个特殊编号,以获得与当前匹配的前一个条目的行号
  • 行的特殊编号是这样构造的:我们在唯一条目中为当前条目获取一个序列号,并将当前行号附加到该序列号上
  • 结果特殊编号的右侧部分(行号)必须在它们之间对齐。如果条目的序号为13,行号为1234,共有100500行,则编号必须为
    13001234
    001234
    是对齐的右侧部分
  • 对齐是通过将序列号乘以10乘以
    (log10(总行数)+1)
    ,得到
    13000000
    (来自上面的示例)。这种方法用于避免使用
    LEN
    TEXT
    -使用数字比使用字符串更快
  • 虚拟范围在第一列中的特殊编号与在第二列中的原始行编号几乎相同
  • 几乎相同的特殊数字:它们只是增加了1,因此
    VLOOKUP
    最多会在与当前字符串对应的数字之前停止一步
  • 此外,virtual range还有一些特殊行(在排序之前添加在底部),这些行的所有
    0
    都作为其特殊编号(第1列)的右侧部分,而
    0
    则作为行号(第2列)。这样一来
    VLOOKUP
    将在条目的第一次出现时找到它
  • 虚拟范围已排序,因此我们可以使用外部
    VLOOKUP
    is_sorted
    参数设置为1:这将导致最后一个匹配小于或等于正在查找的数字
  • &”♥“
    被附加到条目中,这样就可以通过
    VLOOKUP
    找到空条目

解决方案2-速度慢且有限制 但对于一些足够小的行数,此公式有效(放入
J1
,删除以下所有内容):

={
“最后一项的行”;
阵列公式(
正则抽取(
转置(
如果(
(FILTER(行(F2:F),F2:F“”)>转置(FILTER(行(F2:F),F2:F“”))
*(FILTER(F2:F,F2:F“”)=转置(FILTER(F2:F,F2:F“”)),
转置(过滤器(行(F2:F),F2:F“”),
""
)
),行(筛选器(F2:F,F2:F“”),
“(\d*)\s*$”
)
)
}
但有一个问题。公式中的虚拟范围大小为N²,其中N是行数。对于当前的1253行,它可以工作。但有一个限制,超过该限制后,它将抛出范围过大的错误

这就是为什么要使用
过滤器(…)
,而不仅仅是
F2:F

脚本(可能是自定义函数?)会更好

解决方案1 下面是一个可以放入标题中的公式(放入
J1
,删除下面的所有内容)

它比第二个解决方案快得多,并且没有N²大小限制。它还适用于空托运人(
&)♥“
用于那些空列):只要
A:A
列有一些值,它就不会被忽略

={
“最后一项的行”;
阵列公式(
如果(
A2:A=“”,
"",
瓦卢库普(
行(F2:F)
+瓦卢库普(
F2:F&“♥", 
{
唯一(F2:F&“♥"),
序列(行)(唯一)
=ARRAYFORMulA({"Good Timestamp";IF(A2:A="",,MMULT(N(IFERROR(SPLIT(A2:A,"T"))),{1;1}))})
=ARRAYFORMULA({"Minutes/Order";IF(A2:A="",,IF(IFERROR((G2:G-1*SUBSTITUTE(LOOKUP(F2:F&G2:G-0.00001,SORT(F2:F&G2:G)),F2:F,""))*24*60)>200,,IFERROR((G2:G-1*SUBSTITUTE(LOOKUP(F2:F&G2:G-0.00001,SORT(F2:F&G2:G)),F2:F,""))*(24*60))))})
=QUERY({'Sample Data'!F:I},"Select Col1,AVG(Col3),COUNT(Col3)/(SUM(Col3)/60) where Col3 is not null group by Col1 label COUNT(Col3)/(SUM(Col3)/60)'Orders/ hour',AVG(Col3)'Minutes/ Order'")