Skip to main content
let twoLettersToNumber = {
"ah": 5,
"ch": 8,
"wh": 16,
"tz": 18,
"sh": 21,
"ta": 22,
"th": 22,
};

let lastLetterToNumber = {
"m": 12,
"p": 12,
};

let letterToNumber = {
"a": 1,
"b": 2,
"c": 11,
"d": 4,
"e": 5,
"f": 18,
"g": 3,
"h": 5,
"i": 10,
"j": 10,
"k": 19,
"l": 12,
"m": 13,
"n": 14,
"o": 6,
"p": 17,
"q": 19,
"r": 20,
"s": 15,
"t": 9,
"u": 6,
"v": 6,
"w": 6,
"x": 15,
"y": 16,
"z": 7,
};

/**
* @param {string} token
* @param {{ ah?: number; ch?: number; wh?: number; tz?: number; sh?: number; ta?: number; th?: number; a?: number; b?: number; c?: number; d?: number; e?: number; f?: number; g?: number; h?: number; i?: number; j?: number; k?: number; l?: number; m?: number; n?: number; o?: number; p?: number; q?: number; r?: number; s?: number; t?: number; u?: number; v?: number; w?: number; x?: number; y?: number; z?: number; }} dict
* @param {number[]} arr
*/
function tryInsert(token, dict, arr) {
if (token in dict) {
arr.push(dict[token]);
return true;
}
return false;
}

/**
* @param {string} name
*/
function nameToNumbers(name) {
var result = [];
for (var current = 0; current < name.length;) {
var token = name.substr(current, 2);
if (token.length == 2) {
if (tryInsert(token, twoLettersToNumber, result)) {
current += 2;
} else {
token = name[current];
if (tryInsert(token, letterToNumber, result)) {
current += 1;
} else {
throw `Invalid character found: ${token}`
}
}
} else {
if (tryInsert(token, lastLetterToNumber, result)) {
current += 1;
} else {
if (tryInsert(token, letterToNumber, result)) {
current += 1;
} else {
throw `Invalid character found: ${token}`
}
}
}
}
return result;
}

/**
* @param {number[]} columns
* @param {number[]} numbers
* @param {number} colIndex
*/
function addToColumns(columns, numbers, colIndex) {
for (let number of numbers) {
columns[colIndex] += number;
colIndex += 1;
colIndex = colIndex % columns.length;
}
return colIndex;
}

/**
* @param {number} number
*/
function sumDigits(number) {
let total = 0;
while (number) {
total += number % 10;
number = Math.floor(number / 10);
}
return total;
}

/**
* @param {number} number
* @param {{ (number: number): boolean }} predicate
*/
function reduceUntil(number, predicate) {
while (predicate(number)) {
number = sumDigits(number);
}
return number;
}

/**
* @param {number} number
*/
let greaterThan22 = number => number > 22;

/**
* @param {number} number
*/
let singleDigit = number => number > 9;

/**
* @param {number} number
* @param {number} firstNumberTotal
* @param {number} secondNumberTotal
*/
function reduce(number, firstNumberTotal, secondNumberTotal) {
number = reduceUntil(number, greaterThan22);
let firstNumber = number;
let secondNumber = reduceUntil(number, singleDigit);
firstNumberTotal += firstNumber;
secondNumberTotal += secondNumber;
return { columnValue: `${firstNumber}-${secondNumber}`, fnt: firstNumberTotal, snt: secondNumberTotal };
}

function reduceColumns(columns) {
var firstNumberTotal = 0;
var secondNumberTotal = 0;
for (var i = 0; i < columns.length; i++) {
var { columnValue, fnt, snt } = reduce(columns[i], firstNumberTotal, secondNumberTotal);
columns[i] = columnValue;
firstNumberTotal = fnt;
secondNumberTotal = snt;
}
firstNumberTotal = reduceUntil(firstNumberTotal, greaterThan22);
secondNumberTotal = reduceUntil(secondNumberTotal, singleDigit);
columns.push(`${firstNumberTotal}-${secondNumberTotal}`);
return columns;
}


/**
* @param {string} firstName
* @param {string} middleName
* @param {string} lastName
*/
function computeColumns(firstName, middleName, lastName) {
if (!firstName && !middleName && !lastName) {
throw "At least one of first name, middle name or last name should be given"
}
firstName = firstName ? firstName.toLowerCase() : "";
middleName = middleName ? middleName.toLowerCase() : "";
lastName = lastName ? lastName.toLowerCase() : "";

var columns = [0, 0, 0, 0, 0, 0];
var numbers = nameToNumbers(firstName);
var colIndex = 0;
colIndex = addToColumns(columns, numbers, colIndex);
numbers = nameToNumbers(middleName);
colIndex = addToColumns(columns, numbers, colIndex);
numbers = nameToNumbers(lastName);
colIndex = addToColumns(columns, numbers, colIndex);
return reduceColumns(columns);
}

