Mar 21, 2020 06:56 PM
Hello,
Is it possible for a good soul to fly to my rescue please?
I wish to apply the following script on my base with the constraint that the calcul must be reset each time I pass on a new groupfield.
Being a novice I don’t see how to modify my script to apply this constraint.
The script I use is:
let table = base.getTable(‘Data’);
let view = table.getView(‘Grid view’);
let result = await view.selectRecordsAsync({
sorts: [
{field: ‘Identifiant Fournisseur’},
]
});
let runningTotal = 0;
for (let record of result.records) {
runningTotal += record.getCellValue(‘Quantité Collectée’);
await table.updateRecordAsync(record, {
‘Test’: runningTotal,
});
}
Solved! Go to Solution.
Mar 22, 2020 11:01 PM
Thank you very much for the screen capture. It looks like “Identifiant Fournisseur” is a linked record field or a lookup field, which is the source of your problem.
Bill’s script was written assuming that “groupName” was a single line text field. However, for a linked record field, getCellValue() returns an array instead of a text string, and comparing arrays works differently from comparing text strings. The same problem exists for lookup fields.
How to proceed depends on whether “Identifiant Fournisseur” is a linked record or a lookup field, and whether or not it will always have exactly one linked record.
If it is a linked record that will always have exactly one linked record, you can try replacing
record.getCellValue("Identifiant Fournisseur")
with
record.getCellValue("Identifiant Fournisseur")[0].name
in both places where it appears.
The [0].name
code pulls out the name from the first record in the array, which is the text string that is displayed.
Mar 22, 2020 10:45 AM
I think you’re looking for this general approach -
let table = base.getTable(‘Data’);
let view = table.getView(‘Grid view’);
let result = await view.selectRecordsAsync({
sorts: [
{field: ‘Identifiant Fournisseur’},
]
});
var runningTotal = 0;
var currentGroup = "";
for (let record of result.records) {
// did we just bump into a new group?
if (currentGroup != record.getCellValue("groupName")) {
// new group; reset the total and put a pin in that group name
runningTotal = 0;
currentGroup = record.getCellValue("groupName")
}
// aggregate the running total
runningTotal += record.getCellValue(‘Quantité Collectée’);
// update the running total in the table
// (BTW, this need only be run once for each group)
await table.updateRecordAsync(record, {
‘Test’: runningTotal,
});
}
Mar 22, 2020 04:16 PM
Hi Bill.French
Thank you for taking the time to respond to my bottle thrown to the sea.
I tested your approach but it doesn’t work properly because the reset is not made at each new group field sorted as I want to do but at each new record. I have two errors on the script (on the 14th and 17th line) and I think these errors do not make the script work properly but I don’t know how to fix them.
I can share an access to the Table if you need to see what I’m trying to do and how the script works.
Mar 22, 2020 05:55 PM
A screen shot would be very helpful in this situation.
Are you grouping by the field “Identifiant Fournisseur”? Did you replace “groupName” in Bil’s script with “Identifiant Fournisseur”?
Do you want a running total of “Quantité Collectée” for each record within each group of “Identifiant Fournisseur”?
Does it matter how the records within a group of “Identifiant Fournisseur” are sorted? Usually, when doing a running total, the sort order of the records being summed matters.
Mar 22, 2020 10:23 PM
Hi Kuovonne
Thank you for your contribution to my post.
You can see bellow how I customize Bill’s script:
let table = base.getTable(‘Data’);
let view = table.getView(‘Grid view’);
let result = await view.selectRecordsAsync({
sorts: [
{field: 'Identifiant Fournisseur'},
]
});
var runningTotal = 0;
var currentGroup = “”;
for (let record of result.records) {
// did we just bump into a new group?
if (currentGroup != record.getCellValue("Identifiant Fournisseur")) {
// new group; reset the total and put a pin in that group name
runningTotal = 0;
currentGroup = record.getCellValue("Identifiant Fournisseur")
}
// aggregate the running total
runningTotal += record.getCellValue('Quantité Collectée');
// update the running total in the table
// (BTW, this need only be run once for each group)
await table.updateRecordAsync(record, {
'Test': runningTotal,
});
}
About your questions:
Do you want a running total of “Quantité Collectée” for each record within each group of “Identifiant Fournisseur”?
—> Yes, I want a running total of “Quantity Collected” for each record because at certain thresholds, this triggers different formulas in other fields.
Does it matter how the records within a group of “Identifiant Fournisseur” are sorted? Usually, when doing a running total, the sort order of the records being summed matters.
—> As you can see on the screen shot, in “Identifiant fournisseur” group, records are sorted by their entrie dates
I also add a screen shot of my table as requested.
Mar 22, 2020 11:01 PM
Thank you very much for the screen capture. It looks like “Identifiant Fournisseur” is a linked record field or a lookup field, which is the source of your problem.
Bill’s script was written assuming that “groupName” was a single line text field. However, for a linked record field, getCellValue() returns an array instead of a text string, and comparing arrays works differently from comparing text strings. The same problem exists for lookup fields.
How to proceed depends on whether “Identifiant Fournisseur” is a linked record or a lookup field, and whether or not it will always have exactly one linked record.
If it is a linked record that will always have exactly one linked record, you can try replacing
record.getCellValue("Identifiant Fournisseur")
with
record.getCellValue("Identifiant Fournisseur")[0].name
in both places where it appears.
The [0].name
code pulls out the name from the first record in the array, which is the text string that is displayed.
Mar 23, 2020 02:56 AM
Thank you to both. the script is now running perfectly as I was looking for.
Mar 23, 2020 09:25 AM
A perfect example that when asking for help, make sure you share all pertinent information to avoid a lot of missteps. :slightly_smiling_face:
I’m glad you sorted it out.