2013-04-10 3 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, а не Last Name, First Name.) Поэтому я не совсем уверен, что там происходит, думая, что должен быть более простой способ сделать это. Наверное, я мог просто перебирать всю вещь и вырезать строки, которые мне не нужны. Любые другие идеи?

ответ

2

Если мы предположим, что логика поиска строк с правильными датами правильная, то очень легко перебирать диапазон и удалять заголовки.

Здесь я заимствую функцию isValidDate() от Detecting an "invalid date" Date instance in JavaScript. Я также сохраняю первую строку заголовка - вы можете избавиться от нее, удалив чек для 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

Perfect !! Благодарю. – brl8

Смежные вопросы