The easiest way I can think of to pull this off is with a script in the Scripting app. Add a checkbox field named “Copy”, and check that box on all records that you want to duplicate. With that, the following script could easily find those checked records, make new records that match them, and uncheck the original records. In case your checkbox field is named something besides “Copy”, change the relevant lines in the code to match your field name.
let table = base.getTable(cursor.activeTableId)
let query = await table.selectRecordsAsync()
let checked = query.records.filter(record => {return record.getCellValue("Copy") === true})
// Uncheck the current records
let uncheck = checked.map(record => {return {id: record.id, fields: {"Copy": false}}})
while (uncheck.length > 0) {
// @ts-ignore
await table.updateRecordsAsync(uncheck.slice(0, 50))
uncheck = uncheck.slice(50)
}
// 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)
}
while (newRecords.length > 0) {
await table.createRecordsAsync(newRecords.slice(0, 50))
newRecords = newRecords.slice(50)
}