电子表格 - 从名称和出生日期表中拉出一个参考日期和那里的名称列表

时间:2014-11-27 00:24:08

标签: function sorting date google-sheets

我之前发过这个问题,得到了半解决方案。请看看这个链接以获得一个想法。

解决方案几乎已经实现,但the function posted by Mr. Yogi有一些错误,现在Yogi先生无法访问。

让我再说一遍。

我希望实现的目标:我有一份会员及其出生日期清单,我愿意手动输入这些数据。我正在努力制作一张可以祝生日快乐的纸张。今天有生日的会员(当前日期)和在接下来的7天(从当前日期)过生日的会员名单。我可以在我的网页上发布这张表(特定单元格范围)。

看看sample sheet。随意拍摄副本进行编辑。

screenshot

如果你没有得到它,让我再一次解释一切

A1 & B1 的标题名为NAMES&生日分别。

A2 A2000 有名称(即user1,user2,user3等)

&安培; B2 B2000 以DD / MM / YYYY格式生日(即13-12-1980,25-05-1990,31-2-1984)年可以在任何地方从1950年到2000年。

(我有这个名字和生日数据,我将逐个手动或者我可以在线为我的用户发布电子表格表格)。因此A列和A列中没有公式。乙

D2 - 这个单元格没有公式,但是我们可以在这里输入日期(这只是为了检查,所以每当我的表格得到它的最终公式时,我都可以用我希望的任何日期来检查它)

E2 - 此单元格有公式,它检查D2是否有某个日期,如果是,则拉取d2数据,如果d2为空,则按此公式显示当前日期

=if(D2="",today(),D2) 

D6 - 此单元格有公式,它会检查B2到B2000中的整个日期列表,或者可以说整列B,如果有任何日期与E2匹配(当前日期或日期)由我写在D2)然后它拉出该用户的名字并用逗号显示。例如,如果E2中的值是16-11-2014,则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公式的数字(天数)。例如,如果我们输入数字" 7"在单元格E9中,则D11中的公式将对即将到来的7天(从当前日期或从D2中输入的日期)生日的用户列表进行排序。例如,如果D2为空,E2将显示当前日期,例如16-11-2014,如果我们将数字7放入E9,则D11公式搜索在即将到来的7天(2014年11月17日至17日)生日的用户/出生日期23-11-2014)并显示日期为D11的用户列表。

现在来了MONSTER

D11 - 此单元格具有公式,对于此表格而言是最重要的公式(目前还不完美)。

假设E2的日期为16-11-2014& E9的编号为7.然后D11公式应该检查/搜索B列中的下一个7天日期,如果找到任何匹配,它应该从同一行(从A列)中提取用户名,并且应该显示类似的内容

  • 17/11 - user3,user888,用户75.(这些用户的生日是17/11,即当前日期(即将到来的一天)的第二天)
  • 18/11 - user22,user975,user 666,user 1091(这些用户在18/11之后生日,这是从当前日期开始的后天。)
  • 20/11 - user99(20/11的用户生日)
  • ...

上面的列表可以达到最多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)))))

以上公式有一些错误,如果我们在D2中输入年终结束日期(例如31-12-2014,在E9中输入7天的范围)则不起作用。请修复此问题,以便显示即将到来的7天(1月)即将到来的生日用户的生日

我发现的另一个错误是,如果我们输入日期为29-02-2014,D11说#N / A 为什么会这样!所有其他日期都工作正常,那么为什么与去年2月的敌意。

我希望改变的更多内容,

1。 D11应先显示日期,然后再显示姓名(而不是先显示名字,然后再显示日期) 喜欢这个

  • 15-04 - user1,user2
  • 21-04 - user3,user4
  • 27-04 - user11,user6,user88,user509

我认为这对你来说很容易,只是改变位置(虽然我不知道,怎么做:))

2。单元格D11中的日期不符合规定,请修复此问题。它应该是这样的

  • 15-04 - user1,user2
  • 21-04 - user3,user4
  • 27-04 - user11,user6,user88,user509

而不喜欢这个

  • 21-04 - user3,user4
  • 15-04 - user1,user2
  • 27-04 - user11,user6,user88,user509

查询&amp;解释结束。

很少有建议(想法)出现在我脑海中:

#2 我觉得很容易,我不知道怎么做,但无论如何我们可以按日期(升序)对B列进行排序(或者通过拉动并将其排序到C列) )。据我所知,我认为YEAR在任何公式中都没有作用,公式仅适用于mm(月)和dd(日期),所以为什么不在C列中仅对dd / mm进行排序然后将其拉到D11公式。嗯,这只是猜测

感谢您的所有时间和精力。

等待......

1 个答案:

答案 0 :(得分:1)

如果它不是下一个E9天的有效日期,则不会列出2月29日(因此在这一天出生的人将错过~75%的时间)。我将等待OP关于如何管理这个问题的建议。

=ArrayFormula(TRANSPOSE(REGEXREPLACE(TRIM(QUERY(FILTER({TEXT(E2+COLUMN( OFFSET(A1,,,1,E9)),"dd/mm")&" - ";REPT(A2:A&", ",TEXT(B2:B,"dd/mm")=TEXT(E2+COLUMN( OFFSET(A1,,,1,E9)),"dd/mm"))},MATCH(TEXT(E2+COLUMN(OFFSET(A1,,,1,E9)),"dd/mm"), TEXT(B2:B,"dd/mm"),0)),,ROWS(A2:A)+1)),",$","")))

如果有要求,我会(尝试)解释逻辑,但是冒着指责的风险,我现在不会这样做。