Dec 20, 2022 07:55 AM - edited Dec 20, 2022 07:56 AM
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!');
Dec 20, 2022 08:39 AM
Hi @Jodi_Harris
You can use the INPUT (left panel while editing the script in the automation) to include the Record id.
You will need to define that in the script
You can then change this part
let selectedEvent = await input.recordAsync('Choose record', parentTable);
to be
let selectedEvent = recordId
Dec 20, 2022 01:01 PM
Thank you! I feel like I'm very close but something is still off. Here's a screenshot of how I set it up and the error:
Also here's the code as a whole in case that's helpful:
// 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 parentType = parentTable.getField("Project");
// Define Inpute Variables
let config = input.config();
let recordid = config.recordid;
// Select parent record to create child records & select type
let selectedEvent = recordid;
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!');
Dec 21, 2022 03:37 AM
Dec 21, 2022 10:11 AM
Got this error after removing line 32