//--------------------Airtable specific code-----------------

let columnNames = ["PK", "SK", "PT", "ST", "PG", "SG", "SD"];

// Set up input variables
let inputConfig = input.config();
let namesTable = base.getTable("DATABASE");
let firstNameField = inputConfig.firstName;
let middleNameField = inputConfig.middleName;
let lastNameField = inputConfig.lastName;
let linkedTable = base.getTable("TEMPLATES");
let pkField = inputConfig.pkField;
let skField = inputConfig.skField;
let ptField = inputConfig.ptField;
let stField = inputConfig.stField;
let pgField = inputConfig.pgField;
let sgField = inputConfig.sgField;
let sdField = inputConfig.sdField;
let linkedTableNameField = linkedTable.getField("Aspect#");
let aspectField = linkedTable.getField("Aspect");


async function createLinkedRecordDict() {
let dict = {};
let query = await linkedTable.selectRecordsAsync({
fields: [linkedTableNameField.name, aspectField.name]
});
for (let r of query.records) {
let name = r.getCellValueAsString(linkedTableNameField.name);
let aspect = r.getCellValueAsString(aspectField.name);
var key = `${name}${aspect}`;
key = key.trim();
dict[key] = r.id;
}
return dict;
}

let dict = await createLinkedRecordDict();

function findLinkedRecordId(attribute, aspect) {
var key = `${attribute}${aspect}`;
return dict[key];
}

let record = inputConfig;
if (record) {
let firstName = inputConfig.firstName;
let middleName = inputConfig.middleName;
let lastName = inputConfig.lastName;
let columns = computeColumns(firstName, middleName, lastName);

var error = false;
let pkLinkedRecordId = findLinkedRecordId(columns[0], 'Physical Karma');
if (!pkLinkedRecordId) {
console.error(`Failed to find a record with name ${columns[0]} and aspect Physical Karma in ${config.linkedTable.name} table`);
error = true;
}
let skLinkedRecordId = findLinkedRecordId(columns[1], 'Spiritual Karma');
if (!skLinkedRecordId) {
console.error(`Failed to find a record with name ${columns[1]} and aspect Spiritual Karma in ${config.linkedTable.name} table`);
error = true;
}
let ptLinkedRecordId = findLinkedRecordId(columns[2], 'Physical Talents');
if (!ptLinkedRecordId) {
console.error(`Failed to find a record with name ${columns[2]} and aspect Physical Talents in ${config.linkedTable.name} table`);
error = true;
}
let stLinkedRecordId = findLinkedRecordId(columns[3], 'Spiritual Talents');
if (!stLinkedRecordId) {
console.error(`Failed to find a record with name ${columns[3]} and aspect Spiritual Talents in ${config.linkedTable.name} table`);
error = true;
}
let pgLinkedRecordId = findLinkedRecordId(columns[4], 'Physical Goals');
if (!pgLinkedRecordId) {
console.error(`Failed to find a record with name ${columns[4]} and aspect Physical Goals in ${config.linkedTable.name} table`);
error = true;
}
let sgLinkedRecordId = findLinkedRecordId(columns[5], 'Spiritual Goals');
if (!sgLinkedRecordId) {
console.error(`Failed to find a record with name ${columns[5]} and aspect Spiritual Goals in ${config.linkedTable.name} table`);
error = true;
}
let sdLinkedRecordId = findLinkedRecordId(columns[6], 'Soul Destiny');
if (!sdLinkedRecordId) {
console.error(`Failed to find a record with name ${columns[6]} and aspect Soul Destiny in ${config.linkedTable.name} table`);
error = true;
}

// Set the output variable
if (!error) {
output.set('pkOutput', pkLinkedRecordId);
output.set('skOutput', skLinkedRecordId);
output.set('ptOutput', ptLinkedRecordId);
output.set('stOutput', stLinkedRecordId);
output.set('pgOutput', pgLinkedRecordId);
output.set('sgOutput', sgLinkedRecordId);
output.set('sdOutput', sdLinkedRecordId)
}
if (error) {
output.set('error', true)
}
}

Hi there! Can someone help me update the script above to be used in the scripting extension? 
My automation seems to have broken - I’m not sure if there was an update to Airtable, but this script has been working fine for over 4 years before today. 

Hi,

UPDATE: Yesterday I had strange problems with some scheduled automations. Today they launched OK. So it can be some internal Airtable problem, already solved, and you have just to wait.

 

About your script

automation supposed to have some values as input parameters

when automation triggered by some record

Like this

 


and do something with these values.
You should provide name of these fields.

The second question - how do you want to use scripting extension.
Currently, it takes data from some record that triggered automation.
You can do the same with scripting extension, to run against a single record when you press button (in Button field).