Sep 28, 2022 09:56 AM
Greetings!
I’m working on an airtable automation to operate from an interface button. the automation would do the following (the part im having trouble with is the script as the last step):
from the rest of the automation im passing three values into the script as inputs:
the script is currently “functional” but I’d like to make the following changes and im running up against my JS ability.
Any help would be much appreciated!
let inputConfig = input.config();
console.log(`The value of projectRecord is ${inputConfig.projectRecord}`);
let projectRecord = inputConfig.projectRecord;
let newProject = inputConfig.newProject;
console.log(`The value of new project is ${newProject}`);
let oldTasks = inputConfig.Tasks;
console.log(`The value of old task IDs is ${oldTasks}`);
let table = base.getTable('Tasks');
let queryResult = await table.selectRecordsAsync();
let checked = queryResult.records.filter(record => {return record.getCellValue('projRecord') == projectRecord})
// let checked = queryResult.getRecord(queryResult.recordIds[0]);
// Make new records based on those that were checked
let newRecords = []
for (let record of checked) {
let newRecord = {fields: {}}
for (let field of table.fields) {
// @ts-ignore
if (field.isComputed || field.name === "Copy")
continue
let value = record.getCellValue(field.name)
if (value === record.name)
value += " copy"
newRecord.fields[field.name] = value;
}
newRecords.push(newRecord);
table.updateRecordAsync(record, {'Project': newProject})
}
while (newRecords.length > 0) {
await table.createRecordsAsync(newRecords.slice(0, 50))
newRecords = newRecords.slice(50)
output.set('tasknew', newRecords);
}
Sep 28, 2022 07:36 PM
Hi,
that’s cool, I did some scripts where fields looped, but never used isComputed property, how can I forget…
i can’t check and i feel it may be bugged somewhere, but i see it that way (suppose primary field is ‘Name’):
let (projectRecord,newProject,oldTasks} = input.config();
let table = base.getTable('Tasks');
let goodfields=table.fields.filter(f=>!f.isComputed&&f.name!='Prio')
let query = await table.selectRecordsAsync({fields:goodfields, recordIds:oldTasks});
let duplicate=({'Name':n,'Project':p,'Status':s,...others}) => ({'Name':n+' copy','Project':newProject,'Status':'Planned',...others})
let oldRecs = query.records.map(r=>Object.fromEntries(goodfields.map(gf=>[gf.name,r.getCellValue(gf)])))
let newRecs = oldRecs.map(rec=>({fields:duplicate(rec)))
while (newRecs.length) await table.createRecordsAsync(newRecs.splice(0,50))
Sep 29, 2022 05:05 PM
Thanks for the response! I’ll try this
Sep 30, 2022 10:25 AM
So I’ve tested it, and im getting a similar error as before, and I did modify your script a bit. (the error refers to line 8 which is the last line of the script but I am assuming it’s referring to the Project field.
let {projectRecord,newProject,oldTasks} = input.config();
let table = base.getTable('Tasks');
let goodfields=table.fields.filter(f=>!f.isComputed&&f.name!='Prio')
let query = await table.selectRecordsAsync({fields:goodfields, recordIds:oldTasks});
let duplicate=({'Name':n,'Project':p,'Status':s,...others}) => ({'Name':n+' copy','Project':newProject,'Status':'Planned',...others})
let oldRecs = query.records.map(r=>Object.fromEntries(goodfields.map(gf=>[gf.name,r.getCellValue(gf)])))
let newRecs = oldRecs.map(rec=>({fields:duplicate(rec)}))
while (newRecs.length) await table.createRecordsAsync(newRecs.splice(0,50))
Sep 30, 2022 11:36 PM
You have field id, so you can check whether it’s ‘Project’. Use Manage Fields or output.table(Object.fromEntries([...base.getTable(cursor.activeTableId||'').fields.map(x=>([x.name,{type:x.type,id:x.id}]))]))
i suppose your Project field is not text but maybe multipleLinks. it needs array of links, so use:
let duplicate=({'Name':n,'Project':p,'Status':s,...others}) => ({'Name':n+' copy',
Project’: [ {‘id’:newProject} ] ,'Status':'Planned',...others})