Jul 31, 2022 12:43 PM
Hello the Airtable Community!
I’m working on a series of Airtable interfaces to handle different aspects of projects. It’s a kind of top-down structure, with interfaces drilling down into linked records e.g. clients > projects > invoices.
The typical interfaces structure looks like this:
To navigate between interfaces in the same client / project context, I’m using record pickers.
At the moment, I manually pick the relevant record with the record picker and copy the URL parameters generated by Airtable back to my Airtable base. With such hardcoded URL parameters, I can repeatedly achieve the navigation flow that I’m eventually aiming for.
Is there a way to do this “properly” dynamic, with a native Airtable function (such as RECORD_ID()) or similar? Is there an existing documentation that I missed? Is it not yet possible and somewhere in the AT roadmap?
The record picker URL parameters that I’m using are in this format: PggT2=b%3AeyIwbZpEcyI2W1swOFsicmVjeXZQeEl1ZWJYSmg1ek4iERF1dfA.
It’s made of a first part unique per table: PggT2=b%3AeyIwbZpEcyI2W1swOFsicmVj and a variable part per record: eXZQeEl1ZWJYSmg1ek4iERF1dfA. So far I didn’t find the pattern to be able to generate it at scale…
Any help would be greatly appreciated!
Solved! Go to Solution.
Oct 31, 2022 09:30 AM
I encountered the same issue when trying to generate buttons to navigate between pages with a similar set of filters/record pickers.
As you have seen from the URLs, filter values are encoded within the URL directly. The key here is that filters rely on base 64 encoding so that a single parameter value contains both the selected record ID and the filter type it is checked against.
You can use an online converter like this one to convert a record ID into base 64.
In my case, to make things work without having to convert manually every ID, I added an automation when a new record is created in my table which computes the base 64 record ID via a script :
function base64Encode(a, includePadding = true) {
var c, d, e, f, g, h, i, j, o, b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", k = 0, l = 0, m = "", n = [];
if (!a) return a;
do c = a.charCodeAt(k++), d = a.charCodeAt(k++), e = a.charCodeAt(k++), j = c << 16 | d << 8 | e,
f = 63 & j >> 18, g = 63 & j >> 12, h = 63 & j >> 6, i = 63 & j, n[l++] = b.charAt(f) + b.charAt(g) + b.charAt(h) + b.charAt(i); while (k < a.length);
return m = n.join(""), o = a.length % 3, (o ? m.slice(0, o - 3) :m) + (includePadding ? "===".slice(o || 3) : "");
}
let inputConfig = input.config();
output.set('base64ID', base64Encode(inputConfig.recordID, false));
The script is set up to have the created record ID as an input and writes the result in its output which is used to fill a field of the corresponding record in a following action.
After that, I just wrote down the few URLs of my interfaces and replaced record IDs in both their original and base64 encoded forms.
For example, one of my buttons has a URL formula looking like:
IF({Base64 ID}, "https://airtable.com/myapphashname/pageHashName?PICKERID=" & RECORD_ID() & "&FILTERID=b%3ABCDEFGHIJ" & {Base64 ID} & "iXV1dfQ")
This works pretty well in my case without any user input required to set things up.
Aug 05, 2022 02:13 PM
Hello Airtable!
I guess something is missing in my first post to get replies…
Is my post unclear ?
The answer obvious ? or announced on Airtable roadmap ?
Been answered before multiple times already ?
Any hint would be welcome , thanks!
Oct 31, 2022 09:30 AM
I encountered the same issue when trying to generate buttons to navigate between pages with a similar set of filters/record pickers.
As you have seen from the URLs, filter values are encoded within the URL directly. The key here is that filters rely on base 64 encoding so that a single parameter value contains both the selected record ID and the filter type it is checked against.
You can use an online converter like this one to convert a record ID into base 64.
In my case, to make things work without having to convert manually every ID, I added an automation when a new record is created in my table which computes the base 64 record ID via a script :
function base64Encode(a, includePadding = true) {
var c, d, e, f, g, h, i, j, o, b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", k = 0, l = 0, m = "", n = [];
if (!a) return a;
do c = a.charCodeAt(k++), d = a.charCodeAt(k++), e = a.charCodeAt(k++), j = c << 16 | d << 8 | e,
f = 63 & j >> 18, g = 63 & j >> 12, h = 63 & j >> 6, i = 63 & j, n[l++] = b.charAt(f) + b.charAt(g) + b.charAt(h) + b.charAt(i); while (k < a.length);
return m = n.join(""), o = a.length % 3, (o ? m.slice(0, o - 3) :m) + (includePadding ? "===".slice(o || 3) : "");
}
let inputConfig = input.config();
output.set('base64ID', base64Encode(inputConfig.recordID, false));
The script is set up to have the created record ID as an input and writes the result in its output which is used to fill a field of the corresponding record in a following action.
After that, I just wrote down the few URLs of my interfaces and replaced record IDs in both their original and base64 encoded forms.
For example, one of my buttons has a URL formula looking like:
IF({Base64 ID}, "https://airtable.com/myapphashname/pageHashName?PICKERID=" & RECORD_ID() & "&FILTERID=b%3ABCDEFGHIJ" & {Base64 ID} & "iXV1dfQ")
This works pretty well in my case without any user input required to set things up.
Nov 26, 2022 06:39 AM
Thanks Alan, I was getting a bit desperate for a solution and missed the notification of your super detailed answer!
Let me try to implement your suggestion and confirm it works in my context.
Apr 08, 2023 12:13 AM
@Alan_Transon, You just saved my day!!! Working here. Thanks.
May 23, 2023 01:59 PM
@Alan_TransonThanks for sharing your script - this unlocked a feature I've been trying to implement for days!