提问人:Nathan L 提问时间:10/5/2023 更新时间:10/5/2023 访问量:40
Google 表格数组公式问题
Google Sheets Array Formula issue
问:
该公式的目标是获取起始余额,并使用预先确定值的排序列表对其进行分解。唯一的问题是,三个最大的值只能使用一次,而较小的值可以根据需要多次使用,以在最短的步长内将余额减少到零。
该表可以在这里找到。
B 列包含余额可以减少的预定值(按从小到大排序) C 列显示起始余额(使用复选框随机化),然后在删除值时显示运行余额。 D 列应该是运行余额减少的值的递减列表。
数组公式位于 D2 中,如下所示; =ArrayFormula(IF(C2:C25>=0,IF(C2:C25>=$B$11,IF(COUNTIF(D$2:D2, $B$11)=0, $B$11,IF(C2:C25>=$B$10,IF(COUNTIF(D$2:D2, $B$10)=0, $B$10,IF(C2:C25>=$B$9, IF(COUNTIF(D$2:D2, $B$9)=0, $B$9, IF(C2:C25>0,指数($B$2:$B$8,匹配(C2,$B$2:$B$8,1),0))))))))))
您可以使用该复选框为新的随机数设定种子。
当起始余额大于预定列表中的最大值 ($250) 但与其他所有值一起返回 FALSE 时,该公式将产生结果。
任何帮助将不胜感激。
答:
在这里,您有一个选择:
作为第一步,我更改了您的第一个公式,以便您可以获得一些小数。=RANDBETWEEN(1,50000)/100
对于公式,我嵌套了两个 REDUCE 函数,一个用于只需要抓取一次的前三个值,另一个用于其他值:
=LET(bigger,REDUCE("Decrease by",SORT(B9:B11,1,0),LAMBDA(a,v,IF(v<=(C2-IFERROR(SUM(a))),VSTACK(a,v),a))),
REDUCE(bigger,SORT(B2:B8,1,0),LAMBDA(a,v,IF(v=0,{a;0},IF(v<=(C2-IFERROR(SUM(a))),VSTACK(a,INDEX(IF(SEQUENCE(ROUNDDOWN((C2-IFERROR(SUM(a)))/v)),v))),a)))))
首先,我检查该值是否小于先前值的累积总和,表示为 C2 - “a”中的值之和。如果它较小,则会堆叠该值。
有了三个较大值的列表,然后我再次使用 REDUCE,但首先我检查 v=0,所以它在那个时候停止。然后,它抓取每个值并检查它是否小于累积总和,但这次它会堆叠累积总和可以除以它的所有时间。我用 SEQUENCE 部分来做到这一点,并把“v”而不是实际的序列放在 .INDEX(IF(SEQUENCE(ROUNDDOWN((C2-IFERROR(SUM(a)))/v)),v)))
最后一个“a”是跳过小于累积总和的值
评论