2

人々が入力するフォームがあり、それは Google スプレッドシートに送られます。これが発生すると、列の 1 つの日付に基づいてフォームから新しい行の色を自動的に変更しようとしています。これに似た質問を見つけて、それらの質問からこのコードを生成できましたが、コードを実行しても背景色は変わりません。私は何を間違っていますか?

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 スプレッドシートのデフォルトの動作は、スプレッドシートで「8/5/2013」のセル値を日付に変換することです。したがって、getValue()この比較の左側に JavaScript の日付オブジェクト インスタンスが表示されます。

右側はどうですか?これは、javascript のプリミティブ型である文字列です。これら 2 つのタイプを比較するには、一方を強制的に比較できるようにします。右はプリミティブ型であるため、左は一致するように変換されます。文字列。それが何であるか見てみましょう。

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 で 2 つの日付を比較する(すべてのメモを含む!) から始まる背景に関する議論がたくさんあります。このブログでは強制のトピックを明確に取り上げていますが、日付に関する詳細はありません。

上記のコード行は、適切に評価されるこれに置き換えることができますtrue。以前にリンクされた回答の関数の 1 つを採用すると、より読みやすくなります。

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

泡立てて、すすぎ、の繰り返し…

于 2013-09-03T19:44:33.523 に答える