Help

The Community will be undergoing maintenance from Friday February 21 - Friday, February 28 and will be "read only" during this time. To learn more, check out our Announcements blog post.

Re: Map or catalog all existing bases, tables, automations, and interfaces

408 1
cancel
Showing results for 
Search instead for 
Did you mean: 
phpolicylady
5 - Automation Enthusiast
5 - Automation Enthusiast

Our team has fallen deep into the airtable ocean! We love them and so do our clients...

That said, we now have so many bases, tables, interfaces, etc. that it's getting difficult to remember where things are or who created what.

I'm hoping that something already exists that will easily allow me to take and catalog all the various workspaces, bases, etc. easily without needing me to go into each one to create a new table(s) that have this information in it.

If no extension or tool exists, perhaps someone could share a table structure they already use to maintain order in their chaos? I need to set up something quickly!

5 Replies 5
BillH
9 - Sun
9 - Sun

I find the base schema extension to be very helpful.  

phpolicylady
5 - Automation Enthusiast
5 - Automation Enthusiast

I agree - however that is only visible within a specific base and doesn't give me the details I'm wanting.

I'd like to have some kind of magic wand that would look at all the various bases I have access to and catalog them based on the various attached interfaces, automations, scripts, external links, etc. and place all of that information inside a table for my team to be able to access to search. I hope this makes better sense as to what I'm looking for.

I think, maximum scope that you can access by developing extension is a base.
So, nothing bigger than base schema unless it's some other type of tool
You can use admin panel and the lists of Workspaces, Bases.

One day, when I learned enough JS to do something in Airtable, and understood array/objects and all those stuff, I thought about kind of meta-base-schema.
So I used info about Workspaces, bases, etc to build a kind of 'model' base, where Workspaces are tables and Bases are fields, and used  Base Schema on it.
The next try was one step down - Bases are Tables and Tables are Fields. And Bases linked into kind of constellations, forming Workgroups.

I don't like result too much, you can take a look.
So I decided it doesn't worth developing for me, and the only remix of base schema I using is where 1 string added to code, filtering all fields except linked.
It useful from time to time, when base have 25+ tables, and some of them have 100+ fields, so when you zoom to fit the schema on a screen, the font is too small to read.

Regarding 'meta-schema' - I hope there may be good 3rd party thing for it, or some day we meet new great built-in tool.
 

phpolicylady
5 - Automation Enthusiast
5 - Automation Enthusiast

I would be very interested in your script used to develop this - if you are willing to share!

It was before change of starting screen, and I saved data (the part visible for my account) directly from html, part starting from {"liveappInitDataScope": as I had no Admin access. The script reads uploaded saved file from the record.
the correct and easier way to do it is to use csv for Bases and Workspaces saved from panel.
So, this code will not work now, and I'm rather dba, than dev, so you can ask LLM to reformat in more readable version for you, to reference.. 

const table=base.getTable('upload') //airtable.com html uploaded
const recs=await table.selectRecordsAsync({fields:['Attachments']})
const rec=recs.records[0].getCellValue('Attachments')[0].url
const html=await remoteFetchAsync(rec)
const text=await html.text()
//html saved from F12 on main page, workspaces view. JSON can be parsed from text
const entData=await JSON.parse(text)
const {rawTables,rawApplications,rawWorkspaces}=entData

const vis=['visibleApplicationOrder','visibleTableOrder','']; const rows=[];
const WAT=['Workspaces','Bases','Tables']; const wat=[];let index=0
while (wat.length<3) await creator(WAT[wat.length])
rows[0]=({id,name,visibleApplicationOrder,...rest})=>({fields:{id,name,[vis[0]]:visibleApplicationOrder.join()}})
rows[1]=({id,name,visibleTableOrder,...rest})=>({fields:{id,name,[vis[1]]:visibleTableOrder.join()}})
rows[2]=t=>({fields:{id:t.id,name:t.name}})
const records=[rawWorkspaces,rawApplications,rawTables].map((r,ix)=>Object.values(r).map(rows[ix]))
output.inspect(records)
for (let rec of records) while (rec.length) await wat[records.indexOf(rec)].createRecordsAsync(rec.splice(0,50));

async function creator(tab) {
const flds=['id','name',vis[wat.length]].filter(n=>n).map(x=>({'name':x,'type':'singleLineText'}))
output.text(`create table: ${tab}`)
// @TS-ignore, linter lies
wat.push(base.getTable(await base.createTableAsync(tab,flds))); return}