如何在谷歌电子表格中做一个日期公式

时间:2013-04-23 16:30:55

标签: google-apps-script google-sheets

我必须做一个自动逐年增加日期的查询。例如,我使用这个公式:

=INDEX(query('Scheda Intervento'!C3:K14;"select sum (K) where (F >= date '2013-01-01' and F <= date '2013-01-31' and C = '" & A3 &"')");2;1)

......但每年我都必须更改公式中出现的日期(2014年,2015年)等。

我的电子表格副本已共享here。该公式位于C2单元格中的“riepilogo totale ore,date,compensi operatore”。

如何让我的公式在未来几年自动更新?

1 个答案:

答案 0 :(得分:0)

如果您在“riepilogo”(摘要)表的标题中将月份表示为日期,则可以在公式中引用它们。通过以年份编号开始行,您可以轻松地将日期调整为年份变化。

例如,这里A2是年份,表示为简单数字。 B2,对于Gennaio(1月),使用Date(year,month,day)电子表格功能构建日期,在本例中为2013/1/1。以下几个月使用EDATE(date,number_of_months)电子表格功能设置每个后续月份的第一天。

Date calculations

现在,调整您的公式以引用该月的日期。 date运算符需要“yyyy-mm-dd”格式的日期,因此您需要使用TEXT函数对其进行格式化。以下是B3中的公式:

=INDEX(query('Scheda Intervento'!$C$2:$K$13;ʺselect sum (K) where (F >= date'ʺ & text(B$2,ʺyyyy-mm-ddʺ) & ʺ' and F < date 'ʺ & text(edate(B$2,1),ʺyyyy-mm-ddʺ) & ʺ' and C = 'ʺ & $A3 &ʺ')ʺ);2;1)

请注意,再次使用EDATE() - 这样公式仅依赖于同一列中的值。不是必需的,但有用,因为它可以在电子表格的最右列中使用而无需修改。

您可以选择:

,而不是将年份放入A2
  • 使用=year(today())
  • 自动确定年份
  • 引用电子表格中的其他单元格。

编辑:Google电子表格日期的本地化问题

上述解决方案有效 - 但不是在意大利,也可能不在其他地区。对于使用Locale == Italia的用户,Date()EDate()函数都会导致Google Spreadsheets中的“解析错误”。

为了解决这个问题,下面的自定义函数会将给定的日期值转换为dateQUERY运算符的正确格式的字符串。有关自定义函数的详细信息,请参阅this blog entry。您只需从“工具”菜单中选择“脚本编辑器...”,将此代码块粘贴到编辑器工作区,然后保存。您可以根据自己的喜好命名脚本。

/**
 * Return the given date as a string formatted as 'yyyy-mm-dd'.
 */
function date2string(dateval) {
    var d = new Date(dateval);
    var dateArr = [];
    dateArr[0]=d.getFullYear();
    dateArr[1]=d.getMonth() + 1; //Months are zero based
    dateArr[2]=d.getDate();
    return dateArr.join('-');  
}

使用该脚本后,您可以在电子表格中使用新功能date2string()。单元格C3的更新公式为:

=INDEX(query('Scheda Intervento'!$C$2:$K$13;"select sum (K) where (F >= date '" & date2string(C$2) & "' and F < date '" & date2string(D$2) & "' and C = '" & $A3 &"')");2;1)

INDEX()

的问题

此公式存在另一个问题,它与INDEX()函数有关。该函数需要一个数组作为输入,以及索引来索引数组中的项。当QUERY()找到符合查询字符串条件的数据时,这种方法很有效。在这种情况下,QUERY('Scheda Intervento'!$C$2:$K$13;"select...的返回类似于这个2行数组:

Sum
54

在这种情况下,INDEX([["Sum"],[54]];2;1)会产生54,从数组的第2行第1列中挑选。

但如果我们没有匹配的数据,则没有第2行,我们遇到#REF错误。我们可以通过简单地使用SUM()来添加数组的数值来避免这种情况。如果没有数字,那将导致0 - 完美。

以下是单元格C3的结果公式:

    =SUM(query('Scheda Intervento'!$C$2:$K$13;"select sum (K) where (F >= date '" & date2string(C$2) & "' and F < date '" & date2string(D$2) & "' and C = '" & $A3 &"')"))