Help

The Community will be temporarily unavailable starting on Friday February 28. We’ll be back as soon as we can! To learn more, check out our Announcements blog post.

Getting this "Error updating record: Field "fldkFF6U0cEliKKyy" cannot accept the provided value."

Topic Labels: Automations
635 3
cancel
Showing results for 
Search instead for 
Did you mean: 
cyber_nales
4 - Data Explorer
4 - Data Explorer

I am creating an automation script in transferring data from a source table to a target table. The source contains AI generated responses so everything is in text. I have 4 fields in the target table as single-select fields and I found out that the error I am getting is for those fields. Here's the code below. Hope someone can help.

 
let sourceTable = base.getTable('Update Repository'); 
let targetTable = base.getTable('UPdates'); 
 
let inputConfig = input.config();
let recordId = inputConfig.recordId;
let newRecord = inputConfig.newRecord;

// Fetch the record from the source table
let record = await sourceTable.selectRecordAsync(recordId);

// Fields where AI responses are stored in the source table
let flag1 = record.getCellValue('Name change - AI'); 
let flag3 = record.getCellValue('Future Fundraising - AI');
let flag4 = record.getCellValue('Future Tokens - AI');
let flag5 = record.getCellValue('Future Exit - AI');
let flag6 = record.getCellValue('Future Shutdown - AI');
let flag7 = record.getCellValue('One-liner AI');
let flag8 = record.getCellValue('Website Update - AI');
let flag9 = record.getCellValue('New Investors - AI');
let daterecord = record.getCellValue('Date'); 

function isFlagPresent(flag) {
    return flag !== 'None' && flag !== 'None.';
}

// Define valid options for single select fields
const validOptions = {
    Future_Raise: ['Mentioned', 'Not mentioned'],
    Future_Tokens: ['Mentioned', 'Not mentioned'],
    Future_Exit: ['Mentioned', 'Not mentioned'],
    Future_Shutdown: ['Mentioned', 'Not mentioned'],
};

if (newRecord) {
    let updateFields = {
        'Brand_Up': isFlagPresent(flag1) ? flag1 : null, 
        'Future_Raise': isFlagPresent(flag3) && validOptions.Future_Raise.includes('Mentioned') ? 'Mentioned' : 'Not mentioned',
        'Future_Tokens': isFlagPresent(flag4) && validOptions.Future_Tokens.includes('Mentioned') ? 'Mentioned' : 'Not mentioned',
        'Future_Exit': isFlagPresent(flag5) && validOptions.Future_Exit.includes('Mentioned') ? 'Mentioned' : 'Not mentioned',
        'Future_Shutdown': isFlagPresent(flag6) && validOptions.Future_Shutdown.includes('Mentioned') ? 'Mentioned' : 'Not mentioned',
        '1Liner_Up': isFlagPresent(flag7) ? flag7 : null,
        'Co-URL_Up': isFlagPresent(flag8) && flag8.startsWith("http") ? flag8 : null, // Ensure valid URL
        'New Investors_Up': isFlagPresent(flag9) ? flag9 : null,
        'Up_Date': daterecord ? daterecord : undefined,
    };

    // Log the update fields to check their values
    console.log("Update Fields:", JSON.stringify(updateFields, null, 2));

    // Check if any field is undefined
    for (const [key, value] of Object.entries(updateFields)) {
        if (value === undefined) {
            console.warn(`Field "${key}" is undefined. Skipping...`);
            delete updateFields[key]; // Optionally, remove undefined fields
        }
    }

    // Update the existing record in the target table
    try {
        await targetTable.updateRecordAsync(newRecord, updateFields);
        console.log(`Record ${newRecord} updated successfully.`);
    } catch (error) {
        console.error(`Error updating record: ${error.message}`);
    }
} else {
    throw new Error('No target record ID provided for updating.');
}
3 Replies 3

Check out the API docs for the expected formatting when updating single select fields: https://airtable.com/developers/scripting/api/cell_values#single-select

It expects:

{ id: string } | { name: string }

If I am to correct my script, how would that apply?

 

Alexey_Gusev
13 - Mars
13 - Mars

Hi,

I don't like to edit chatGPT generated code, so I rewrited it using my templates for basic operations
unfortunately, can't test, too much tables/fields to create

complete writeto={ } with other field pairs 

 

const source=base.getTable('Update Repository')
const dest=base.getTable('UPdates')
const {recordId,newRecord}=input.config()
const rec=await source.selectRecordAsync(recordId)
if(!rec) throw new Error('record not exists')

const writeto={
'Future Exit - AI' : 'Future_Exit',
'Future Shutdown - AI' : 'Future_Shutdown',
'One-liner AI' : '1Liner_Up',
'Website Update - AI' : 'Co-URL_Up'
}

const flds=writeto.keys().map(k=>source.getField(k))
const flag=x=>['None','None.'].includes(x)? 'Not mentioned':'Mentioned'
const convert=(fld,val=rec.getCellValue(fld))=>fld.type.includes('elect')
? {name:flag(val)}: writeto[fld.name].includes('URL')
? (val.startsWith('http')? val:null ) : val  

const update=Object.fromEntries(flds.map(f=>[writeto[f],convert(f)]).filter(el=>el[1]))
console.log(update); //filter el[0,1]=el[field,value]=>filter null values
await dest.updateRecordsAsync([{id:newRecord,fields:update}])

 

 
be aware to use with number fields in source, 0 will be filtered same as null.

Additionally, you can use this small script to get field(s) by part of ID, for example FF6 in your case

 

const fid=await input.textAsync('field ID or part').then(x=>a=>a.filter(b=>b.id.includes(x))); 
output.table(base.tables.filter(n=>fid(n.fields).length).map(t=>[t.name,fid(t.fields).map(f=>f.name).join()]))