计算多个日期值的有效方法?

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 以来的毫秒数作为参数,而 DATEVALUETO_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;
}