Hi all! Hoping you can help me with something.
Context- I need to be able to load a template via an interface (therefore, can't set up a button to do it).
There is a handy little extension in Airtable called "Create records for multiple templates" that basically sets up a script for you to achieve this. However, because I need to move this into an automation, and the automation action "run a script" can't communicate with the extensions dashboard, I need to convert the dashboard script to work for automations.
I've updated the //define fields from script settings portion, but I haven't worked out how to hard code in the part where it wants user input on which record to choose. I've pasted the script below, and the lines (I think) that are the issue are 24-34 (under the // Select parent record to create child records & select type section). I basically want it to run the script on the record in which the automation is triggered by.
So in this case, there is a checkbox that will be checked, and I want the script to run on that record.
Any help would be greatly appreciated!
Script as follows:
// Define tables from script settings
let parentTable = base.getTable("LOA Log");
let typesTable = base.getTable("Projects");
let childTable = base.getTable("LOA Tasks");
let templateTable = base.getTable("PROCESS TEMPLATES");
if ([typesTable, childTable, templateTable].indexOf(parentTable) != -1 ||
[childTable, templateTable, parentTable].indexOf(typesTable) != -1 ||
[templateTable, parentTable, typesTable].indexOf(childTable) != -1) {
throw new Error("Parent table, type table, template table, and child table should all be different tables.")
}
// Define fields from script settings
let childFieldInTemplate = templateTable.getField("Task");
let childNameInChild = childTable.getField("Task");
let childOrder = childTable.getField("Task Order");
let templateOrder = templateTable.getField("Task Order");
let templateType = templateTable.getField("Process");
let parentFieldInChild = childTable.getField("Record");
let projectType = parentTable.getField("Project");
// Select parent record to create child records & select type
let selectedEvent = await input.recordAsync('Choose record', parentTable);
while (!selectedEvent) {
output.text('You must select a record.');
selectedEvent = await input.recordAsync('Choose record', parentTable);
}
let parentType = selectedEvent.getCellValue(settings.parentType);
// Look up template records
let typesQuery = await templateTable.selectRecordsAsync();
let typesRecords = typesQuery.records;
// Filter the template records to match the selected type & add the parent ID to the map
let types = typesRecords.map(c => ({
'child': [c],
'childName': c.getCellValue(childFieldInTemplate),
'templateTypes': c.getCellValue(templateType).map(x => x.id),
'templateOrder': c.getCellValue(templateOrder),
// Add additional template fields here and in section below using format below.
// Field names within c.getCellValue parentheticals should match field names in template table
// 'templatePhase':c.getCellValue('Phase'),
// 'templateDays': c.getCellValue('Days')
'templateChecklist': c.getCellValue('Checklist'),
'templateNotes': c.getCellValue('Notes'),
'templateStartDate': c.getCellValue('Start Date'),
'templateDueDate': c.getCellValue('Due Date'),
'templateReference': c.getCellValue('Reference'),
'templateAttachments': c.getCellValue('Attachments'),
'templateAssignee': c.getCellValue('Assignee'),
'templateRole': c.getCellValue('Role Responsible'),
'templateStatus': c.getCellValue('Status'),
})).filter(x => x.templateTypes.includes(parentType[0].id))
// Create the child records and sort them so that they are in order
let createRecords = types.map(c => ({
fields: {
[childNameInChild.name]: c.childName,
[parentFieldInChild.name]: [selectedEvent],
[childOrder.name]: c.templateOrder,
// Add additional template fields here and in section above using format below.
// Field names on the left should match field names in child table.
// Field names on the right following c. should match names created in section above that starts at line 72.
// 'Phase':c.templatePhase,
// 'Days': c.templateDays
'Checklist':c.templateChecklist,
'Notes': c.templateNotes,
'Start Date': c.templateStartDate,
'Due Date': c.templateDueDate,
'Reference': c.templateReference,
'Attachments': c.templateAttachments,
'Assignee': c.templateAssignee,
'Role Responsible': c.templateRole,
'Status': {name: "To Do"},
}
})).sort((a, b) => {
return a.fields[childOrder] - b.fields[childOrder];
});
if (selectedEvent) {
// create records in batches of 50
while (createRecords.length > 0) {
await childTable.createRecordsAsync(createRecords.slice(0, 50));
createRecords = createRecords.slice(50);
}
}
output.text('Done!');