Reputation: 367
I have a problem with removing empty arrays/objects from a multidimensional array for my search app in google sheets. I am using getLastRow
so I thought I will avoid this problem but unfortunately it is not.
My array looks like this:
[[1.39080000912E11, RSSMA004025, ボタンキャップ M4X25, 4.0, 4.2, , , ], [1.39080000912E11, RWJAA058068, FTB-268, 1.0, 486.0, 486.0, , ], [, , , , , , , ], [, , , , , , , ]]
And I am looking for something that will delete empty arrays from the end of the array so it should be like this:
[[1.39080000912E11, RSSMA004025, ボタンキャップ M4X25, 4.0, 4.2, , , ], [1.39080000912E11, RWJAA058068, FTB-268, 1.0, 486.0, 486.0, , ]]
It is just a part of the whole array but I hope you will understand what I am looking for.
My code so far:
function getDataForSearch(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("WP");
var test1 = ws.getRange(4, 6, ws.getLastRow(),8).getValues();
const arrFiltered = test1.filter(function(x){
return (x !== (undefined || null || ''));
});
Logger.log(arrFiltered);
}
Upvotes: 1
Views: 5479
Reputation: 50445
I am using getLastRow so I thought I will avoid this problem but unfortunately it is not.
getRange
syntax is
getRange(row, column, numRows, numColumns)
The script is using
ws.getRange(4, 6, ws.getLastRow(), 8).getValues();
The third parameter is numRows
- the number of rows. If the last row is 10, You're getting the range from row 4 to row 14(4+10). To end at row 10, number of rows should be 7. The correct range should be therefore be
ws.getRange(1 + 3, 6, ws.getLastRow() - 3, 8).getValues();
Another possibility for such empty rows would be the traditional use of array formulas. See ArrayFormula is breaking the getLastRow() funtion. Possible workarounds?
Upvotes: 2
Reputation: 207501
You want to use filter() and some()
var arr = [[1.39080000912E11, 'RSSMA004025', 'ボタンキャップ M4X25', 4.0, 4.2, , , ], [1.39080000912E11, 'RWJAA058068', 'FTB-268', 1.0, 486.0, 486.0, , ], [, , , , , , , ], [, , , , , , , ]];
// Will fail for falsly values, but works in this case
var updated1 = arr.filter(function (a) {
return a.some(Boolean);
});
// var updated1 = arr.filter(a => a.some(Boolean));
console.log(updated1);
// check for undefined
var updated2 = arr.filter(function (a) {
return a.some(function (val) {
return val !== undefined;
});;
});
// var updated2 = arr.filter(a => a.some(val => val !== undefined));
console.log(updated2);
//If it can be any of the values
var empty = [undefined, null, ''];
var updated3 = arr.filter(function (a) {
return a.some(function (val) {
return !empty.includes(val);
});
});
// var updated3 = arr.filter(a => a.some(val => !empty.includes(val)));
console.log(updated3);
Upvotes: 1
Reputation: 11
U can try that.
const notEmptyArrayOrObject = (arr)=> {
if(typeof arr !== 'object'){ return true }
if(!Array.isArray(arr){
arr = Object.values(arr)
}
return arr.filter(item=>item === undefined).length !== arr.length
}
const filterEmptyFromArray = (array)=>array.filter(notEmptyArrayOrObject)
Upvotes: 0
Reputation: 758
you can join the elements in the array and then check their length for filtering
let test1 = [[1.39080000912E11, 'RSSMA004025', 'uiuiu M4X25', 4.0, 4.2, , , ],[1.39080000912E11, 'RWJAA058068;', 'FTB - 268', 1.0, 486.0, 486.0, , ],[, , , , , , , ],[, , , , , , , ]]
const arrFiltered = test1.filter(function(x) {
return (x.join('').length !== 0);
});
console.log('new array',arrFiltered);
Upvotes: 1
Reputation: 1006
Your function should look like
function getDataForSearch() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName("WP");
var test1 = ws.getRange(4, 6, ws.getLastRow(), 8).getValues();
const arrFiltered = test1.filter(function (x) { /* here, x is an array, not an object */
return !(x.every(element => element === (undefined || null || '')))
});
Logger.log(arrFiltered);
}
Upvotes: 2
Reputation: 2158
Try something like this perhaps. You want to only remove the arrays where all of the array elements are undefined.
var funnyArrays = [['a', 'b', 'c'], [,,,], ['d','e','f'], [,,,]];
var fullArrays = funnyArrays.filter(a => !a.every(ax=> a == undefined));
Upvotes: 1