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

Link to the sheet

问题是:可以用数组公式代替吗?

建议

也许您可以使用 自定义 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: