Arrayformula 查找日期范围内的重叠
Arrayformula to find overlaps in date ranges
在上一个问题中可以找到here, the following formula to find overlaps in date ranges was kindly provided by Mr Shane:
=ARRAYFORMULA(TEXTJOIN(", ",TRUE,IF(($A1<=$B:$B)*($B1>=$A:$A)*($C1=$C:$C),IF(ROW($A:$A)=ROW(),"","Row"&ROW($A:$A)),"")))
往下拉的结果是(D列):
#
A
B
C
D
1
01/01/2022
02/01/2022
Task1
Row3
2
01/15/2022
02/15/2022
Task2
3
01/29/2022
02/03/2022
Task1
Row1, Row3
4
01/18/2022
02/22/2022
Task3
5
02/02/2022
02/15/2022
Task1
Row3
问题是:可以用数组公式代替吗?
建议
也许您可以使用 自定义 Google Sheet 函数 (=findOverlaps()
) 使用脚本模仿 ARRAYFORMULA
行为。您可以查看下面的示例脚本,您可以将其添加为电子表格文件中的绑定脚本:
Follow this quick guide on how to add a bound script in your spreadsheet.
自定义函数脚本
function findOverlaps(arr) {
var res = [];
var filtered = arr.filter((data,index)=>{
return data[2] == arr.map((data)=>{return data[2]}).filter((a, i, aa) => aa.indexOf(a) === i && aa.lastIndexOf(a) !== i) ? data.push((parseInt(index)+1)) : null;
});
filtered.map((data,index)=>{
for(var x=0; x < 2; x++){
filtered.map((check)=>{
res.push([arr.map((data)=>{return data[2]}).filter((a, i, aa) => aa.indexOf(a) === i && aa.lastIndexOf(a) !== i).join(''),data[3],dateRangeOverlaps((filtered[parseInt(index)][x]),check[0],check[1], check[3])]);
});
}
});
res = res.filter((z)=>{return z[0] == 'Task1' && z[2] != 'x' ? z[2] : ''});
return arr.map((x,index)=>{
return res.map((look)=>{
if((parseInt(index)+1) == look[1]){
return "Row"+look[2];
}
}).filter((fn)=>{return fn}).join(', ')
});
}
function dateRangeOverlaps(currentDateToCheck, startDate, endDate, row) {
return (currentDateToCheck > startDate && currentDateToCheck < endDate) ? row : 'x'
}
示范[=18=]
See this sample:
在上一个问题中可以找到here, the following formula to find overlaps in date ranges was kindly provided by Mr Shane:
=ARRAYFORMULA(TEXTJOIN(", ",TRUE,IF(($A1<=$B:$B)*($B1>=$A:$A)*($C1=$C:$C),IF(ROW($A:$A)=ROW(),"","Row"&ROW($A:$A)),"")))
往下拉的结果是(D列):
# | A | B | C | D |
---|---|---|---|---|
1 | 01/01/2022 | 02/01/2022 | Task1 | Row3 |
2 | 01/15/2022 | 02/15/2022 | Task2 | |
3 | 01/29/2022 | 02/03/2022 | Task1 | Row1, Row3 |
4 | 01/18/2022 | 02/22/2022 | Task3 | |
5 | 02/02/2022 | 02/15/2022 | Task1 | Row3 |
问题是:可以用数组公式代替吗?
建议
也许您可以使用 自定义 Google Sheet 函数 (=findOverlaps()
) 使用脚本模仿 ARRAYFORMULA
行为。您可以查看下面的示例脚本,您可以将其添加为电子表格文件中的绑定脚本:
Follow this quick guide on how to add a bound script in your spreadsheet.
自定义函数脚本
function findOverlaps(arr) {
var res = [];
var filtered = arr.filter((data,index)=>{
return data[2] == arr.map((data)=>{return data[2]}).filter((a, i, aa) => aa.indexOf(a) === i && aa.lastIndexOf(a) !== i) ? data.push((parseInt(index)+1)) : null;
});
filtered.map((data,index)=>{
for(var x=0; x < 2; x++){
filtered.map((check)=>{
res.push([arr.map((data)=>{return data[2]}).filter((a, i, aa) => aa.indexOf(a) === i && aa.lastIndexOf(a) !== i).join(''),data[3],dateRangeOverlaps((filtered[parseInt(index)][x]),check[0],check[1], check[3])]);
});
}
});
res = res.filter((z)=>{return z[0] == 'Task1' && z[2] != 'x' ? z[2] : ''});
return arr.map((x,index)=>{
return res.map((look)=>{
if((parseInt(index)+1) == look[1]){
return "Row"+look[2];
}
}).filter((fn)=>{return fn}).join(', ')
});
}
function dateRangeOverlaps(currentDateToCheck, startDate, endDate, row) {
return (currentDateToCheck > startDate && currentDateToCheck < endDate) ? row : 'x'
}
示范[=18=]
See this sample:
See this sample: