Function 电子表格-从姓名和出生日期的表格中提取一个参考日期的姓名列表,大约

Function 电子表格-从姓名和出生日期的表格中提取一个参考日期的姓名列表,大约,function,sorting,date,google-sheets,Function,Sorting,Date,Google Sheets,我以前发布过这个问题,得到了一半的答案。请看一下这个链接,以获得一个想法 这个解决方案几乎实现了,但有一些错误,现在无法联系到Yogi先生 让我再解释一遍 我希望实现的目标:我有一个成员及其生日的列表,我愿意手动输入这些数据。我正在尝试创建一张表,可以祝愿今天(当前日期)过生日的成员“生日快乐”,以及未来7天(从当前日期开始)过生日的成员列表。我可以将此表(特定单元格范围)发布到我的网页上 看一看。请随意复制一份进行编辑 如果你不明白,让我再解释一遍 A1和B1的标题分别称为姓名和生日 A2到

我以前发布过这个问题,得到了一半的答案。请看一下这个链接,以获得一个想法

这个解决方案几乎实现了,但有一些错误,现在无法联系到Yogi先生

让我再解释一遍

我希望实现的目标:我有一个成员及其生日的列表,我愿意手动输入这些数据。我正在尝试创建一张表,可以祝愿今天(当前日期)过生日的成员“生日快乐”,以及未来7天(从当前日期开始)过生日的成员列表。我可以将此表(特定单元格范围)发布到我的网页上

看一看。请随意复制一份进行编辑

如果你不明白,让我再解释一遍

A1B1的标题分别称为姓名和生日

A2A2000有名称(即user1、user2、user3等)

&B2B2000的出生日期为DD/MM/YYYY格式(即1980年12月13日、1990年5月25日、1984年2月31日)。年份可以是1950年到2000年之间的任意年份

(我随身带着这些姓名和生日数据,我会一个接一个地手动输入,或者我可以为我的用户在线发布电子表格)。所以A列和B列中没有公式

D2-此单元格没有公式,但我们可以在此处输入日期(这只是为了检查,所以无论何时我的工作表得到最终公式,我都可以根据我希望的任何日期进行检查)

E2-此单元格有公式,它检查D2是否有日期,如果是,则提取D2数据,如果D2为空,则通过此公式显示当前日期

=if(D2="",today(),D2) 
D6-此单元格有公式,它检查B2到B2000中的整个日期列表,或者可以说是整个B列,如果任何日期与E2(当前日期或我在D2中写入的日期)匹配,则它会提取该用户的姓名并用逗号显示。例如,如果E2中的值为2014年11月16日,则D6公式使用完整的B列检查该日期,如果发现任何匹配项,则将名称拉入A列的同一行,并在此处显示。如果没有找到匹配项,则显示“今天没有会员生日”。D6的公式为

=if(iferror("Happy Birthday to "&join(", ",filter(A:A,month(B:B)=month( E2),day(B:B)=day(E2))))=0,"No Member's Birthday Today",iferror("Happy Birthday to "&join(", ",filter(A:A,month(B:B)=month( E2),day(B:B)=day(E2)))))
E9-此单元格没有公式,其目的只是放置一些数字(天数),可用于D11的公式中。例如,如果我们在单元格E9中输入数字“7”,则D11中的公式将对未来7天内有生日的用户列表进行排序(从当前日期或从D2中输入的日期开始)。例如,如果D2为空,E2将显示当前日期,如2014年11月16日,如果我们在E9中输入数字7,则D11公式将搜索未来7天(2014年11月17日至2014年11月23日)内有生日的用户/出生日期,并显示D11中有日期的用户列表

现在怪物来了

D11-此单元格有公式,事实上是此表最重要的公式(目前尚不完善)

假设E2的日期为2014年11月16日,E9的日期为7号。然后D11公式应该在B列中检查/搜索未来7天的日期,如果发现任何匹配项,它应该从同一行(A列)中提取用户名,并显示如下内容

  • 11月17日-用户3、用户888、用户75。(这些用户的生日是11月17日,即当前日期(即将到来的一天)的第二天)
  • 11月18日-用户22、用户975、用户666、用户1091(这些用户的生日为11月18日,即从当前日期算起的后天。)
  • 11月20日-用户99(此用户生日为11月20日)
