2013-04-10 18 views
0

我有數據陣列看起來大致是這樣的:Google Apps腳本:如何從數組中刪除散佈的標題行?

header row | header row | header row   | header row 
    project | date  | LastName, FName  | hours 
    project | date  | LastName, FName  | hours 
    project | date  | LastName, FName  | hours 
    header row | header row | header row   | header row 
    project | date  | LastName, FName  | hours 
    project | date  | LastName, FName  | hours 
    project | date  | LastName, FName  | hours 

我想剝離標題行從數組中。我想我會用ArrayLib.filterByDate這樣做,認爲任何在我的時間範圍內沒有包含有效日期的行都會被刪除。

這是我試過的代碼:

function removeHeaders(projectRange){ 
    var tmpProjectRange = []; 
    tmpProjectRange = ArrayLib.filterByDate(projectRange, 1, new Date(2013-01-01), new Date(2015-01-01)) 
    return tmpProjectRange; 
} 

我得到一個錯誤:「所選列應只包含日期」。所以這種方法似乎不是一種選擇。現在

,我試圖用ArrayLib.filterByText列2比較有效的一組數據:

function removeHeaders(projectRange){ 
    var tmpEmployeeRange = []; 
    var tmpEmployeeList = []; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var shtEmp = ss.getSheetByName("Employees"); 
    var empLastRow = shtEmp.getLastRow(); 
    var strRange = "A2:A" + empLastRow; 
    //should contain a list of all the employees: 
    tmpEmployeeList = shtEmp.getRange(strRange).getValues(); 
    tmpEmployeeRange = ArrayLib.filterByText(projectRange, 2, tmpEmployeeList); 
    return tmpEmployeeRange; 
} 

但出於某種原因,這是行不通的兩種。在tmpEmployeeRange中返回的唯一行是名稱沒有逗號的行(這些行具有TBD而不是姓氏,名字)。所以我不太確定那裏發生了什麼,但是,我認爲必須有一個更簡單的方法來做到這一點。我想我可以遍歷整個事物並去掉我不想要的行。任何其他想法?

回答

2

如果我們假設查找具有有效日期的行的邏輯是正確的,那麼迭代範圍並移除標題非常簡單。

在這裏,我借用Detecting an "invalid date" Date instance in JavaScriptisValidDate()函數。我還保留了第一個標題行 - 您可以通過取消row == 0的檢查來消除該行。

// Iterate over all rows, keeping the first header row and 
// any row with a valid date in the second column. 
function removeHeaders(projectRange){ 
    var tmpProjectRange = []; 
    for (row in projectRange) { 
    if (row == 0 || isValidDate(projectRange[row][1])) { 
     tmpProjectRange.push(projectRange[row]); 
    } 
    } 
    return tmpProjectRange; 
} 


// From https://stackoverflow.com/questions/1353684 
// Returns 'true' if variable d is a date object. 
function isValidDate(d) { 
    if (Object.prototype.toString.call(d) !== "[object Date]") 
    return false; 
    return !isNaN(d.getTime()); 
} 
+0

完美!謝謝。 – brl8 2013-04-10 20:20:29

相關問題