计算多个日期值的有效方法?
Effective way to calculate values for multiple dates?
现在我正在计算 Google 电子表格中多个日期的总计,为了计算一周,我取了开始日期,只为那一天做一个 Filter()
+ 1整个星期。
一个例子:
=SUM(IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = $B),0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+1)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+2)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+3)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+4)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+5)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+6)), 0))
这由多个部分组成,如下所示:
IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+1)), 0)
这只是按开始日期 + 1 筛选数据。HelpScout Import'!$A:$A
是日期列。 TO_DATE(N($B)+1))
获取日期,将其转换为数字,加 1,然后将其转换回日期。
如果我要汇总整整一个月的数据,这种功能就显得格格不入了。像上面那样有 30 到 31 个部分将难以管理。
有更好的方法吗?
编辑:使用 DSUM()
的更简单方法:
=DSUM('HelpScout Import'!A:H, "Total Conversations", ARRAYFORMULA(TRANSPOSE({"Date", H8, TO_DATE(N(H8)+1), TO_DATE(N(H8)+2), TO_DATE(N(H8)+3), TO_DATE(N(H8)+4), TO_DATE(N(H8)+5), TO_DATE(N(H8)+6)})))
但是,这仍然意味着我每天都需要 TO_DATE(N(H8)+1)
。寻找一种在单个单元格函数中创建日期数组的方法。
Edit2:制作了一个 returns 日期数组的应用程序脚本。
function GetNextXDays(startDay, days)
{
var inputDate = new Date(startDay);
var dates = [];
for(i =0; i < days; i++)
{
var newDate = new Date(startDay);
newDate.setDate(newDate.getDate() + i);
dates.push(newDate);
}
return dates;
}
这 returns 到目前为止我需要的日期。
一种解决方案是使用 DSUM
和更大和更小的运算符来定义一个范围。
=DSUM('HelpScout Import'!A:H, "Total Conversations", {{"Date"; JOIN("", ">=", TO_DATE(H8))}, {"Date"; JOIN("", "<=", TO_DATE(H8 + 30))}})
顺便说一句。 ;
用于定义列,而 ,
用于定义行。因此,通过使用 ;
而不是 ,
我摆脱了转置语句。
编辑:
您的 GetNextXDays
函数无法正常工作。 new Date()
将自 1/1/1970 以来的毫秒数作为参数,而 DATEVALUE
和 TO_DATE
使用自 12/30/1899 以来的天数。
这是该功能的更好版本。 25569 是从 12/30/1899 到 1/1/1970 的天数。 86400000 是一天中的毫秒数。
function GetNextXDays(startDay, days)
{
var dates = [];
for(var day = startDay; day < startDay + days; day++)
{
var newDate = new Date((day - 25569) * 86400000);
dates.push(newDate);
}
return dates;
}
现在我正在计算 Google 电子表格中多个日期的总计,为了计算一周,我取了开始日期,只为那一天做一个 Filter()
+ 1整个星期。
一个例子:
=SUM(IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = $B),0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+1)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+2)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+3)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+4)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+5)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+6)), 0))
这由多个部分组成,如下所示:
IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B)+1)), 0)
这只是按开始日期 + 1 筛选数据。HelpScout Import'!$A:$A
是日期列。 TO_DATE(N($B)+1))
获取日期,将其转换为数字,加 1,然后将其转换回日期。
如果我要汇总整整一个月的数据,这种功能就显得格格不入了。像上面那样有 30 到 31 个部分将难以管理。
有更好的方法吗?
编辑:使用 DSUM()
的更简单方法:
=DSUM('HelpScout Import'!A:H, "Total Conversations", ARRAYFORMULA(TRANSPOSE({"Date", H8, TO_DATE(N(H8)+1), TO_DATE(N(H8)+2), TO_DATE(N(H8)+3), TO_DATE(N(H8)+4), TO_DATE(N(H8)+5), TO_DATE(N(H8)+6)})))
但是,这仍然意味着我每天都需要 TO_DATE(N(H8)+1)
。寻找一种在单个单元格函数中创建日期数组的方法。
Edit2:制作了一个 returns 日期数组的应用程序脚本。
function GetNextXDays(startDay, days)
{
var inputDate = new Date(startDay);
var dates = [];
for(i =0; i < days; i++)
{
var newDate = new Date(startDay);
newDate.setDate(newDate.getDate() + i);
dates.push(newDate);
}
return dates;
}
这 returns 到目前为止我需要的日期。
一种解决方案是使用 DSUM
和更大和更小的运算符来定义一个范围。
=DSUM('HelpScout Import'!A:H, "Total Conversations", {{"Date"; JOIN("", ">=", TO_DATE(H8))}, {"Date"; JOIN("", "<=", TO_DATE(H8 + 30))}})
顺便说一句。 ;
用于定义列,而 ,
用于定义行。因此,通过使用 ;
而不是 ,
我摆脱了转置语句。
编辑:
您的 GetNextXDays
函数无法正常工作。 new Date()
将自 1/1/1970 以来的毫秒数作为参数,而 DATEVALUE
和 TO_DATE
使用自 12/30/1899 以来的天数。
这是该功能的更好版本。 25569 是从 12/30/1899 到 1/1/1970 的天数。 86400000 是一天中的毫秒数。
function GetNextXDays(startDay, days)
{
var dates = [];
for(var day = startDay; day < startDay + days; day++)
{
var newDate = new Date((day - 25569) * 86400000);
dates.push(newDate);
}
return dates;
}