【问题标题】:how to do a date formula in google spreadsheet如何在谷歌电子表格中做一个日期公式
【发布时间】:2013-04-27 11:37:28
【问题描述】:

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

=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 矿石、日期、运营商补偿”工作表中。

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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    如果您在“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 &"')"))
    

    【讨论】:

    • 太棒了!但公式不起作用..也许我做了语法错误??公式在工作表“riepilogo 总矿石、日期、运营商补偿”docs.google.com/spreadsheet/… 中的 c3 中
    • @user38384 TEXT()EDATE() 函数存在本地化问题。如果我将您的电子表格内容复制到我自己的 (EN-US) 版本,这些功能就可以工作。在您的 (IT-IT) 版本中,我得到一个简单函数 =TEXT(c$2,"yyyy-mm-dd") 的“解析错误”,尽管它在我的版本中有效。 EDATE() 类似。为了解决这个问题,我编写了一个自定义函数,并更新了我的答案。我找不到关于这些功能应该如何用意大利语运行的任何帮助;可以吗?
    • 我已向 Google 报告了这些本地化问题。我相信他们会得到他们的权利。 :^/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多