如果您在“riepilogo”(摘要)表的标题中将月份表示为日期,则可以在公式中引用它们。通过以年份编号开始行,您可以轻松地调整日期以适应年份的变化。
例如,这里的 A2 是年份,用一个简单的数字表示。 B2,对于 Gennaio(一月),使用 Date(year,month,day) 电子表格函数构建日期,在本例中为 2013/1/1。接下来的几个月使用EDATE(date,number_of_months) 电子表格函数来设置每个后续月份的第一天。
现在,调整您的公式以引用当月的日期。 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 电子表格中出现“解析错误”。
为了解决这个问题,下面的自定义函数将给定的日期值转换为适合date 运算符在QUERY 中的格式的字符串。有关自定义函数的更多信息,请参阅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 &"')"))