Skip to content

Instantly share code, notes, and snippets.

@1504168
Last active July 24, 2023 12:58
Show Gist options
  • Save 1504168/1ab4c2a94255214300156c9aa58d4b48 to your computer and use it in GitHub Desktop.
Save 1504168/1ab4c2a94255214300156c9aa58d4b48 to your computer and use it in GitHub Desktop.
// This function will filter a 2D Array for multiple column based on FilterForValues and comparision Criteria.
// ComparisionOperator can be : =,<>,>,<,>=,<= where default is =
// LogicalOperator can be : AND,OR where default is AND. Pass this param as text.
// IsHeaderPresent : Default is True
// You can pass same column twice.
// ColumnNameOrIndexes will be one row or column vector
// It can work on a 2D array not necessarily on Table only.
// Author: Md.Ismail Hosen([email protected])
FilterColumns=LAMBDA(TableData, ColumnNameOrIndexes, FilterForValues, [ComparisionOperator], [IsHeaderPresent], [LogicalOperator],
LET(
ColumnNameOrIndexes, TOROW(ColumnNameOrIndexes),
FilterForValues, TOROW(FilterForValues),
LogicalOperator, IF(ISOMITTED(LogicalOperator), "AND", LogicalOperator),
IsHeaderPresent, IF(ISOMITTED(IsHeaderPresent), TRUE, IsHeaderPresent),
_FilterItemCount, COLUMNS(ColumnNameOrIndexes),
ComparisionOperator, IF(ISOMITTED(ComparisionOperator), EXPAND("=", 1, _FilterItemCount, "="), ComparisionOperator),
_Header, CHOOSEROWS(TableData, 1),
_IsColumnIndexProvided, AND(ISNUMBER(ColumnNameOrIndexes)),
_Data, IF(IsHeaderPresent, DROP(TableData, 1), TableData),
_ValueMatcher, LAMBDA(Vector, Operator, MatchValue,
SWITCH(
Operator,
"=", Vector = MatchValue,
"<>", Vector <> MatchValue,
">", Vector > MatchValue,
"<", Vector < MatchValue,
">=", Vector >= MatchValue,
"<=", Vector <= MatchValue,
NA()
)
),
_CorrectColIndex, IF(_IsColumnIndexProvided, ColumnNameOrIndexes, MATCH(ColumnNameOrIndexes, _Header, 0)),
_Seq, SEQUENCE(_FilterItemCount),
_RowSelectionBooleanExpression, REDUCE(
"",
_Seq,
LAMBDA(Acc, Curr,
LET(
ColIndex, INDEX(_CorrectColIndex, 1, Curr) * 1,
FilterValueForColIndex, INDEX(FilterForValues, 1, Curr),
CurrentColOperator, IFERROR(INDEX(ComparisionOperator, 1, Curr), "="),
ColData, CHOOSECOLS(_Data, ColIndex),
IsMatch, _ValueMatcher(ColData, CurrentColOperator, FilterValueForColIndex),
Result, HSTACK(Acc, IsMatch),
Result
)
)
),
_RemoveFirstColFromBooleanExpression, DROP(_RowSelectionBooleanExpression, , 1),
_RowSelector, IF(UPPER(LogicalOperator) = "AND", LAMBDA(Row, AND(Row)), LAMBDA(Row, OR(Row))),
_SelectRowOrNot, BYROW(_RemoveFirstColFromBooleanExpression, _RowSelector),
_FilteredData, FILTER(_Data, _SelectRowOrNot),
_Result, IF(IsHeaderPresent, VSTACK(_Header, _FilteredData), _FilteredData),
_Result
)
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment