如何使用 arrayformula 自动填充日期

How to autofill dates using arrayformula

我正在使用 Google sheets 进行数据输入,只要有人提交表单,它就会自动从我的网站填充数据。用户的数据导入我的 sheet 带有时间戳(A 列)。

使用 Arrayformula 函数,我想要一列自动填充该月内时间戳的所有日期。例如,如果输入 1/5/2016 作为时间戳,我希望公式自动填充日期 1/1/2016 - 1/31/2016。

此外,我想在 Arrayformula 列中添加其他月份。例如,如果在 A 列中同时输入 1/5/2016 和 2/3/2016,我希望公式填写从 1/1/2016 - 2/29/2016 的日期。

我知道我可以手动写入日期并将它们拖到列中,但我有很多 sheet,使用 Arrayformula 会节省我很多时间。我在 B 列中尝试了类似的公式,但它不会自动填充日期间隙。是我正在寻找的可能吗?

这是可编辑传播的副本sheet 我指的是:https://docs.google.com/a/flyingfx.com/spreadsheets/d/1Ka3cZfeXlIKfNzXwNCOWV15o74Bqp-4zaj_twC3v1KA/edit?usp=sharing

简答

单元格 A1

1/1/2016

单元格 A2

=ArrayFormula(ADD(A1,row(INDIRECT("A1:A"&30))))

说明

在 Google 表格中,日期是序列化的数字,其中整数是天数,小数是小时、分钟等。一旦记住这一点,接下来就是找到一个有用的结构。

  • INDIRECT(reference_string,use_A1_notation) 用于通过给定高度作为硬编码常量来计算所需大小的范围,在本例中为 30。您不必担心此构造中的循环引用。

  • ROW(reference) returns 一组连续的数字。

  • A1是开始日期。

  • ADD(value1,value2)。它与使用 + 相同。由于第一个参数是一个标量值,第二个参数是一个值数组,它 returns 是一个与第二个参数大小相同的数组。

  • ArrayFormula(array_formula) 显示 array_formula

  • 返回的值
  • 由于A1是日期,默认情况下返回值也会被格式化为日期。

不错。谢谢。

要使列表长度适应所选月份的天数,只需将静态 30 替换为 eomonth(A1;0)-A1。这适用于有 31 天的月份和有 28 或 29 天的二月。

=ArrayFormula(ADD(A1,row(INDIRECT("A1:A"&eomonth(A1;0)-A1))))

我有一个替代方法,它允许您只编辑第一行,然后添加保护(就像我喜欢对整个第一行做的那样,我将这种方法用于其他公式):

=ARRAYFORMULA(
  IF(
    ROW(A1:A) = 1,
    "Date",
    IF(
      ROW(A1:A) = 2,
      DATE(2020, 1, 1),
      DATE(2020, 1, 1) + (ROW(A1:A) - 2)
    )
  )
)
// pseudo code!
const START_DATE = 2020-01-01

if (currentRow == 1)
  print "Date"
else if (currentRow == 2)
  print START_DATE
else 
  print START_DATE + (currentRow - 2)

备注:

  • 初始日期是hard-coded(确保两个实例匹配!)
  • ROW(A1:1) returns 当前行号,因此第一个 if 语句的计算结果为 "if this is Row 1, then render Date"
  • "if this is row 2, render the hard-coded date"
  • (nB: 给日期加一个整数就是一天)
  • "else increment the date in A2 by the (adjusted) number of rows"(负二表示前两个ifs(A1和A2)处理的两行。例如:在第3行中,我们想在第2行的日期上加1,所以current:3 - 2 = 1.

这是一个实际示例(我为偶数月添加了条件格式,以帮助完整性检查月份的最后一天是否正确):

https://docs.google.com/spreadsheets/d/1seS00_w6kTazSNtrxTrGzuqzDpeG1VtFCKpiT_5C8QI/view#gid=0

此外 - 我发现以下 VScode 扩展很方便语法突出显示 Google 工作表公式:https://github.com/leonidasIIV/vsc_sheets_formula_extension

Row1 header 技巧由 Randy 通过 https://www.tillerhq.com/what-are-your-favorite-google-spreadsheet-party-tricks/

提供

按月递增

如果有人希望能够按月递增,这是我能够实现的方法。你的解决方案 @ptim 让我走上了正确的轨道,谢谢。

公式

Placed in B1

First_Month = 2020-11-01 [named range]

=ARRAYFORMULA(
    IF(
        ROW(A:A) = 1,
        "Date",
        IF(
            LEN(A:A),
            EDATE( First_Month, ROW( A:A ) -2 ),
            ""
        )
    )
)

结果

ID      Month
1       2020-11-01
2       2020-12-01
3       2021-01-01
4       2021-02-01
5       2021-03-01