Save the date! Join us on October 16 for our Product Ops launch event. Register here.
Sep 27, 2024 08:30 AM
I've created a button that links to a script. The script duplicates the line where the button sits and duplicates linked records housed in another table. However, the script crashes seven out of ten times. Is there any way to mitigate this? Is it my internet connection?
I'm tearing my hair out as it's almost quicker to manually go around all tables and duplicate records and wire them back up by hand 😧
Sep 27, 2024 07:37 PM
What's the error message you get? What does the script do?
Oct 01, 2024 05:08 AM
Oct 01, 2024 09:25 PM
Yeap that's a weird one! Could you tell me what the script does exactly so I can try to duplicate what it does to test it out?
Oct 02, 2024 04:10 AM
The whole setup for making Bill Of Materials (BOM) for different products.
I have 4 Tables...
That is in broad strokes what is happening.
The problem is often Products is very similar so it's tempting to duplicate each BOM, however to avoid confusion I want every material line to only link to one BOM. So instead of creating a new BOM from scratch we have a button linked up to a script. It takes the line where the button is pressed create another line underneath push in the the link to Table4, but then it goes to Table 2 make duplicates of all the line items of all the material lines in the BOM thats being duplicated, but instead of linking to the old BOM it'll link to the newly created BOM. I don't know if that makes sense? And is enough to go on?
Even weirder when I do it it seems when the system is "warmed" up it dosen't throw the error as frequently. But the problem comes when the error happens half way through the execution then there is a lot of clean up do to as there will be random Line Items and a newly created BOM with only bits of material lines created.
This is my script:
// Table and field names for Table 1
let tableA = base.getTable("BOM");
let linkedMaterialItemsField = "Add Materials";
let linkedGarmentField = "Select Product";
let expectedDeliveryField = "Expected Delivery";
let launchDateField = "Launch Date";
let processCommentsField = "Process comments";
// Table and field names for Table2
let tableB = base.getTable("LAUNCH SHEET MATERIALS");
let typeField = "Type";
let chooseMaterialField = "Choose a material";
let freeTextField = "Free Text";
let positionUseField = "Position/Use";
let selectFreeColorField = "Select Free Color";
let amountField = "Amount";
// Start the script by informing the user
output.markdown("# Script Started: Duplicating Records");
try {
// Get the record in Table A where the button was pressed
output.text("Please select a record from Table A...");
let record = await input.recordAsync('Pick a launchsheet you want to dublicate', tableA);
// Check if the record is valid
if (record) {
//output.text(`Record selected: ${record.name}`);
output.text(`Creating a copy Launch sheet... ${record.name}`);
// Copy the specified fields from the original record to the new record in Table A
let newRecordId = await tableA.createRecordAsync({
[linkedGarmentField]: record.getCellValue(linkedGarmentField),
[expectedDeliveryField]: record.getCellValue(expectedDeliveryField),
[launchDateField]: record.getCellValue(launchDateField),
[processCommentsField]: record.getCellValue(processCommentsField)
});
output.text(`New launchsheet created...`);
// Get the linked records from Table B using the correct field name
let linkedRecords = record.getCellValue(linkedMaterialItemsField);
if (linkedRecords && linkedRecords.length > 0) {
output.markdown(`### ${linkedRecords.length} launch sheet materials will be copied:`);
// For each linked record in Table B, create a copy and link to the new record in Table A
let newLinkedRecordIds = [];
for (let i = 0; i < linkedRecords.length; i++) {
let linkedRecord = linkedRecords[i];
let recordInB = await tableB.selectRecordAsync(linkedRecord.id);
if (recordInB) {
output.text(`Copying linked materials ${i + 1} of ${linkedRecords.length}`);
let newLinkedRecordId = await tableB.createRecordAsync({
[typeField]: recordInB.getCellValue(typeField),
[chooseMaterialField]: recordInB.getCellValue(chooseMaterialField),
[freeTextField]: recordInB.getCellValue(freeTextField),
[positionUseField]: recordInB.getCellValue(positionUseField),
[selectFreeColorField]: recordInB.getCellValue(selectFreeColorField),
[amountField]: recordInB.getCellValue(amountField)
});
//output.text(`New linked record created in Table B with ID: ${newLinkedRecordId}`);
newLinkedRecordIds.push({id: newLinkedRecordId});
}
}
// Update the newly created record in Table A to link to the new records in Table B
await tableA.updateRecordAsync(newRecordId, {
[linkedMaterialItemsField]: newLinkedRecordIds // Use the variable as the key
});
//output.text(`Linked materials has successfully been copied and linked to new launchsheet.`);
} else {
output.text("It seems there are no linked materials to copy.");
}
output.markdown("# Launchsheet successfully copied!");
} else {
output.text('No launchsheet selected.');
}
} catch (error) {
output.markdown(`## Error: ${error.message}`);
output.text("An error occurred during the script execution. Please try again if the problem persist please call Kim");
}
Oct 02, 2024 08:24 AM
Hmm that script looks fine. I was thinking it might be due to the multiple "createRecordAsync" calls (usually we batch them up and use createRecordsAsync instead) and so I tried making a script that did 500 createRecordAsyncs and that ran without issues, albeit slowly
When it errors out like that on a record, when you try to rerun it on that record does it succeed? Are you able to recreate the issue reliably with a specific record? I'm wondering if it's tied to a specific data set or something
Long shot, but have you tried running the script on a different browser / computer / network?
If you could private message a read-only invite link to a duplicated copy of your base with some example data I'd love to try to recreate the error myself! https://support.airtable.com/docs/adding-a-base-collaborator#adding-a-base-collaborator-in-airtable
Oct 04, 2024 05:28 AM
When it errors out like that on a record, when you try to rerun it on that record does it succeed? Are you able to recreate the issue reliably with a specific record? I'm wondering if it's tied to a specific data set or something
Usually it then succeeds - so no I can't recreate it reliably or at a specific dataset. Which leads me to think it has something to do with my connection. But then I'll assume as soon as i activate the script it's running in the cloud and has nothing to do with my computer?
Long shot, but have you tried running the script on a different browser / computer / network?
I haven't tried that, but I will try and see how that goes.
If you could private message a read-only invite link to a duplicated copy of your base with some example data I'd love to try to recreate the error myself! https://support.airtable.com/docs/adding-a-base-collaborator#adding-a-base-collaborator-in-airtable
Thanks for this. It's for an external client and they've made me sign NDA etc... But if it persist, I'll see if they'll be OK with me sharing a copy of the base.
Oct 06, 2024 12:07 AM
re: But then I'll assume as soon as i activate the script it's running in the cloud and has nothing to do with my computer?
Ah, I believe script extensions run locally. I just tested this with the script I made that creates 500 records. I ran it, and while it was running, disconnected my wifi. Even though the script was running, no new records were created.
I noted the number of records that had been created (9) and then stopped the script. I then reconnected the wifi and refreshed the page. The number of records remained the same (9), and if it were running on the server I'd expect it to have continued making records when I was offline, does that make sense?
Oct 07, 2024 02:21 AM
Hi Adam that makes sense.
So you reckon it's the internet connection or the power of the machine running it (I assume the last option shouldn't be problem unless it's an old calulator)?
Oct 07, 2024 05:36 AM
Possibly! It's why I was thinking of trying it out on a different network / computer. What sucks is that it's so hard to test since it's so random though