Skip to main content
Solved

Sort a list in scripting app

  • June 21, 2023
  • 8 replies
  • 94 views

Paul_Van_Dooren
Forum|alt.badge.img+6

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

Best answer by Alexey_Gusev

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


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)

8 replies

Alvaro_Hernande
Forum|alt.badge.img+10
  • Participating Frequently
  • 19 replies
  • June 21, 2023

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}`); });

 


Paul_Van_Dooren
Forum|alt.badge.img+6
  • Author
  • Known Participant
  • 11 replies
  • June 21, 2023

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}`); });

 


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


Alexey_Gusev
Forum|alt.badge.img+25
  • Brainy
  • 1261 replies
  • Answer
  • June 21, 2023

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


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)

Forum|alt.badge.img+18
  • Inspiring
  • 272 replies
  • June 21, 2023

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

 

 


Paul_Van_Dooren
Forum|alt.badge.img+6
  • Author
  • Known Participant
  • 11 replies
  • June 22, 2023

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

 

 


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


Paul_Van_Dooren
Forum|alt.badge.img+6
  • Author
  • Known Participant
  • 11 replies
  • June 22, 2023

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)

Hello Alexey,

Thank you very much, this script did the trick!

greetings,
Paul


Forum|alt.badge.img+18
  • Inspiring
  • 272 replies
  • June 22, 2023

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


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!


Paul_Van_Dooren
Forum|alt.badge.img+6
  • Author
  • Known Participant
  • 11 replies
  • June 22, 2023

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!


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!