Sorting numbers and dates in a KGrid - delphi

I have a KGrid in a Lazarus project that contains different columns with numeric, text and date data.
Sorting by the column with text data is OK but sorting by the columns containing numeric or date data does not work at all.
For instance
10,2,3,1,4,21,30 is sorted as 1,10,2,21,3,30,4 in that order.
Does anyone use KGrid and is there a way to change the grid's OnCompareCells event so that the sorting is done correctly?
Thanks.

Related

Arrayformula for Index Match multiple columns with date values

I am collecting data on intervals and want to display a summary of that data on a single line in a new sheet.
https://docs.google.com/spreadsheets/d/1EOV4-VwVfwWvhwQ24qkQbCRGxUp74oe0dLWrbj0wiNE/edit#gid=566541214
Grade Data Sheet
Each batch of data comes in by date with a Name, Course and Grade like below
Raw data is like this for a large number of Name / Course / Grade:
Date
Name
Course
Grade
10/1/2022
Joe
Math
65-D
10/15/2022
Joe
Math
58-F
10/30/2022
Joe
Math
50-F
Summary Sheet
Single line that takes each unique Name-Course pair and I'm attempting to lookup a grade for each date column.
(note: I'm trying to extract the dates in the columns dynamically as the Grade Data sheet expands)
So I've successfully extracted the Dates to create new columns, and I am trying to create an index-match that grabs the column date and creates an array of DATE-NAME-COURSE and matches DATE-NAME-COURSE on the Grade Data sheet to return the grade for that student on the Date. The formula works for the first row, but when it fills down it returns the value of the first match.
I can't quite figure out how to reference the single date cell into the array while dynamically filling down. Not sure if I a different approach, but hopefully this makes sense.
=arrayformula(if(len($A2:$A),(index(GradeData!$D2:$D,match(TEXT(C$1,"yyyy-mm-dd")&$A2:$A&$B2:$B,TEXT(GradeData!$A2:$A,"yyyy-mm-dd")&GradeData!$B2:$B&GradeData!$C2:$C,0))),""))`
The goal is to have Grade Data populate automatically, and the Summary page to add a column for each new date and fill data down for each student.
Thanks in advance, I have shared the actual sheet above so you can see the data
I've attempted several different ways but can't quite get the dynamic array matches with the date formatting to work.
=arrayformula(if(len($A2:$A),(index(GradeData!$D2:$D,match(TEXT(C$1,"yyyy-mm-dd")&$A2:$A&$B2:$B,TEXT(GradeData!$A2:$A,"yyyy-mm-dd")&GradeData!$B2:$B&GradeData!$C2:$C,0))),""))
Thank you!
As far as I've seen the issue in your sheet is that the dates of the header do not match the dates of your source data. I've added a new header line:
=LAMBDA(dates,FILTER(dates,regexmatch(dates,"/")))(Transpose(Unique(arrayformula(left(GradeDataVlookup!A4:A,10)))))
And just put an IFERROR in order to avoid all the errors of the values without matches:
=arrayformula(if(len($A$2:$A),iferror(vlookup(TEXT(C$1,"MM/DD/YYYY")&$A2:$A&$B2:$B,GradeDataVlookup!$A:$E,5,FALSE),""),""))
PS: with MAP or MAKEARRAY you could summarize all the table in just one formula

when sorting in google sheets it will only sort all columns to the left

I'm trying to sort by a column in my Google sheets, however, when sorting it will only sort the specified sort column and all the columns to the left.
I need it to sort all the columns to the right as well.
Concretely, if I sort the height column in the example below, it will only change the Name and height column's order, but not width and notes.
Any ideas?
Try this formula:
={A1:D1;SORT(A2:D4,4,FALSE)}
You can change the 2nd parameter in the SORT function to whatever column you want to sort.
Example:
Output:
Here I sorted the 4th column or the notes
Note: When you sort a data, make sure to include all rows and columns that you want to include in the sort. Otherwise it will only sort the range you will provide. (This is applicable to both Sort Formula and Manual Sort in the Menu)
Reference:
SORT
You have to select data table range first, then choose menu Data -> Sort range -> Advance sort range (or custom sort range, idk what its name is in ENG, I translated it from my local language). Then you have a dialog for sorting this range: having header row or not, column to sort, add column to sort.

The function "query" in Google spreadsheets works for all columns except one

In Google spreadsheets I use the following simple formula:
=QUERY({'pivot data source'!A:AN},"select * where Col1='2021-08' order by Col2")
This works fine so far. However, there is one comment column. It is empty for most rows. Now I added a comment there - it just won't appear in the result of the query formula.
I realized, that it works fine when the comment is a plain number. As soon as there is text, it won't show up.
As stated in the Google Help section for "query":
In case of mixed data types in a single column, the majority data type determines the data type of the column for query purposes. Minority data types are considered null values.
That means: As long as there are more values with numbers (numeric) than values with text (string), the rows with text will not show up. Even if there are as many numbers as text fields (e.g. one numeric value, one string), Google seems to define the column as numeric and strings don't show up.
To solve this problem, you can try to format the corresponding column in tab "pivot data source" as text (Format > Number > Plain text in the menu).

Insert row into data imported using IMPORTRANGE

I have two sheets:
SheetA contains dates. It is the reference data.
SheetB contains dates and data on events that occurred on those dates. This sheet is updated regularly.
I am using IMPORTRANGE in SheetB to pull data from SheetA.
I sometimes need to insert rows into SheetB. For example, sometimes two events occur on the same date and I need a row for each.
However, when I insert a new row into the imported data in SheetB the new row is automatically filled with IMPORTRANGE data from SheetA.
I think there may be a solution with ADDRESS but I can't figure it out. Any help would be much appreciated!
As long as IMPORTRANGE returns a single array of multiple rows you are not going to be able to split those apart at all easily. Your best bet may be to convert the array into a standard range (Ctrl+C/Ctrl+Shift+V) and start the process all over if the source changes.
You might be able to combine two ranges (one from each sheet) in a QUERY that you sort by date.

Script to delete columns based on list of possible values in row 1

I would like a script to delete columns in a Google Spreadsheet if the contents match a list of approximately 30 possible text strings. e.g. Custom Variable 1, Custom Variable 3, Custom Variable 9, etc.
I'm new to Google Scripts. I've searched this forum but haven't found a starting point that handles my specific situation -- deleting columns based on a list of string values rather than a single value or value input from a dialogue box.
Any help would be greatly appreciated.
Scott C
If I'm understanding what you're asking, you wish to read through a column and compare a list of values to the value in each row of that column. If that column contains any one of those 30 values, delete that column.
One way you could do it:
Hard code an array that contains all of those values you have in mind. Loop over the column you desire, storing each value into an array (So you would have two arrays total when you're done. One with the hard coded values, the other with the column values). Then, take those values from Array 2, and see if they match any of the words in Array 1. If one of those values matches your list, delete that column.

Resources