May 24, 2022 07:59 AM
Hello,
Can someone help me to write a code to extract all the URLs associated with my attachment in a particular record?
As you can see here, i have 3 photos where i need to generate “https://dl.airtablexxx1,https://dl.airtablexxx2,https://dl.airtablexxx3” in a field named “joined”
Thank you for helping me
Solved! Go to Solution.
May 25, 2022 07:10 AM
Sorry, didn’t check for that. Here you go:
const table = base.getTable("Table 5")
const recordsQuery = await table.selectRecordsAsync();
let updateArray = [];
// iterate over all records
recordsQuery.records.forEach(record => {
const attField = record.getCellValue("Attachment 1");
// iterate over object and save as url
if(attField) {
let urlArray = [];
attField.forEach(item => urlArray.push(item.url))
const urlString = urlArray.join(', ')
updateArray.push({id: record.id, fields: {"Joined": urlString}})
}
})
// update records
while (updateArray.length > 0) {
await table.updateRecordsAsync(updateArray.slice(0, 50));
updateArray = updateArray.slice(50);
}
May 24, 2022 08:32 AM
Hi Kenny, just wrote a script that does the job (please change table name in base.getTable("...")
as well as the attachment field in const attField = record.getCellValue("...");
and the field to be updated at the end):
const table = base.getTable("Table 5")
const record = await input.recordAsync("Please select record", table);
// Select attachment field
const attField = record.getCellValue("Attachment 1");
// iterate over object and save as url
let urlArray = [];
attField.forEach(item => urlArray.push(item.url))
const urlString = urlArray.join(', ')
// update field
await table.updateRecordAsync(record.id, {
"Joined": urlString,
})
This script works with a button as well as by selecting the record in the script. Please let me know if you have any questions!
May 24, 2022 08:34 AM
PS: Works for any number of attachments / URLs in a given field
May 24, 2022 08:30 PM
Thanks for your effort. Can we RUN this script in the dashboard so that the script runs for the WHOLE records?
May 24, 2022 11:25 PM
I assume with “dashboard” you mean the app section on the right side? In this case we would need to iterate over all records instead of selecting a single record (via button or input in script). Then we run the script for every record just like before:
const table = base.getTable("Table 5")
const recordsQuery = await table.selectRecordsAsync();
// iterate over all records
recordsQuery.records.forEach(async record => {
const attField = record.getCellValue("Attachment 1");
// iterate over object and save as url
let urlArray = [];
attField.forEach(item => urlArray.push(item.url))
const urlString = urlArray.join(', ')
// update field
await table.updateRecordAsync(record.id, {
"Joined": urlString,
})
})
You will still have to replace those field names in red of course.
May 24, 2022 11:40 PM
Sorry it was too early here and didn’t think about API rate limits :grinning_face_with_big_eyes: (15 writes per second and 50 records in one call). I changed the script and it should work for any number of records:
const table = base.getTable("Table 5")
const recordsQuery = await table.selectRecordsAsync();
let updateArray = [];
// iterate over all records
recordsQuery.records.forEach(record => {
const attField = record.getCellValue("Attachment 1");
// iterate over object and save as url
let urlArray = [];
attField.forEach(item => urlArray.push(item.url))
const urlString = urlArray.join(', ')
updateArray.push({id: record.id, fields: {"Joined": urlString}})
})
// update records
while (updateArray.length > 0) {
await table.updateRecordsAsync(updateArray.slice(0, 50));
updateArray = updateArray.slice(50);
}
May 25, 2022 01:58 AM
Thanks mate! It’s very useful.
May 25, 2022 07:03 AM
Rupert, i got strikethrough syntax there. Is it okay to proceed?
May 25, 2022 07:05 AM
I got this error…
The “Joined” field is Single Text field in my side. Is this correct?
May 25, 2022 07:08 AM
Is it because i have records which has empty attachment field? If yes, how can i ignore those records?