2017-08-01 60 views
1

有一列中有日期,在其他列的狀態發生變化時會自動更新。如果從「打開」更改爲「正在進行」,則會設置今天的日期。谷歌腳本 - 比較日期是否比今天更早的函數

我需要一個函數,在日期比今天早的情況下自動執行「某事」。

到目前爲止有這個代碼,但它不工作,我不知道爲什麼。 感謝

function backgroundformate() { 
    var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře"); 
    var lastRow = odpovediSheet.getLastRow(); 
    var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues(); 
    var day = 24*3600*1000 
    var today = parseInt((new Date().setHours(0,0,0,0))/day); 

    for (var i=1; i < columnH.length; i++) { 
    var dataday = parseInt(new Date(columnH[i][8]).getTime()/day); 
    if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")} 
    else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")} 
    } 
} 

回答

0

實際上,您不需要解析日期來比較它們,JavaScript本身就可以做到這一點。 這裏是你的工作代碼:

function backgroundformate() { 
    var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře"); 
    SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() 
    var lastRow = odpovediSheet.getLastRow(); 
    var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues(); 
    var today = new Date(new Date().setHours(23,59,59,0,0));// I set the hour to near midnight so you can get the right result today until 23:59:59 

    for (var i=1; i < columnH.length; i++) { 
    var dataday =columnH[i][0]; 
    if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")} 
    else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")} 
    } 
} 

此外,你也犯了一個錯誤在此代碼:

var dataday = parseInt(new Date(columnH[i][8]).getTime()/day); 

你正在尋找的值在索引0,因爲你只能從該列中獲取數據當你定義範圍。 的代碼應該已經被

var dataday = parseInt(new Date(columnH[i][0]).getTime()/day); 

但無論如何,解析是沒有必要的。

也就是說,在循環中調用ss服務並不是一個好習慣,你可以更高效地使用數組和單個SS調用。代碼如下所示,請嘗試比較執行速度。

function backgroundformate() { 
     var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře"); 
     SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() 
     var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getValues(); 
     var columnHBG = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getBackgrounds(); 
     var today = new Date(new Date().setHours(23,59,59,0,0)); 

     for (var i=0; i < columnH.length; i++) { 
     var dataday =columnH[i][0]; 
     if (dataday < today) { 
      columnHBG[i][0]='#F00'; 
     }else{ 
      columnHBG[i][0]='#FF0'; 
     } 
     } 
     odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).setBackgrounds(columnHBG); 
    } 
+1

謝謝!完美的作品 –

0

當此時用戶提示該腳本才起作用。

您有兩個選擇,可以在其上放置一個觸發器,讓腳本每5分鐘運行一次,請參閱here

或者啓動該函數作爲onEdit(e),它可以在工作表中的任何內容發生更改時自動觸發腳本。但是,這可能會減慢工作表的工作速度,請參閱here

我不確定你是否說你的腳本不能正常工作,或者它沒有被觸發。如果您希望我查看您的腳本,請將鏈接指向Google表單。

function backgroundformate() { 
    var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře"); 
    var lastRow = odpovediSheet.getLastRow(); 
    var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues(); 
    var day = 24*3600*1000 
    var today = parseInt((new Date().setHours(0,0,0,0))/day); 

    for (var i=1; i < columnH.length; i++) { 
    var value = columnH[i][8].getValue(); 
    var dataday = parseInt(value/day); 
    if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")} 
    else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")} 
    } 
} 
+0

我明白了。我認爲我需要設置一個觸發器。我對函數本身有問題。該腳本不起作用。 這裏是:https://docs.google.com/spreadsheets/d/1_WvTQcinr6ir2jxjjwVKYMlV9_tWZcVyZR0zsGBTxow/edit?usp=sharing –

+0

我沒有編輯權限,所以看不到您的腳本。我認爲你的腳本中的日期與你的工作表中的格式不同。將一個記錄器放在var today(Logger.log(today))後面並放在var dataday(Logger.log(dataday))後面並比較兩個日誌。 –

+0

對不起,現在你有編輯權限。 –