The Community will be temporarily unavailable starting on Friday February 28. We’ll be back as soon as we can! To learn more, check out our Announcements blog post.
May 03, 2023 10:44 PM
Good morning team,
I’m trying to run this automation script that works on a base with 82,000 records but now throws this error since May 3, 2023. This is the first time that it happened on my base.
Just a bit of a background, my Airtable base is connected to Softr as well.
This is the code developed:
Can someone help me to fix this error.
Thank you in advance!
Solved! Go to Solution.
May 04, 2023 07:40 AM
Hey @Francoloco23!
Try this out:
const { record_id } = input.config();
const sourceTable = base.getTable("Bulk Upload");
const destinationTable = base.getTable("Bulk Upload Extract");
const selectedField = sourceTable.getField("Attachments");
const nameField = destinationTable.getField("File name");
const attachmentField = destinationTable.getField("Attachments");
let record = await sourceTable.selectRecordAsync(record_id);
let recordAttachments = record.getCellValue(selectedField);
if (recordAttachments) {
let newRecords = recordAttachments.map(attachment => ({
fields: {
[nameField.id]: attachment.filename,
[attachmentField.id]: [{ url: attachment.url }]
}
}));
while (newRecords.length > 0) {
await destinationTable.createRecordsAsync(newRecords.slice(0, 50));
newRecords = newRecords.slice(50);
}
}
The reason your script was exceeding the maximum execution time is because you were doing an indiscriminate query for all 82,000 records in your table. The number of records isn't a problem. Instead, the problem was that you were not just querying every record, but you were also grabbing every field object as well, which is a massive amount of data to pull just for you to filter out a gargantuan 99.9% of that data.
You can optimize your script performance by utilizing the selectRecordAsync method instead of the selectRecordsAsync method.
Since you already have a record id of the record you're looking for, there's no need to grab every record when you can simply query the record you're looking for directly.
May 04, 2023 07:40 AM
Hey @Francoloco23!
Try this out:
const { record_id } = input.config();
const sourceTable = base.getTable("Bulk Upload");
const destinationTable = base.getTable("Bulk Upload Extract");
const selectedField = sourceTable.getField("Attachments");
const nameField = destinationTable.getField("File name");
const attachmentField = destinationTable.getField("Attachments");
let record = await sourceTable.selectRecordAsync(record_id);
let recordAttachments = record.getCellValue(selectedField);
if (recordAttachments) {
let newRecords = recordAttachments.map(attachment => ({
fields: {
[nameField.id]: attachment.filename,
[attachmentField.id]: [{ url: attachment.url }]
}
}));
while (newRecords.length > 0) {
await destinationTable.createRecordsAsync(newRecords.slice(0, 50));
newRecords = newRecords.slice(50);
}
}
The reason your script was exceeding the maximum execution time is because you were doing an indiscriminate query for all 82,000 records in your table. The number of records isn't a problem. Instead, the problem was that you were not just querying every record, but you were also grabbing every field object as well, which is a massive amount of data to pull just for you to filter out a gargantuan 99.9% of that data.
You can optimize your script performance by utilizing the selectRecordAsync method instead of the selectRecordsAsync method.
Since you already have a record id of the record you're looking for, there's no need to grab every record when you can simply query the record you're looking for directly.