【问题标题】:Is there a Google Sheets formula or query to get an array of months within a date range?是否有谷歌表格公式或查询来获取日期范围内的月份数组?
【发布时间】:2018-06-20 18:51:00
【问题描述】:

我有一个开始日期和一个结束日期,DATEDIF 很容易让我知道其中的月数。我想在这个范围内写出每个月,例如对于日期范围:

Mar 1, 2016 - Jul 31, 2018

...我想遍历该范围内的月数,并为该范围内的每个月返回一行,从开始日期开始:

Mar 2016
Apr 2016
May 2016
(the rest of 'em)
Apr 2018
May 2018
Jun 2018

这可能更能说明我所追求的。此表显示了我的来源,即一组唯一订阅,每个订阅都有一个 ID、一个费率以及开始和结束日期:

我想自动生成的表将遍历每个唯一的订阅 ID 行,然后在该订阅 ID 的开始结束日期为每个月的订阅付款提供一行:

我只想根据第一张表中的内容制作第二张表,以节省时间。

我知道我必须像其他人一样花时间弄清楚如何去做,但如果您知道这是否可能仅使用 Google 表格的标准功能和查询,我会充满一种新的希望感。

提前感谢任何患者的指点。

【问题讨论】:

  • 如果你懂js,最好用apps脚本写个脚本。这看起来更像是 unpivot。
  • 如果这最终是适合这项工作的工具,那么是的......我只是希望尽可能地利用工作表功能。我会搜索那个不重要的话题。
  • 这应该是可行的。在您稍后可以隐藏的列中,在顶部单元格(在我的情况下为 A2)中,将一个月中最早的第一天放在您的数据中(或者您可以用分钟计算它,我想)。紧接着放置,然后根据需要向下拖动 =if(month(A2)=12,date(year(A2)+1,1,1),date(year(A2),month(A2)+1,1 ))。然后我从productforums.google.com/forum/#!msg/docs/4FykKHzbXb8/… 改编如下(C3 和 D3)是我的开始和结束日期: =query(A2:A,"select A where (A>=date '"&TEXT(C3,"yyyy-MM-dd" )&"' 和 A
  • 这给了我我想要的确切日期列表。我认为它可能可以扩展来满足您的需要。
  • 您可以使用 =arrayformula(text(query(A2:A,"Select * where (A>=date '"&TEXT(C3,"yyyy-MM-dd" )&"' 和 A

标签: google-sheets


【解决方案1】:

我很好奇是否可以使用公式。

结果如下: =query({TRANSPOSE(SPLIT(TEXTJOIN("",1,TRANSPOSE(ARRAYFORMULA(TEXT(ROW(INDIRECT("a1:a"&MAX(FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))))*(TRANSPOSE(FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))>=ROW(INDIRECT("a1:a"&MAX(FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))))),"0"","";;")))),",")), ARRAYFORMULA(TEXT(EOMONTH( VLOOKUP(TRANSPOSE(SPLIT(JOIN("",REPT(ROW(INDIRECT("A1:A"&COUNTA(A2:A)))&",",FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))),",")),FILTER({ROW(A2:A)-ROW(A2)+1,D2:D},A2:A<>""),2,), TRANSPOSE(SPLIT(TEXTJOIN("",1,TRANSPOSE(TEXT(ROW(INDIRECT("a1:a"&MAX(FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))))*(TRANSPOSE(FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))>=ROW(INDIRECT("a1:a"&MAX(FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))))),"0"","";;"))),","))-1 ),"MMM YYY")), ArrayFormula(VLOOKUP(TRANSPOSE(SPLIT(JOIN("",REPT(ROW(INDIRECT("A1:A"&COUNTA(A2:A)))&",",FILTER(DATEDIF(D2:D,E2:E,"M"),A2:A<>""))),",")),FILTER({ROW(A2:A)-ROW(A2)+1,A2:C},A2:A<>""),{2,4},))},"select Col1, Col3, Col2, Col4 label Col1 'Payment_Id', Col3 'Subscription_Id', Col2 'PaymentMonth', Col4 'PaymentAmount' format Col4 '$0.00'")

如果你懂js,最好用apps写脚本 脚本。

【讨论】:

  • 这是一个棘手的查询!谢谢你的麻烦。请问为什么使用apps脚本编写脚本更好,它会更具可读性/可维护性吗?
  • 哇,这令人印象深刻。当我无法将间接放入数组公式时,我被卡住了。
  • @user2136000,脚本的主要原因是公式使用了join+split构造,可能会导致the limit 50000 chars
  • 在我看来,虽然我没有说得准确,但对于编写 n 次内容的基本任务,您不需要加入和拆分或使用 rept。相反,您可以说类似 =arrayformula(if (isblank(A1:A30),"this guy","this guy")) 的内容,然后将其抽象化,以便将 30 连接起来,然后使用间接和“this guy " 成为单元格引用。但是我刚刚写的内容可以让你创建 30 次“这个家伙”。如此简单地使用 if 有点奇怪,但它确实有效。
  • 谢谢@jeremy-kahan,好主意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多