Jun 21, 2023 04:16 AM
Hello all,
I have a table that's filled with (linked) dates. To be able to view all the dates in a list, i've created in the script app a script to give me that list. But, is there a possibilty to sort that list?
Below the code:
// Change this name to use a different table
let table = base.getTable("Deadlines");
// Prompt the user to pick a record
// If this script is run from a button field, this will use the button's record instead.
let record = await input.recordAsync('Select a record to use', table);
let Weer = record.getCellValue('NB-Weer - DATE');
let Dag = record.getCellValue('NB-Dagkrant - DATE');
let Pagina = record.getCellValue('NB-1-1 Pagina DATE');
output.markdown(`**NB-Weer:** ${Weer}`);
output.markdown(`**NB-Dagkrant:** ${Dag}`);
output.markdown(`**NB-Dagkrant:** ${Pagina}`);
... and the result:
Very much a scripting newbie so any help or pointers very much appreciated!
Allready a big thanks and any help is welcome
Solved! Go to Solution.
Jun 21, 2023 06:34 AM
That should work
const table=base.getTable('Deadlines')
let record = await input.recordAsync('Select a record to use', table);
const flds=['NB-Weer - DATE','NB-Dagkrant - DATE','NB-1-1 Pagina DATE']
const getData=flds.map(f=>[record?.getCellValue(f),f]).sort().reverse().map(arr=>arr.reverse().join(': '))
output.table(getData)
Jun 21, 2023 07:24 AM - edited Jun 22, 2023 06:32 AM
Hi @Paul_Van_Dooren,
Here's an easy to follow version
// Change this name to use a different table
let table = base.getTable('Deadlines');
// Prompt the user to pick a record
// If this script is run from a button field, this will use the button's record instead.
let record = await input.recordAsync('Select a record to use', table);
let Weer = record.getCellValue('NB-Weer - DATE') || '';
let Dag = record.getCellValue('NB-Dagkrant - DATE') || '';
let Pagina = record.getCellValue('NB-1-1 Pagina DATE') || '';
let dates = [
{ field: 'NB-Weer', value: Weer },
{ field: 'NB-Dagkrant', value: Dag },
{ field: 'NB-1-1 Pagina', value: Pagina },
];
//filter out empty dates (remove if you would prefer empty dates to remain)
dates = dates.filter((f) => f.value);
//sort array of field value objects
dates.sort((a, b) => String(a.value).localeCompare(String(b.value)));
for (let d of dates) {
output.markdown(`**${d.field}** ${d.value}`);
}
-Stephen
Jun 21, 2023 04:25 AM
I couldn´t test this solution inside Airtable, but in JS I would do this:
Just adding a sorting step after retrieving the values.
And at the end just iterate overthe sorted dates array and output each date.
Hope it works!
// Change this name to use a different table
let table = base.getTable("Deadlines");
// Prompt the user to pick a record
// If this script is run from a button field, this will use the button's record instead.
let record = await input.recordAsync('Select a record to use', table);
let Weer = record.getCellValue('NB-Weer - DATE');
let Dag = record.getCellValue('NB-Dagkrant - DATE');
let Pagina = record.getCellValue('NB-1-1 Pagina DATE');
// Create an array to store the dates
let dates = [Weer, Dag, Pagina];
// Filter out empty dates
dates = dates.filter(date => date !== null);
// Sort the dates in descending order
dates.sort((a, b) => b - a);
// Format and output the sorted dates
output.markdown('**Sorted Dates (Newest First):**');
dates.forEach(date => {
output.markdown(`- ${date}`);
});
Jun 21, 2023 04:32 AM
Hi Alvaro,
Thank you for the quick response, unfortunately it didn't do the trick.
But you have given me an idea to group (array) the dates.
grtz,
Paul
Jun 21, 2023 06:34 AM
That should work
const table=base.getTable('Deadlines')
let record = await input.recordAsync('Select a record to use', table);
const flds=['NB-Weer - DATE','NB-Dagkrant - DATE','NB-1-1 Pagina DATE']
const getData=flds.map(f=>[record?.getCellValue(f),f]).sort().reverse().map(arr=>arr.reverse().join(': '))
output.table(getData)
Jun 21, 2023 07:24 AM - edited Jun 22, 2023 06:32 AM
Hi @Paul_Van_Dooren,
Here's an easy to follow version
// Change this name to use a different table
let table = base.getTable('Deadlines');
// Prompt the user to pick a record
// If this script is run from a button field, this will use the button's record instead.
let record = await input.recordAsync('Select a record to use', table);
let Weer = record.getCellValue('NB-Weer - DATE') || '';
let Dag = record.getCellValue('NB-Dagkrant - DATE') || '';
let Pagina = record.getCellValue('NB-1-1 Pagina DATE') || '';
let dates = [
{ field: 'NB-Weer', value: Weer },
{ field: 'NB-Dagkrant', value: Dag },
{ field: 'NB-1-1 Pagina', value: Pagina },
];
//filter out empty dates (remove if you would prefer empty dates to remain)
dates = dates.filter((f) => f.value);
//sort array of field value objects
dates.sort((a, b) => String(a.value).localeCompare(String(b.value)));
for (let d of dates) {
output.markdown(`**${d.field}** ${d.value}`);
}
-Stephen
Jun 21, 2023 10:56 PM
Hey Stephen,
Thanks for your effort, unfortunately the sorting didn't work.
But you gave me an idea how to layout the final view.
greetings,
Paul
Jun 21, 2023 10:59 PM
Hello Alexey,
Thank you very much, this script did the trick!
greetings,
Paul
Jun 22, 2023 06:30 AM
Oops, this is what I get for not testing 🙂 I updated my previous code to sort strings instead of numbers. By the way, I would highly recommend readable/well documented code over shorter code for the sake of future maintenance. If you've ever inherited a project where someone has tried to write things in the shortest way possible with zero commenting, you'll soon know pain. Good luck!
Jun 22, 2023 06:42 AM
Hello Stephen,
You are right, the improvement you've made, made the script working. Thank you very much.
And yes, when you make comments in a script it is a big help for future maintenance!