上面的列表最多可以达到7行或更少,因为我在单元格E9中给出了7天的范围

现在,Yogi先生帮助我学习了D11公式,但公式不完整,有一些错误,D11的公式是

=ArrayFormula(substitute(trim(transpose(split(concatenate({(if(unique(ArrayFormula(filter(TEXT(B:B,"dd/mm"),date(0,month(B:B),day(B:B))>date(0,month(E2),day(E2)),date(0,month(B:B),day(B:B))<=date(0,month(E2),day(E2)+E9))))=transpose(ArrayFormula(filter(TEXT(B:B,"dd/mm"),date(0,month(B:B),day(B:B))>date(0,month(E2),day(E2)),date(0,month(B:B),day(B:B))<=date(0,month(E2),day(E2)+E9)))),transpose((query({A:A,text(B:B,"dd/mm")},"select Col1 where '"&join(", ",unique((filter(TEXT(B:B,"dd/mm"),date(0,month(B:B),day(B:B))>date(0,month(E2),day(E2)),date(0,month(B:B),day(B:B))<=date(0,month(E2),day(E2)+E9)))))&"' contains Col2")) ),))&" ",transpose(split(rept(Char(10)&char(9),countunique((filter(TEXT(B:B,"dd/mm"),date(0,month(B:B),day(B:B))>date(0,month(E2),day(E2)),date(0,month(B:B),day(B:B))<=date(0,month(E2),day(E2)+E9))))),char(9)))}),char(10))))," ",", ")&" - "&unique((filter(TEXT(B:B,"dd/mm"),date(0,month(B:B),day(B:B))>date(0,month(E2),day(E2)),date(0,month(B:B),day(B:B))<=date(0,month(E2),day(E2)+E9)))))

=ArrayFormula(替换)日期(0,月(E2),日(E2),日期(0,月(B),日(B),日(0,月(B),日(E2),日(E2),日(0,月(B:B),日(B:B))日期(0,月(E2),日(B:B))日期(0,月(E2),日(E2)),日(0,月(B),日(B:B))日期(0,月(B),日(E2),日(B:B),月(B),日)日期(B),日(B:B),日,月(B)日,日,日,日,日,日,日)(B:B)日期(0,月(E2),日(E2)),日期(0,月(B:B),日(B:B))如果2月29日不是下一个
E9
天的有效日期,则不会列出该日期(因此在这一天出生的人将错过约75%的时间)。我将等待OP关于如何管理该日期的建议

=ArrayFormula(转置(REGEXREPLACE(TRIM)(查询({TEXT(E2+列(偏移量(A1,1,E9)),“dd/mm”)和“-”报告(A2:A&“,”,TEXT(B2:B,“dd/mm”)=文本(E2+列(偏移量(A1,1,E9)),“dd/mm”)))),匹配(文本(E2+列(偏移量(A1,1,E9)),“dd/mm”),“dd/mm”),文本(B2:B,“dd/mm”),“dd/mm”),“0”),,,“行(A2:A)++1,”,“,“,”,”,“,“,”,”,“,“,”,“,”,“,”,“,”


我会(尝试)如果有人要求解释逻辑,但冒着被指责的风险,我暂时不说。

感谢@pnuts的输入@pnuts下一个闰年是2016年2月29日,它正在使用它。但是为什么#2014年12月31日不适用!!!如果今年不是闰年,你希望如何管理29/2出生的人-将他们与28/2联系起来?或者可以吗只列出29/2的日期,即使它不在本年度发生(稍微容易一点)?谁会责骂你?我喜欢解释!哈哈,我的意思是我会因为不解释而被责骂。这可能是有道理的。我会稍后再讨论这个问题并尝试解释。@AdamL很抱歉因为我不在城里,所以回复晚了。感谢公式,这非常有用,但我在D6中发现了一个错误。如果我们输入2014年12月30日这样的日期(dd-mm-yyyy)在D2中,然后D6显示无限的逗号。我认为我们需要改进D6公式。您能解释一下这件事吗。这是准备编辑的excel示例文件。