【问题标题】:Effective way to calculate values for multiple dates?计算多个日期值的有效方法?
【发布时间】:2015-09-19 21:42:38
【问题描述】:

现在我在 Google 电子表格中计算多个日期的总数,为了计算一周的时间,我取开始日期,然后为那一天做一个 Filter() + 整个一周的 1。

一个例子:

=SUM(IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = $B$1),0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B$1)+1)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B$1)+2)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B$1)+3)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B$1)+4)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B$1)+5)), 0), IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B$1)+6)), 0))

这由多个部分组成,如下所示:

IFERROR(FILTER('HelpScout Import'!C:C, 'HelpScout Import'!$B:$B = $A3, 'HelpScout Import'!$A:$A = TO_DATE(N($B$1)+1)), 0)

这只是按开始日期 + 1 过滤数据。HelpScout Import'!$A:$A 是日期列。 TO_DATE(N($B$1)+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:制作了一个返回日期数组的应用程序脚本。

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;
}

这会返回到目前为止我需要的日期。

【问题讨论】:

    标签: google-sheets spreadsheet google-docs


    【解决方案1】:

    一种解决方案是使用DSUM 和更大或更小的运算符来定义范围。

    =DSUM('HelpScout Import'!A:H, "Total Conversations", {{"Date"; JOIN("", ">=", TO_DATE(H8))}, {"Date"; JOIN("", "<=", TO_DATE(H8 + 30))}})
    

    顺便说一句。 ; 用于定义列,而, 用于行。所以通过使用; 而不是, 我摆脱了转置语句。

    编辑: 您的 GetNextXDays 功能无法正常工作。 new Date() 将自 1970 年 1 月 1 日以来的毫秒数作为参数,而 DATEVALUETO_DATE 使用自 1899 年 12 月 30 日以来的天数。 这是该功能的更好版本。 25569 是从 1899 年 12 月 30 日到 1970 年 1 月 1 日的天数。 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;
    }
    

    【讨论】:

    • 感谢您的回复。我设法得到一组日期来返回。但是,我似乎无法根据姓名和日期DSUM()。这是我的标准的图片:i.imgur.com/XdIKcTF.png 和我的函数:=DSUM('HelpScout Import'!A:H, "Total Conversations", J17:K18) J17:K18 指的是该图片的前两行。它只返回0
    • 从头开始,我想通了。我需要有多个类似“或”的条件。现在看起来像:{{"Name"; A15}, {"日期"; ">="&B1}, {"日期"; "
    • 我在您的代码中发现了一个错误,并在我的答案中添加了修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2016-10-29
    相关资源
    最近更新 更多