Note
These modules are meant to be managed via the Excel Labs Add-In using the Advanced Formula Environment.
Note
These modules are meant to be managed via the Excel Labs Add-In using the Advanced Formula Environment.
/* | |
* Extract the Street from an Address | |
*/ | |
AddressStreet = LAMBDA(address, LEFT(address,FIND(",",address)-1)); | |
/* | |
* Extract the City from an Adderss | |
*/ | |
AddressCity = LAMBDA(address, TRIM(MID(address,FIND(",",address)+1,FIND(",",address,FIND(",",address)+1)-FIND(",",address)-1))); | |
/* | |
* Extract the State from an Address | |
*/ | |
AddressState = LAMBDA(address, TRIM(MID(address,FIND(",",address,FIND(",",address)+1)+2,2))); | |
/* | |
* Extrct the Post Code from an Address | |
*/ | |
AddressPostalCode = LAMBDA(address, RIGHT(address, 5)); |
// --- SQL Module --- | |
// Module containing Lambdas for generating SQL DDL Statements. | |
/** | |
* Generates SQL ENUM statements from header and values | |
*/ | |
SQLEnum = LAMBDA(header_cell, values_range, | |
"CREATE TYPE ""survey""." & CHAR(34) & header_cell & CHAR(34) & " AS ENUM (" & CHAR(10) & | |
TEXTJOIN("," & CHAR(10), TRUE, " '" & FILTER(values_range, values_range <> "") & "'") & CHAR(10) & | |
");" | |
); | |
/** | |
* Formats a value properly for SQL based on its data type | |
*/ | |
SQLValue = LAMBDA(value, | |
LET( | |
fmt, CELL("format", value), | |
is_date, LEFT(fmt, 1)="D", | |
formatted, | |
IFS( | |
ISTEXT(value), "'" & SUBSTITUTE(value, "'", "''") & "'", | |
ISBLANK(value), "NULL", | |
is_date, "'" & TEXT(value, "yyyy-mm-dd hh:mm:ss") & "'", | |
ISLOGICAL(value), IF(value, "TRUE", "FALSE"), | |
TRUE, value | |
), | |
formatted | |
) | |
); | |
/** | |
* Formats a row of data as SQL VALUES tuple | |
*/ | |
SQLValues = LAMBDA(row_data, | |
"(" & TEXTJOIN(", ", FALSE, MAP(row_data, SQLValue)) & ")" | |
); | |
/** | |
* Generates a complete SQL INSERT statement for a range of data | |
*/ | |
SQLInsert = LAMBDA(table_name, columns, data, | |
LET( | |
col_list, "(" & TEXTJOIN(", ", FALSE, columns) & ")", | |
values, BYROW(data, SQLValues), | |
values_with_commas, MAP( | |
values, | |
SEQUENCE(ROWS(values)), | |
LAMBDA(v, r, v & IF(r = ROWS(values), "", ", ")) | |
), | |
all_values, TEXTJOIN(CHAR(10), FALSE, values_with_commas), | |
"INSERT INTO " & table_name & " " & col_list & " VALUES " & CHAR(10) & all_values & ";" | |
) | |
); | |
/** | |
* Generates a SQL CREATE TABLE statement based on column names and types | |
*/ | |
SQLCreateTable = LAMBDA(table_name, columns, types, | |
LET( | |
columns_and_types, MAP(columns, types, LAMBDA(col, type, " " & col & " " & type)), | |
columns_text, TEXTJOIN("," & CHAR(10), FALSE, columns_and_types), | |
"CREATE TABLE " & table_name & " (" & CHAR(10) & columns_text & CHAR(10) & ");" | |
) | |
); | |
/** | |
* Generates a SQL SELECT statement with optional WHERE clause | |
*/ | |
SQLSelect = LAMBDA(columns, table, [where_clause], | |
LET( | |
cols_text, IF(columns = "*", "*", TEXTJOIN(", ", FALSE, columns)), | |
where_part, IF(ISOMITTED(where_clause), "", " WHERE " & where_clause), | |
"SELECT " & cols_text & " FROM " & table & where_part & ";" | |
) | |
); | |
/** | |
* Get SQL Data Types | |
*/ | |
SQLType =LAMBDA(in_list, | |
IF( | |
AND(ROWS(in_list)<>1,COLUMNS(in_list)<>1), | |
NA(), | |
LET( | |
_list,in_list, | |
_txt,ISTEXT(_list), | |
_formats,MAP(_list,LAMBDA(r,CELL("format",INDEX(r,1,1)))), | |
_isdates,LEFT(_formats,1)="D", | |
_out,MAKEARRAY( | |
ROWS(_list), | |
COLUMNS(_list), | |
LAMBDA(r,c, | |
IFS( | |
INDEX(_txt,r,c),"text", | |
INDEX(_isdates,r,c),"date", | |
TRUE,"number" | |
) | |
) | |
), | |
FILTER(_out,in_list<>"") | |
) | |
) | |
); | |
/** | |
* Determines if the current row is the last row in a range | |
*/ | |
SQLLastRow = LAMBDA(data, current_row, | |
current_row = (ROWS(data) + MIN(ROW(data)) - 1) | |
); | |
/** | |
* Generate the created_at & updated_at SQL | |
*/ | |
SQLCreatedAtUpdatedAt = " created_at TIMESTAMPTZ DEFUALT NOW()," & CHAR(10) & " updated_at TIMESTAMPTZ DEFUALT NOW()" & CHAR(10); | |
/** | |
* Generate the created_by & updated_by SQL | |
*/ | |
SQLCreatedByUpdatedBy = " created_by UUID," & CHAR(10) & " updated_by UUID" & CHAR(10); |
// --- Workbook Module --- | |
// Module containing named range definitions for the GMH Data Model Workbook. | |
/** | |
* Get Sheet Names of Current Workbook | |
*/ | |
Workbook.GetSheetNames = TRANSPOSE(SUBSTITUTE(GET.WORKBOOK(1), "[" & GET.WORKBOOK(16) & "]", "")); | |
/** | |
* Define SheetNames | |
*/ | |
Workbook.SheetNames = Workbook.GetSheetNames; | |
/** | |
* Get Sheet Names Filtering for a Pattern | |
*/ | |
Workbook.GetSheetNamesByPattern = LAMBDA(pattern, | |
FILTER(SheetNames, REGEXTEST(SheetNames, pattern, 0)) | |
); | |
/** | |
* Define the Default Property Image URL | |
*/ | |
Workbook.DefaultPropertyImageURL = "https://placehold.co/600x400.png"; |