Jul 03, 2024 03:22 PM
Hi y’all.
I’m breaking my head over the next automation.
I want to copy records from one table (A) to another (B) or update existing records in table B (Input table=A ; Copy table=B)
Input Table A is using the import excel possibility. This is raw data from another source. In order to import correctly i’ll have to empty table A every time before importing the new data. Not using this function is out of the option because certain data fields disappear when trying to copy paste.
My solution so far:
Automation 1: when imported i create linked field to table B and let the automation update this field with the filenumber (unique) from table A. Thus A&B are linked. after deleting the data in A, with the next import this wil link A back to B no matter it’s position.
Automation 2: via lookup fields from table A in table B i copy then to the fields in table B. So when the data in Table A is deleted, this wil not delete the data in table B.
I tried setting up an update record automation but i get jammed the moment i try to make automation that first updates table A, and then copy the data in table B for the linked records in one automation.
Why not 2 separate automations? this needs to be done daily on a minimum of 2000 records. So i’ll burn through the automation limit in no time. I tried scripting but the 30 sec. Rule makes it impossible to find, update or create records in time. Even if i linked 25 behind each other.
if someone could help me, encountered something similar i would be mighty grateful 🙏
thanks in advance!
Best regards Michiel - fellow airtable enthousiast!
Jul 03, 2024 06:54 PM
Hmm, what issue did you face when making the automation? I think I'd set it up as:
1. "Update record" action to link the Table A record to the Table B record
2. "Find record" action to find the record that was just created in Table B
3. "Update record" action to paste the values from the lookup fields into the text fields in Table B
Jul 03, 2024 10:50 PM
I have a problem with the record ID. I can’t manage to find or link the proper record ID from the second table in the update record automation.
Jul 04, 2024 04:03 AM
If you provide a read-only invite link to a duplicated copy of your base I can troubleshoot this for you!
Jul 04, 2024 05:34 AM
Hi Adam
Thank you for your response allready.
Below you can find the read only link.
I tried to explain in the base per record what the steps are.
Best regards Michiel
Jul 04, 2024 06:05 AM - edited Jul 04, 2024 08:21 PM
Thanks for the link! I set up the automation like so:
1. "Update record" action to link the Table A record to the Table B record
2. "Find record" action to find the record that was just created in Table B
3. "Update record" action to paste the values from the lookup fields into the text fields in Table B
And it now works as expected:
Jul 04, 2024 06:35 AM
Hi Adam.
You make it look so easy 🙂
Do you want to share the base with me so i could my way back to how you designed this?
The base you shared is something differently without any automation in it.
Best regards, Michiel
Jul 04, 2024 08:22 PM
Ah, sorry! I've updated the link and it now goes to the correct base
Jul 06, 2024 04:46 AM - edited Jul 06, 2024 05:08 AM
Hi,
I would use scripting. No matter how much records you have, all in-memory operations will be completed in less than a second. The 'bottleneck' is table create/update operations. How much records expected to be in Table B, to be updated/created?
For example, this one completed in 18 seconds
const {rec_id,item,command,name}=input.config()
const source=base.getTable('T1')
const writeTo=base.getTable('T2')
//Fetch data
const url = command
const options = {
method: "GET",
headers: {'Cache-control':'no-cache', Authorization: O } };
const fetchdata=await fetch(url, options).then(request => request.json())
const loaded=fetchdata['result']
console.log(fetchdata)
//Process data
const unpack=(el,{date,status,price,...rest}=el)=>({item,name,date,status,price})
const unwrap=obj=>unpack(obj)
const newdata=loaded.map(unwrap)
//Load existing data
const itemdate=r=>r.getCellValue('item')+r.getCellValue('date')
const query=await writeTo.selectRecordsAsync({fields:writeTo.fields})
const filtered=query.records.filter(r=>r.name===name)
const existed=new Map(filtered.map(r=>[itemdate(r),r.id]))
//Functions to compare, update and create
const create=(el)=>({fields:el})
const update=({item,date,...rest})=>({id:existed.get(item+date)||'',fields:rest})
const compare=['name','status','price']
const otherdata=r=>compare.map(c=>r.getCellValueAsString(c)).join(',')
const databyid=id=>otherdata(query.getRecord(id))
const upd=[];const crt=[]
//Distribute - records with new item+data to create, existing - update. Exclude if there is nothing to update
const needSave=({item,date,...rest})=>databyid(existed.get(item+date))!=Object.values(rest).join(',')
newdata.forEach(j=>{ existed.has(j.item+j.date)? upd.push(j) : crt.push(create(j)) })
const tosave=upd.filter(needSave).map(update)
//Write to table
while (tosave.length) await writeTo.updateRecordsAsync(tosave.splice(0,50))
while (crt.length) await writeTo.createRecordsAsync(crt.splice(0,50))
output.set('status','Completed succesfully')
It's not ready-to-work, I wiped 3 lines with auth and edited some sensitive data , but most of it can be used as example to build yours.
Note: all my data is text. You have single select field, which can't be just written in the same form as read
you can pass value through function
const writeSngSel_orNameItAsYouWish=({name,...rest})=>({name})
or use {name: value.name} as value to write
or just turn second table field to text and write the result of getCellValueAsString()
Jul 07, 2024 01:03 PM
Hi Adam
Thanks for sharing. Because of this i now understand the find records automation better. But sadly it still triggers record per record. So if i import 2000 records daily i'm through my automations on less then 15 days.
Still, thanks for the support.