2

我有一个人们填写的表格,它进入了谷歌电子表格。发生这种情况时,我试图根据其中一列中的日期自动更改表单中新行的颜色。我发现了与此类似的问题,并且我能够从这些问题中生成此代码,但是当代码运行时,它不会更改背景颜色。我究竟做错了什么?

function onEdit(e) {
if (e) { 
    var ss = e.source.getActiveSheet();
    var r = e.source.getActiveRange(); 

    if (ss.getName() == "Form Responses Sorted") {

        // E.g. date column is 5th (E)
        date = ss.getRange(r.getRow(),5).getValue();


        rowRange = ss.getRange(r.getRow(),1,1,20);

        // This changes background color
        if (date == '8/5/2013') {
            rowRange.setBackgroundColor("#D00000");
        } else if (date == '8/12/2013') {
            rowRange.setBackgroundColor("#A0A0A0");
        } else if (date == '9/9/2013') { 
            rowRange.setBackgroundColor("#00FF00");
        } else if (date == '9/23/2013') {
            rowRange.setFontColor("#33FFCC");
        } else if (date == '9/30/2013') { 
            rowRange.setFontColor("#CCFF33");
        } else if (date == '10/7/2013') {
            rowRange.setFontColor("#FF6699");
        } else if (date == '10/21/2013') { 
            rowRange.setFontColor("#CC66CC");
        } else if (date == '11/4/2013') {
            rowRange.setFontColor("#6666FF");
        } else if (date == '11/25/2013') { 
            rowRange.setFontColor("#9933FF");
        } else if (date == '12/9/2013') {
            rowRange.setFontColor("#FF9933");
        } else if (date == '12/16/2013') { 
            rowRange.setFontColor("#FFFFFF");
        } else if (date == '1/13/2014') {
            rowRange.setFontColor("#CC9933");
        }
    }
}
}
4

1 回答 1

1

您很可能在比较中处理不一致的数据类型。让我们看看:

 if (date == '8/5/2013')

Google 表格中的默认行为是将电子表格中的单元格值“2013 年 8 月 5 日”转换为日期。因此,当您 时getValue(),您将在此比较的左侧有一个 javascript 日期对象实例。

右边呢?它是一个字符串,是 javascript 中的一种原始类型。为了比较这两种类型,将强制其中一种类型进行比较。由于右边是原始类型,所以左边将被转换为匹配;一个字符串。让我们看看那会是什么。

var A = String(date);   // Mon Aug 05 2013 00:00:00 GMT-0400 (EDT)

所以,现在你有一个字符串比较,它返回false是因为:

'Mon Aug 05 2013 00:00:00 GMT-0400 (EDT)' !== '8/5/2013'

解决方案是确保我们正在比较 Date 对象。即使这很棘手 - 如果您有兴趣,可以阅读大量背景讨论,从使用 JavaScript 比较两个日期开始(包括所有注释!)。该博客清楚地涵盖了强制主题,但没有关于日期的详细信息。

上面的那行代码可以用这个替换,这将正确评估true. 您可以采用前面链接的答案中的功能之一,这将更具可读性。

if (date - new Date('8/5/2013') == 0) {

起泡、冲洗、重复……

于 2013-09-03T19:44:33.523 回答