如何根据单元格,谷歌电子表格的日期更改行背景颜色

时间:2013-08-30 03:45:42

标签: google-apps-script google-sheets

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

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");
        }
    }
}
}

1 个答案:

答案 0 :(得分:1)

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

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

Google表格中的默认行为是将电子表格中的单元格值“8/5/2013”​​转换为日期。因此,当您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对象。即使这很棘手 - 如果你感兴趣,还有很多背景讨论要阅读,从Compare two dates with JavaScript开始(包括所有笔记!)。 This Blog清楚地涵盖了强制主题,但没有关于日期的详细信息。

上面的代码行可以替换为this,这将正确评估true。您可以采用之前链接的答案中的一个函数,这些函数更具可读性。

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

泡沫,冲洗,重复......