如何使用 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
我正在使用 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 renderDate
"- "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