【问题标题】:Filling a calendar using Arrayformula or LOOKUP使用 Arrayformula 或 LOOKUP 填充日历
【发布时间】:2021-08-17 05:00:59
【问题描述】:

我制作了一个日历表,并希望使用 Arrayformula 或某种查找来填充它。 问题是,每个单元格中的代码是不同的,我是否需要它们都是相同的代码,或者是否可以做一个 Arrayformula 为每一行执行不同的公式?

我花了很长时间让日历代码正常工作,但现在想简化代码,但我不确定下一步应该是什么:

https://docs.google.com/spreadsheets/d/1u_J7bmOFyDlYXhcL5dW3CHFJ1esySAKK_yPc6nFTdLA/edit?usp=sharing

任何建议将不胜感激。

【问题讨论】:

    标签: date google-sheets calendar lookup array-formulas


    【解决方案1】:

    我在您的文件中添加了一个名为“Aresvik”的新工作表。

    绿色单元格有新公式。

    单元格B3 可以是=date(B1,1,1)

    那么每个连续的月份可以是=eomonth(B3,0)+1=eomonth(J3,0)+1等。

    单元格B5中的日期公式为:

    =arrayformula(iferror(vlookup(sequence(7,7,1),{array_constrain(sequence(40,1),day(eomonth(B3,0))+weekday(B3,3),1),query({flatten(split(rept(",",day(eomonth(B3,0))-1),",",0,0));sequence(day(eomonth(B3,0)),1,1)},"offset "&day(eomonth(B3,0))-weekday(B3,3)&" ",0)},2,false),))

    可以复制到Mo下面的其他单元格,所以B5会变成J5R5Z5等。

    备注

    这个概念围绕着使用SEQUENCE 函数来生成一个6 行7 列的数字网格:

    sequence(6,7)

    看起来像这样:

     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30 31 32 33 34 35
    36 37 38 39 40 41 42
    

    然后在VLOOKUP 中使用这些数字来获取日历的对应日期。如果一个月的第一天是星期四(2021 年 4 月),则 vlookup 范围需要在日期列表的顶部有 3 个间隙。 player0 比我原来的query 使用offset 有一个更优雅的解决方案,所以我在下面合并了它。单元格 Z3 是日期 1/4/2021:

    =arrayformula(
    iferror(
    vlookup(sequence(6,7),
       {sequence(day(eomonth(Z3,0))+weekday(Z3,2),1,0),
       {iferror(sequence(weekday(Z3,2),1)/0,);sequence(day(eomonth(Z3,0)),1,Z3)}},
    2,false)
    ,))
    

    vlookup 范围的第一列是:

    sequence(day(eomonth(Z3,0))+weekday(Z3,2),1,0)

    这是一个从0开始的数字数组,对应于当月的天数加上第一天之前的间隔数。

    vlookup 范围内的第二列是:

    {iferror(sequence(weekday(Z3,2),1)/0,);sequence(day(eomonth(Z3,0)),1,Z3)}},

    这是一个包含 2 列的数组,格式为:{x;y},其中y 位于x 下方,因为;

    这些是空白:iferror(sequence(weekday(Z3,2),1)/0,),后面是日期数字:sequence(day(eomonth(Z3,0)),1,Z3)

    (以下示例为 2021 年 4 月):

    0   
    1   
    2   
    3   
    4   
    5   
    6   44317
    7   44318
    8   44319
    9   44320
    10  44321
    11  44322
    12  44323
    13  44324
    14  44325
    15  44326
    16  44327
    17  44328
    18  44329
    19  44330
    20  44331
    21  44332
    22  44333
    23  44334
    24  44335
    25  44336
    26  44337
    27  44338
    28  44339
    29  44340
    30  44341
    31  44342
    32  44343
    33  44344
    34  44345
    35  44346
    36  44347
    

    vlookup 获取初始序列(6x7 布局)中的每个数字,并根据 col1 中的匹配从范围中的 col2 中带回相应的日期。

    当月的第一天是星期一时,iferror(sequence(weekday(BB1,2),1)/0,) 会在 vlookup 范围的 col2 中生成一个间隙。这就是为什么 vlookup 范围中的 col1 必须以 0 开头的原因。

    我在https://docs.google.com/spreadsheets/d/1u_J7bmOFyDlYXhcL5dW3CHFJ1esySAKK_yPc6nFTdLA/edit#gid=68642071更新了表格

    日历上的值是日期,所以格式必须是d

    如果你想要数字,那么使用:

    =arrayformula(
    iferror(
    vlookup(sequence(6,7),
       {sequence(day(eomonth(Z3,0))+weekday(Z3,2),1,0),
       {iferror(sequence(weekday(Z3,2),1)/0,);sequence(day(eomonth(Z3,0)),1)}},
    2,false)
    ,))
    

    【讨论】:

    • 太神奇了,每个单元格包含整个日期有多难(所以在 1 月,[1] 框包含 1/1/2021 格式为仅显示 [1]),因为我有很多条件格式规则,它们依赖于每个单元格中的实际日期。这很容易解决吗?
    • @JoeW easy fix... 添加 (B3-1) i.stack.imgur.com/u1Py8.png 并将其格式化为日期 i.stack.imgur.com/vbsDV.png 然后您将得到 i.stack.imgur.com/nHlKM.png
    • 太棒了!我等不及要像你们一样擅长这个了?
    【解决方案2】:

    更短的解决方案:

    =INDEX(IFNA(VLOOKUP(SEQUENCE(6, 7), {SEQUENCE(DAY(EOMONTH(B3, ))+WEEKDAY(B3, 2), 1, ), 
     {IFERROR(ROW(INDIRECT("1:"&WEEKDAY(B3, 2)))/0); SEQUENCE(DAY(EOMONTH(B3, )), 1, B3)}}, 2, )))
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 2016-07-11
      • 2019-05-12
      • 2013-01-25
      • 1970-01-01
      • 2020-10-14
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多