输入:
工作室 | 新年 | 数字 |
---|---|---|
A | X-X | 3 |
A | X-X | 1 |
A | O-O | 8 |
B | X-X | 1 |
B | X-X | 2 |
C | X-X | 1 |
B | O-O | 4 |
B | X-X | 3 |
A | X-X | 5 |
C | X-X | 2 |
C | X-X | 3 |
A | O-O | 1 |
A | O-O | 2 |
A | O-O | 2 |
A | O-O | 4 |
C | O-O | 1 |
C | O-O | 1 |
输出:(在单个单元格中)
缺失号码:
A:(O-O):3,5,6,7(X-X):2,4
B:(O-O):1,2,3
说明:
对于“FIN YEAR”X-X 中的“STUDIO”A,缺少数字 2,4,O-O 3,5,6,7 类似。
对于“FIN YEAR”X-X 中的“STUDIO”B,没有缺少数字,但对于 O-O 1,2,3(因此仅显示 (O-O))。
对于“FIN YEAR”X-X & O-O 中的“STUDIO”C,没有缺失的号码。 (所以 C: 不显示)。
注意:
每个“STUDIO”的每个“FIN YEAR”的数字从 1 开始。
数字可以重复任意次数。
每个输入都是随机的,任何列都没有顺序。
请帮我用公式来实现给定的输出。
您可以使用以下 2 种方法来查找缺失的号码:
方法1:Google表格公式
=let(
studio, "A",
arr, sort(filter(A2:C, A2:A=studio),2,0),
arr_x, torow(unique(filter(arr, index(arr,,2)="X-X"))),
arr_o, torow(unique(filter(arr, index(arr,,2)="O-O"))),
find_x, IFNA(join(",", torow(filter(sequence(max(arr_x),1,1), countif(arr_x,sequence(max(arr_x),1,1))=0))),"No Missing"),
find_o, IFNA(join(",", torow(filter(sequence(max(arr_o),1,1), countif(arr_o,sequence(max(arr_o),1,1))=0))),"No Missing"),
output, map(unique(index(arr,,2)), vstack(find_x,find_o), lambda(a,b,concat(concat(a,": "), b))),
join(char(10), "MISSING NUMBERS:", concat(studio,":"), output)
)
注意: 如果您使用 Google Sheets 公式,您需要注意两个限制: (1) 您需要在公式中手动输入
Studio
字母或使用下拉菜单选择 Studio
字母。 (2) 如果您要添加新的 Studio
字母,则需要同时拥有 X-X
和 O-O
对。
输出:
方法 2:Google Apps 脚本
function missingNumbers(data) {
// map studio letters
const letters = [... new Set(data.map(x => x[0][0]))]
return "MISSING NUMBERS:\n\n" + letters.map((l) => {
//filters Fin Year
const uniqueFinYear = [... new Set(data.filter(x => x[0][0] == l).map(x => x[1]))];
//check sequence of number
const res = uniqueFinYear.map(x => data.filter(d => d[1] == x).filter(d => d[0] == l))
.map(x => {
return x.map(y => y[2]).sort((a, b) => a - b).map((d, i, arr) => d + 1 == arr[i + 1] || d == arr[i + 1])
.filter((x, i, arr) => arr.length == 1 && x == false ? true : i !== arr.length - 1 && x == false)[0] == false && x
}).filter(x => x);
return res.map((x) => {
if (x.length > 0) {
const newArr = Array.from({ length: Math.max(...x.map(x => x[2])) }, (_, index) => index + 1);
return `${[... new Set(x.map(x => x[0]))]}: (${[... new Set(x.map(x => x[1]))]}): ${newArr.map(z => [... new Set([... new Set(x.map(x => x[2]).sort((a, b) => a - b))]
.map(y => y != z && z))].length == 1 && [... new Set([... new Set(x.map(x => x[2]).sort((a, b) => a - b))]
.map(y => y != z && z))]).flat().filter(d => d).join(',')} `;
}
}).join('');
}).join(" \n");
}
在扩展 > Apps 脚本中添加上面的代码。然后在
missingNumbers
单元格中调用函数名称 E2
。这将起到自定义公式的作用。
输出:
参考资料:
这是您可以测试的一种方法:
=iferror(let(Λ,map(A2:A,B2:B,lambda(a,b,join(",",let(Σ,sequence(maxifs(C:C,A:A,a,B:B,b)),ifna(filter(Σ,isna(xmatch(Σ,filter(C:C,A:A&B:B=a&b))))))))),
Γ,unique(filter({A2:A&":","("&B2:B&"): "&Λ},Λ<>"")), Ξ,index(Γ,,1), join(char(10),vstack("MISSING NUMBERS:",,map(unique(Ξ),lambda(x,concat(x&" ",join(" ",filter(index(Γ,,2),Ξ=x)))))))),"-_-")
也许这有帮助:
=ARRAYFORMULA(LET(a, A2:A20, b, B2:B20, c, C2:C20,
p, "max(Col3) where Col3>1 group by Col1,Col2 label max(Col3)''",
q, "select max(Col2) group by Col2 pivot Col1",
f, FLATTEN(INDEX(QUERY({a&":đ("&b&"):¤×", {b,c}}, "select Col1,"&p, ),, 1)&
BYROW(QUERY({a,b,c}, "select "&p, ), LAMBDA(c, MAKEARRAY(1,c,LAMBDA(c,r,r))))),
SUBSTITUTE("MISSING NUMBERS:Đ"&TEXTJOIN(, 1, "Đ"&TRIM(QUERY(QUERY(SPLIT(SUBSTITUTE(
REGEXREPLACE(FLATTEN(TRIM(QUERY(QUERY(SPLIT(QUERY(FILTER(f,
NOT(COUNTIF({a&":đ("&b&"):¤×"&c}, f))), "where not Col1 ends with '×'", )&",", "×"),
q),,9^9))), "\s|,$", ), "¤", " "), "đ"), q),,9^9))), "Đ", CHAR(10))))