我必须做一个自动逐年增加日期的查询。例如,我使用这个公式:
=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”。
如何让我的公式在未来几年自动更新?
答案 0 :(得分:0)
如果您在“riepilogo”(摘要)表的标题中将月份表示为日期,则可以在公式中引用它们。通过以年份编号开始行,您可以轻松地将日期调整为年份变化。
例如,这里A2是年份,表示为简单数字。 B2,对于Gennaio(1月),使用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())
或上述解决方案有效 - 但不是在意大利,也可能不在其他地区。对于使用Locale == Italia的用户,Date()
和EDate()
函数都会导致Google Spreadsheets中的“解析错误”。
为了解决这个问题,下面的自定义函数会将给定的日期值转换为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()
函数有关。该函数需要一个数组作为输入,以及索引来索引数组中的项。当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 &"')"))