【发布时间】:2020-02-01 05:48:08
【问题描述】:
我的工作示例/示例 Google 表格:https://docs.google.com/spreadsheets/d/1AvAb_qnrrexYl5W5wAW6aA6P552T-prBxoONOis-XZM/edit?usp=sharing
我有一个包含有关门票信息的源表。对于这个问题,只有三列很重要:
- 票证编号
- 开票日期
- 票务结束日期 -- 如果已关闭
根据这些信息,我需要生成显示特定月份的指标/报告:
- 当月开的票
- 当月关闭的门票
- 已打开的票证(之前已打开且未关闭)
而且,我需要原始数据,而不仅仅是每月摘要。意思是,我应该能够选择一个月份并显示所有符合上述三个条件的票证 ID。
使用此函数(示例表中的 E-G 列)很容易获得前两个:
{
QUERY(A2:C, "SELECT B, 'Opened', A WHERE A IS NOT NULL LABEL 'Opened' '' FORMAT B 'YYYY-MM'");
QUERY(A2:C, "SELECT C, 'Closed', A WHERE C IS NOT NULL LABEL 'Closed' '' FORMAT C 'YYYY-MM'")
}
我被困在第三个。我试图弄清楚如何在每个月打开一张票。每个月都有一张票打开,应该有一行:
- 第一列是月份
- 第二列是“打开”
- 第三列是工单 ID
例如:
-
ID0010
- 于 2018-11 开业
- 于2019-01关闭
- 打开位置:
- 2018-12
-
ID0019
- 于2018-08开业
- 于2019-03关闭
- 打开位置:
- 2018-09
- 2018-10
- 2018-11
- 2018-12
- 2019-01
- 2019-02
会变成:
| Month | Status | Ticket ID |
|---------|--------|-----------|
| 2018-11 | Opened | ID0010 |
| 2018-12 | Open | ID0010 |
| 2019-01 | Closed | ID0010 |
| 2018-08 | Opened | ID0019 |
| 2018-09 | Open | ID0019 |
| 2018-10 | Open | ID0019 |
| 2018-11 | Open | ID0019 |
| 2018-12 | Open | ID0019 |
| 2019-01 | Open | ID0019 |
| 2019-02 | Open | ID0019 |
| 2019-03 | Closed | ID0019 |
注意:工单打开和关闭的月份也不会显示该工单的“打开”。换句话说,一张票应该只在月份有“Open”:
- 之后且不包括打开
- 之前且不包括关闭
而且,如果一张票还没有关闭,那么它会在今天之前每个月一排。
我认为我可以在Google Sheets Formula to calculate actual total duration of tasks with different start/end dates, overlaps, and gaps 的公认解决方案中使用这个概念,但由于数据的大小,我遇到了错误。公式在我的样本表的 I2 中。
CONCATENATE 的文本结果超过了 50000 个字符的限制。
所以我想知道是否有其他方法可以获得我需要的数据。我知道如何使用自定义函数来做到这一点,但我希望尽可能避免使用自定义函数。
更新解决方案
我能够获取player0 答案的关键部分,并在我的原始解决方案中使用它。简而言之,不是使用CONCATENATE 组合列/行,而是使用QUERY 和999^99 作为标题计数(第三个参数),因为QUERY 将组合所有行(使用空格分隔符) )。
最终公式为:
=ARRAYFORMULA(
QUERY(
SPLIT(
TRANSPOSE(
SPLIT(
QUERY(
TRANSPOSE(
TRIM(
QUERY(
IF(
A2:A <> "",
A2:A & "," & EDATE(
IFERROR(
SPLIT(
REPT(
EOMONTH(B2:B, -1) + 1 & ",",
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
)
),
","
),
0
),
TRANSPOSE(
ROW(
INDIRECT(
"A1:A" & MAX(
IF(
B2:B <> "",
IFERROR(
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
),
0
),
)
)
)
)
)
) & ";",
),
,
999^99
)
)
),
,
999^99
) & " ",
"; "
)
),
","
),
"SELECT Col2, 'Open', Col1 WHERE Col2 > 4000 LABEL 'Open' '' FORMAT Col2 'YYYY-MM'",
0
)
)
更新为使用 SEQUENCE
=ARRAYFORMULA(
QUERY(
SPLIT(
TRANSPOSE(
SPLIT(
QUERY(
TRANSPOSE(
TRIM(
QUERY(
IF(
A2:A <> "",
A2:A & "," & EDATE(
IFERROR(
SPLIT(
REPT(
EOMONTH(B2:B, -1) + 1 & ",",
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
)
),
","
),
0
),
SEQUENCE(
1,
MAX(
IF(
B2:B <> "",
IFERROR(
DATEDIF(
EOMONTH(B2:B, 0) + 1,
EOMONTH(
IF(
C2:C <> "",
C2:C,
EDATE(TODAY(), 1)
),
0
),
"M"
),
0
),
)
)
)
) & ";",
),
,
999^99
)
)
),
,
999^99
) & " ",
"; "
)
),
","
),
"SELECT Col2, 'Open', Col1 WHERE Col2 > 4000 LABEL 'Open' '' FORMAT Col2 'YYYY-MM'",
0
)
)
【问题讨论】:
标签: google-sheets google-sheets-formula transpose array-formulas google-sheets-query