1/17/2023 – BuiltOnAir Live Podcast Full Show – S13-E02
Duration: 58 minutes
Be Sure to Subscribe to the podcast!
To get all the latest videos and demonstrations from the BuiltOnAir Podcast, subscribe and get notified on our Youtube channel here and our newsletter/community here.
FULL EPISODE VIDEO
Watch the full video of the show. See below for segment details.
The BuiltOnAir Podcast is Sponsored by On2Air – Integrations and App extensions to run your business operations in Airtable.
In This Episode
Welcome to the BuiltOnAir Podcast, the live show. The BuiltOnAir Podcast is a live weekly show highlighting everything happening in the Airtable world.
Check us out at BuiltOnAir.com. Join our community, join our Slack Channel, and meet your fellow Airtable fans.
Kamille Parks – I am an Airtable Community Forums Leader and the developer behind the custom Airtable app “Scheduler”, one of the winning projects in the Airtable Custom Blocks Contest now widely available on the Marketplace. I focus on building simple scripts, automations, and custom apps for Airtable that streamline data entry and everyday workflows.
Dan Fellars – I am the Founder of Openside, On2Air, and BuiltOnAir. I love automation and software. When not coding the next feature of On2Air, I love spending time with my wife and kids and golfing.
Show Segments
Round The Bases – 00:03:09 –
Scripting Time – 00:17:56 –
Explore Scripting with “Select Options in Scripts”.
Kamille demonstrates how to work with creating new options for single or multi select fields when creating or updating records from a script.
An App a Day – 00:39:11 –
Watch as we install, explore, and showcase the Send SMS Easily App from the Airtable Marketplace. The app is described as “Send SMS Easily lets you send SMS messages from Airtable without having to sign up for a third-party SMS service. No complicated logins, phone number purchases, and API keys!”.
Automate Create – 00:44:00 –
Watch as we review and work through automations. Quickly Send Group Texts with just individual responses back using TextBelt
Full Segment Details
Segment: Round The Bases
Start Time: 00:03:09
Roundup of what’s happening in the Airtable communities – Airtable, BuiltOnAir, Reddit, Facebook, YouTube, and Twitter.
Segment: Scripting Time
Start Time: 00:17:56
Scripting Time: Select Options in Scripts
Explore Scripting with “Select Options in Scripts”.
Kamille demonstrates how to work with creating new options for single or multi select fields when creating or updating records from a script.
Segment: An App a Day
Start Time: 00:39:11
Airtable App Showcase – Send SMS Easily – Send SMS Easily lets you send SMS messages from Airtable without having to sign up for a third-party SMS service. No complicated logins, phone number purchases, and API keys!
Watch as we install, explore, and showcase the Send SMS Easily App from the Airtable Marketplace. The app is described as “Send SMS Easily lets you send SMS messages from Airtable without having to sign up for a third-party SMS service. No complicated logins, phone number purchases, and API keys!”.
Segment: Automate Create
Start Time: 00:44:00
Airtable Automations – Group Texts with Single Responses
Watch as we review and work through automations. Quickly Send Group Texts with just individual responses back using TextBelt
Full Transcription
The full transcription for the show can be found here:
[00:01:40] Welcome to this edition [00:01:43] of the BuiltOnAir podcast, season 11, [00:01:46] episode 12. Good to be back with you [00:01:48] this Tuesday morning myself, [00:01:50] Dan Fellars and Kamille [00:01:52] are hosting today. Welcome Kamille. Hello! [00:01:55] Good to have you as always, [00:01:57] Alli couldn't make it today. [00:01:59] And we will start [00:02:00] having more guests I believe [00:02:02] next week we have a guest coming on, [00:02:04] so we always love to have guests. But [00:02:06] if you are watching and you [00:02:08] are doing anything in Airtable, [00:02:10] we'd love to have you come on the show [00:02:12] and show us. So please reach out. [00:02:13] We'd love to have guests on the show, [00:02:15] but I will walk you through what we're [00:02:17] gonna be talking about today as always, [00:02:20] it's a one hour show where we go through [00:02:21] different segments. We always start [00:02:24] our Round the Bases to keep you up to date [00:02:26] with what's going on on Airtable [00:02:28] in the different communities, [00:02:29] then a quick shout out to [00:02:31] On2Air our primary sponsor [00:02:34] then Kamille is gonna walk through [00:02:36] some scripting and [00:02:38] show us how to work with [00:02:39] select options for single select [00:02:42] and I think also multi select. [00:02:45] They're not gonna go into [00:02:46] the marketplace and showcase [00:02:48] an app in the marketplace [00:02:49] for send sms easily [00:02:52] and then a quick shout out to [00:02:54] how to join our community. [00:02:56] And then finally, [00:02:56] I will go through an extension to [00:02:59] working with SmS [00:03:00] and text messages and and how [00:03:02] to automate that [00:03:04] using this app. So with that [00:03:08] Round the Bases with [00:03:10] what's going on in the Airtable community. [00:03:12] It was a little, it was pretty quiet [00:03:15] this week so not a whole lot of activity. [00:03:17] We'll start with Airtable's community [00:03:21] of what's going on again. [00:03:23] It was it was pretty quiet. [00:03:25] As we mentioned [00:03:27] last time activity in their [00:03:29] community is definitely dwindled off [00:03:31] quite a bit. Which is sad to see [00:03:34] but a couple of things worth [00:03:36] worth highlighting just briefly, [00:03:38] it looks like there's a new app [00:03:40] from Gavin at C. S. V. Getter [00:03:42] or a new update to [00:03:43] his app. So if you're dealing with [00:03:47] data collection or or making your data [00:03:50] available via an api you can check out [00:03:53] CSV getter from Gavin. [00:03:56] One thing I noticed was this new [00:03:59] forms and maybe the old ones [00:04:01] had issues with [00:04:03] this and and they were just better [00:04:05] at detecting but we're getting some spam [00:04:08] coming in to the new forms. [00:04:10] So this we love letter [00:04:12] starting the spam with [00:04:14] links to products that [00:04:16] are not related to Airtable. [00:04:19] So hopefully those get cleaned up [00:04:21] and hopefully this doesn't become, [00:04:22] I don't remember this being an issue [00:04:26] with the old system. There were like once [00:04:29] every six months someone would [00:04:31] come on and have [00:04:33] what looked like a perhaps a [00:04:35] genuine question but about something [00:04:37] completely unrelated to Airtable but [00:04:39] nothing to the degree of, [00:04:40] oh I think this is spam. [00:04:42] It was always like [00:04:43] I think they're just on the wrong forum. [00:04:46] I don't recall either [00:04:47] this being an issue. [00:04:49] Yeah so so we'll see if they [00:04:51] are able to kind of clean that [00:04:53] up but hopefully it doesn't take over. [00:04:56] But yeah not a lot going on. [00:04:58] There is January 26th an ama. [00:05:01] So for developers and [00:05:03] and if you're working with [00:05:05] the A. P. I. [00:05:06] January 26 apparently this doesn't know [00:05:10] to take things off that are past due [00:05:14] so this networking event [00:05:16] is already over. [00:05:19] But yeah so keeping up to date [00:05:20] with what's going on [00:05:22] but yeah it's been pretty [00:05:23] pretty quiet on the Airtable front [00:05:26] so nothing nothing new but there have [00:05:30] been updates but they they [00:05:32] aren't updating them here [00:05:34] so you need to join the [00:05:35] BuiltOnAir community. [00:05:36] We have amazing people [00:05:38] in the community that are always [00:05:39] good at spotting new features [00:05:41] that come out that don't [00:05:43] get the press release [00:05:44] from from Airtable. [00:05:46] So here's one of them from [00:05:48] Ben Bailey in the [00:05:50] BuiltOnAir community. [00:05:52] Apparently they changed or [00:05:55] at least I don't remember [00:05:57] seeing this before but now [00:05:59] there's different sections [00:06:01] within the comments. [00:06:02] Yeah. So before it was intermixed [00:06:05] revision history and comments and now you [00:06:07] can separate it out which I really like [00:06:10] as a feature. Sometimes I just want [00:06:13] to look at the comments but [00:06:15] especially in consulting [00:06:18] when you're testing new [00:06:20] operations like scripting and whatnot, [00:06:22] you're constantly making updates to a [00:06:24] test record but then my team [00:06:26] would be making comments [00:06:27] about oh I should do this, [00:06:28] it should do that [00:06:30] and having to filter in between [00:06:33] API has just added three three [00:06:36] it was not ideal and I think this is a [00:06:39] good [00:06:39] improvement. Yeah. Yeah for sure. [00:06:42] Especially if your comment heavy [00:06:44] a lot of places don't rely too much [00:06:47] on comments but some people do definitely [00:06:50] use the comments so this is great to help. [00:06:52] Yeah see the revisions I usually look [00:06:54] at the revision history. [00:06:59] so good catch by Ben [00:07:01] noticing that. Great great addition. [00:07:05] There's also another one [00:07:07] that Russell Bishop found [00:07:11] and this may have been noticed [00:07:13] maybe a little bit longer [00:07:15] but there they finally [00:07:16] like added this mark all as read [00:07:19] for the notifications [00:07:21] and he's highlighting [00:07:22] that he finally has a clean [00:07:25] notifications table or listing. [00:07:28] I have been using Airtable [00:07:30] at least since 2018, [00:07:32] possibly 2017 and there are so [00:07:34] many notifications. [00:07:35] I think I had hundreds that were [00:07:38] unread but I I knew of anything from [00:07:42] I've been added to a collaborator field to [00:07:45] an automation failed [00:07:47] and stuff dating back [00:07:48] quite literally five years and I can [00:07:51] finally clear them away. [00:07:53] It's such a simple thing [00:07:54] but I also very much [00:07:55] appreciate this edition. [00:07:57] Yeah. Yeah these are nice little [00:08:00] additions aren't huge features but [00:08:03] definitely helped just improve [00:08:05] the experience. So good too. [00:08:07] Good to see that [00:08:08] they're spending some time [00:08:10] on just you know the rough around [00:08:12] the edges parts of Airtable. [00:08:16] So that's a nice nice new edition. [00:08:19] And so yeah you can [00:08:20] actually see the unread [00:08:21] ones versus the read ones [00:08:23] and then mark always read, [00:08:25] you can also mark read [00:08:26] notifications back [00:08:27] as unread if you need to. [00:08:30] Yeah. Nice. Nice. [00:08:33] Alright last one. [00:08:34] This was kind of a fun Hannah [00:08:37] from our team posted a [00:08:39] thread in the in the BuiltOnAir community. [00:08:43] Tell us three words an Airtable [00:08:45] creator slash builder never wants to hear. [00:08:49] And so there's some [00:08:51] there's some good lists. [00:08:53] We had to work with Jen [00:08:55] on counting to three. [00:08:57] She liked to go over but she did [00:08:59] update hers to keep them within three. [00:09:02] I didn't see any from Kamille. [00:09:04] What's your three letter [00:09:05] word you don't want to [00:09:06] hear or three word. [00:09:10] I just remember looking at this [00:09:12] and Kuovonne had a good one. [00:09:14] And it sort of took effectively [00:09:17] what I was gonna say. Unscheduled service [00:09:20] interruption. [00:09:21] Yeah that's perfect. Yeah [00:09:24] and then this one that is far too common. [00:09:29] Refreshed the page. I think someone else [00:09:33] said I deleted it which is not [00:09:36] not often good either. [00:09:41] Yeah I gotta go with that. [00:09:45] Yeah. [00:09:47] More cowbell from Bill French. [00:09:51] Classic. [00:09:53] That's two words [00:09:54] cheating. [00:09:56] That's right. [00:09:58] Hit Airtable Limit. That's A Good one. [00:10:05] Yeah it's not working. [00:10:07] I need that tomorrow or today. [00:10:10] Need that today probably. [00:10:12] So don't be mad. [00:10:13] I deleted it [00:10:15] so there's some good ones. Fun. [00:10:17] Fun little way to spend [00:10:20] afternoon coming up with those so [00:10:23] yeah that's kind of what was going on, [00:10:27] Twitter was check twitter, [00:10:29] there's not a whole lot of activity. [00:10:31] Talking about Airtable so pretty, [00:10:33] pretty quiet week I think everybody [00:10:35] catching up with the new years and [00:10:37] and delay from [00:10:40] from the holidays and so [00:10:42] relatively quiet on the Airtable front. [00:10:46] We'll see if that changes [00:10:48] in the next couple of weeks or not. [00:10:50] Oh there was one I was trying [00:10:52] to find maybe [00:10:54] maybe it was sent out over an [00:10:55] email. I thought it was a post [00:10:58] from Airtable [00:10:59] but I couldn't find it talking [00:11:01] about [00:11:03] the changes to attachments. [00:11:07] It was an email. [00:11:10] So they sent out another reminder [00:11:12] email about the changes [00:11:14] to attachments which [00:11:15] are now going to be expiring links [00:11:17] with a little bit more detail which [00:11:20] answered some of my questions [00:11:22] and left some of my questions [00:11:25] still intact. [00:11:26] But [00:11:28] Yeah I got the email and about [00:11:30] 10 minutes later a former client of mine [00:11:32] forwarded it back to me [00:11:34] and said is this going to change [00:11:36] any of the apps that [00:11:36] you made? Which I made like two years ago [00:11:40] and I don't think they will but it [00:11:42] you know it's it's good practice [00:11:44] to go back and double check [00:11:46] if you've made any [00:11:46] sort of [00:11:48] scripting implementation or the [00:11:50] custom extensions a p I [00:11:52] just to double check and [00:11:53] see if you believe that you [00:11:56] would be affected by that practice. [00:11:59] I talked about in our earlier season [00:12:01] how I had to switch up my methodology for [00:12:04] my way my website was constructed. [00:12:07] I was pulling [00:12:08] attachment links from Airtable. [00:12:10] I now have to pull them from somewhere [00:12:12] because those links would be expiring. [00:12:14] But I think we've all come to the [00:12:16] conclusion. If you use a consistently [00:12:19] updating sync source, like if you have [00:12:22] your website built out of softer [00:12:25] or stacker or glide or any of those, [00:12:28] I believe you should be all right. [00:12:31] Yeah. [00:12:32] Yeah. And [00:12:34] what the email. [00:12:36] So there was a way where you could [00:12:38] opt out of the changes and [00:12:40] kind of keep things how they were. [00:12:43] And so there was talk [00:12:44] of whether you'd always [00:12:46] be able to opt out of that. [00:12:47] I think some people [00:12:48] in the community thought that [00:12:49] maybe they would just keep it that way. [00:12:52] But the email made it very clear that [00:12:54] that's going away [00:12:56] so you won't be able to opt out. [00:12:58] So that is going to be [00:12:59] forced behavior in the coming weeks. [00:13:04] So that might make people upset [00:13:06] that had opted out [00:13:08] and we're relying on the old [00:13:09] way and hoping that it continued. [00:13:14] All right, let's move on. So [00:13:16] On2Air is our primary sponsor. [00:13:19] It's an all in one toolkit [00:13:20] to run your business on Airtable. [00:13:22] Need to check it out at on2air.com [00:13:27] we did make some changes over the weekend. [00:13:30] We are kind of this year we're [00:13:32] focusing really on on really [00:13:35] pushing forward two of our applications in [00:13:38] particular are new form apps [00:13:40] that I'm going to talk a little bit about, [00:13:42] but also our backups, [00:13:44] those are really our core applications. [00:13:47] And so we did remove access to [00:13:49] some of our other apps, [00:13:51] so we're streamlining [00:13:52] this year to try to focus [00:13:54] and really make those our primary focus [00:13:59] and so we there is a back door way to [00:14:03] get access to some of our other apps [00:14:05] if your existing using our if you [00:14:08] already are using our apps, [00:14:10] those will continue and be supported [00:14:13] but for new [00:14:14] users coming on [00:14:16] you'll just see the backups and the forms [00:14:19] as apps that you [00:14:20] can utilize and [00:14:24] and yeah, so that's our focus [00:14:26] going forward, at least for the, [00:14:28] for the time being. [00:14:30] But with the On2Air forms [00:14:32] we're still in a private beta, [00:14:36] will be, will be coming out [00:14:37] of private beta going into a public beta [00:14:40] here in the [00:14:40] coming weeks. [00:14:41] One of the main reasons for that [00:14:44] is we really wanted to release [00:14:46] with the ability to have conditional logic [00:14:49] and so what that means is [00:14:51] if any field is updated [00:14:53] and meet certain criteria, [00:14:55] you can perform actions on [00:14:57] other fields within your form. [00:15:00] The most common being [00:15:01] showing and hiding fields [00:15:04] but you can also do other things. [00:15:06] So [00:15:07] this logic, we're in final QA phases, [00:15:10] we'll start rolling it out to select [00:15:13] customers in the coming days [00:15:16] and then to the rest in in a week or so. [00:15:19] But just to kind of give you a sneak peek [00:15:22] at what that is within the conditional [00:15:24] logic, there will just be a tab [00:15:26] that has the logic. [00:15:27] And then you can create new [00:15:28] logic [00:15:29] and you specify conditions on the fields. [00:15:32] So you specify a field that that [00:15:35] you're listening for changes. [00:15:38] And so if for example the email field, [00:15:41] you want to hide certain fields [00:15:44] if they haven't entered their email yet. [00:15:47] So you say if the email is empty, [00:15:49] that is your condition, [00:15:51] then you want to set up the tasks [00:15:54] that get performed [00:15:55] based off of that condition. [00:15:58] And so you can specify showing fields [00:16:00] or hiding fields or making fields required [00:16:03] or optional or displaying them [00:16:06] as text versus being editable, [00:16:08] or disabling them. You can also [00:16:12] update the actual value of a field. [00:16:17] Or if it's a date field, set it to now or [00:16:22] a checklist, a checkbox field, [00:16:24] you can set the true or false. [00:16:25] So the most common, you can show fields [00:16:28] and then you specify which fields you [00:16:30] want to show based off of that condition. [00:16:34] So you specify these fields maybe [00:16:37] that email but those ones [00:16:39] and then it has this easy way [00:16:41] to create the inverse, [00:16:43] which basically means [00:16:44] if the condition is not set then what [00:16:48] do you want to perform the opposite task, [00:16:51] which is usually what you want to do. [00:16:54] So you basically say if the condition of [00:16:56] the email being empty is met, [00:16:59] then I want to show these fields. [00:17:02] If it's not met then I want to hide those [00:17:05] same fields. So you simply set that up [00:17:08] and then the last one, [00:17:09] there's some optional advanced settings. [00:17:11] You can specify [00:17:12] that you only want this to run [00:17:15] when you're creating a new record [00:17:17] or when you're [00:17:18] editing a record [00:17:20] or when any of the fields are updated. [00:17:23] And so these usually [00:17:25] you don't have to touch [00:17:26] and that's it. Then you hit done. [00:17:28] And now you have this [00:17:29] logic that's running each time [00:17:31] you're updating your form. [00:17:33] So some cool stuff you [00:17:34] can do, you can do conditional [00:17:37] setting of the values or the formulas, [00:17:40] things of that nature. So [00:17:42] some fun stuff that we're excited to [00:17:44] get out there and and see people using. [00:17:46] So that is coming soon [00:17:49] to our users of our new forms. [00:17:54] All right, let's move on. [00:17:56] We're gonna do some segments. [00:17:58] We're gonna spend some [00:17:59] time in the scripting world with Kamille [00:18:02] if you want to share your screen. [00:18:04] I sure do about [00:18:07] options which are kind of tricky. [00:18:13] So I'm going to do my best to explain [00:18:21] sort of an issue with [00:18:23] working with select fields in scripting, [00:18:27] so as we know [00:18:29] in using Airtable's regular ui [00:18:33] if I look at this select [00:18:36] fields options, I have five [00:18:38] pretty standard select choices. [00:18:41] If I don't see one I [00:18:42] want let's say I want to just [00:18:44] an option called seven. [00:18:47] I'm allowed to create a [00:18:49] new option [00:18:50] um as I'm typing and not having [00:18:53] to do anything special [00:18:54] if you are connecting to [00:18:56] Airtable through [00:18:58] different api sources or if you're [00:19:02] using a custom app, there is a relatively [00:19:06] simple option that can be enabled. [00:19:09] Typically [00:19:10] that lets you do a similar thing. [00:19:12] If an option doesn't exist [00:19:14] for a single select or a multi select, [00:19:16] you can simply add one [00:19:18] as you're updating records. [00:19:20] With the scripting environment [00:19:21] using the scripting extension, [00:19:23] and I believe the automation scripts, [00:19:26] it's not quite as straightforward. [00:19:28] There is the ability to update [00:19:31] the single select [00:19:33] or multi select field with [00:19:35] new choices, but it's not quite [00:19:38] as smooth a process. So as I was thinking [00:19:43] through this use case which [00:19:45] came through one of the channels [00:19:48] on the BuiltOnAir [00:19:49] slack community. [00:19:51] A friend of the show, I believe it was Jen [00:19:55] was lamenting that it's not [00:19:58] straightforward and it really isn't [00:20:00] as I was thinking through what would you [00:20:02] have to add to a script that is [00:20:05] just trying to update [00:20:06] or create records with a [00:20:08] new select option that doesn't exist [00:20:10] and it's a longer script than I thought it [00:20:13] would be. [00:20:14] So just showing what we have [00:20:17] in place now which doesn't do anything [00:20:20] because I've disabled the create records [00:20:24] line I'm pulling in the single [00:20:28] select fields in question. [00:20:30] You can see all five [00:20:32] of the current options. [00:20:34] I didn't commit the adding [00:20:36] the seven so that's not there. [00:20:39] And then I have some dummy data [00:20:42] in here with some [00:20:44] new values I want to create [00:20:46] as I'm creating new records [00:20:49] so I know in progress [00:20:51] is already an option. [00:20:52] I'm going to just start giving these [00:20:57] Unique values that don't quite exist [00:21:01] in our base. So to talk through the [00:21:05] methodology of the script [00:21:07] to get to what we're showing here, [00:21:09] we're pulling in the table [00:21:11] in this case, Table one. [00:21:13] Then we're pulling in the [00:21:14] field. In this case it's called select. [00:21:17] And then I'm displaying what [00:21:19] the current configuration [00:21:21] of the select field is [00:21:23] and that's how I'm able to see [00:21:25] the existing options. [00:21:27] Then with that dummy data [00:21:28] that I just edited, I'm pulling in [00:21:30] what are the values [00:21:32] that I'm trying to pass [00:21:33] in this case for the field select [00:21:36] I'm trying to pass [00:21:37] a select option with the [00:21:39] name of 6, 7, and eight. [00:21:41] These are gonna be three separate records. [00:21:44] The process is going to be [00:21:46] very similar for multi select fields. [00:21:48] The only real difference is [00:21:52] how you edit the, [00:21:54] create record or create records [00:21:59] I call them payloads whether or not [00:22:04] the [00:22:05] select [00:22:07] bit right here if this were [00:22:09] a multi select field [00:22:10] this would be an array of [00:22:11] objects versus a singular object. [00:22:13] And that would be the only difference. [00:22:15] There's also no difference between [00:22:17] creating new records and updating [00:22:18] new records you could follow along for the [00:22:20] exact same use case if you wanted to [00:22:23] edit records that already exist like this [00:22:25] one. [00:22:26] So now that we have [00:22:28] the field and what [00:22:29] their current options are. [00:22:31] We have the records that we're trying to [00:22:34] add and some of them have in this case [00:22:36] all of them have [00:22:38] select options that don't exist. [00:22:42] I believe if I were to [00:22:44] a new comment this [00:22:46] we would get an error. [00:22:49] We do. So the error that you get [00:22:52] is can't create records [00:22:54] invalid cell value for [00:22:55] select so it can't find an existing [00:22:58] choice with the I. D. or name. [00:23:00] And there's [00:23:02] not much pointing you into the right [00:23:05] direction for how you would be able to [00:23:08] enable that. But if you were to look [00:23:11] at the Airtable scripting A P.I. [00:23:14] airtable.com/developers/scripting [00:23:18] and then go to the format [00:23:20] for either single select or multi select. [00:23:23] In this case it's the same [00:23:24] when you're writing options to edit [00:23:27] the field itself. Not the values of a [00:23:30] particular record but the configuration [00:23:33] of the field. You're allowed to pass new [00:23:36] select options. [00:23:38] So looking back at my script, [00:23:40] some things that I'm doing [00:23:42] but I'm not currently [00:23:43] displaying in that output [00:23:45] I was showing before. [00:23:47] I'm looking at what [00:23:49] my existing options are. [00:23:51] I'm just getting a list of names [00:23:53] when you pull in options by default, [00:23:57] it's gonna give you the color of each [00:24:00] select option. The unique id [00:24:02] of each select option in the name. [00:24:05] The color is not too useful for me [00:24:07] and the id is definitely [00:24:08] not useful because [00:24:09] each one would be unique and [00:24:12] there's no way to check if [00:24:16] new values I'm passing are there [00:24:17] with an I. D. [00:24:18] Because I don't know the I.D. Yet. [00:24:20] I want the name [00:24:21] and that's what I'm doing here. [00:24:23] Then what I want to do is [00:24:26] look at for all of the values I'm passing, [00:24:29] I could be updating [00:24:31] several fields at once. [00:24:32] I just want what I'm passing for the [00:24:35] select field. Again, I want the name. [00:24:38] Just a list of names, not objects. [00:24:40] And then I'm getting them as a set. [00:24:43] The reason why I want to set is in [00:24:45] javascript [00:24:47] arrays can have duplicates where [00:24:51] if I had two of these that said [00:24:54] 6, 6 would show up twice [00:24:56] with a set, it's very similar [00:24:59] to arrays and in a lot of [00:25:01] different ways except sets [00:25:03] will cut out duplicates. [00:25:05] Six would only have appeared [00:25:07] once. So just to demonstrate, [00:25:09] I will actually make that change [00:25:11] where both of [00:25:11] these are now six. [00:25:14] You know what I don't think I knew that [00:25:17] it's they're so useful I think [00:25:20] good old master calendar [00:25:22] when I was making [00:25:23] that I learned so much about [00:25:27] so many other not as [00:25:32] I guess beginner friendly [00:25:34] operations and object types in javascript. [00:25:38] So now I have a set, [00:25:40] I have a unique list of the names [00:25:43] of the values I'm trying [00:25:44] to pass and I have an array [00:25:47] of the options that currently [00:25:51] exist for that field. [00:25:53] What I want to do [00:25:56] and this is not going to be [00:25:57] the most efficient way to do that. [00:25:59] I just want everyone to know. [00:26:01] I want to talk through [00:26:02] the process of what one [00:26:03] could do to solve this problem. [00:26:08] I want to first check [00:26:11] if there are payload options [00:26:18] in the first place, if there's none, [00:26:21] then I don't wanna do [00:26:22] all of this checking. [00:26:23] I'm not passing anything. [00:26:24] It wouldn't matter [00:26:26] if there are [00:26:27] what I want to do. [00:26:29] I want to turn this back into an array. [00:26:31] So sets and arrays are very similar, [00:26:33] but they don't [00:26:36] they're not exactly the same. [00:26:39] And so certain operations [00:26:41] that you might do on an [00:26:42] array, like push to add something [00:26:45] to the end of an array. [00:26:47] It's actually add with [00:26:48] set, so the functions that you would [00:26:51] perform are similar [00:26:52] but slightly different. [00:26:53] I like to work with [00:26:54] two arrays or two sets. [00:26:56] So I'm turning this set back into [00:26:57] array [00:26:59] and to do that [00:27:02] do the old fashioned [00:27:05] new array and then I'm going to use [00:27:08] spread notation to [00:27:10] get my payload options back into an array. [00:27:15] Then again, not the most [00:27:17] efficient way to do it. In fact, [00:27:19] this is not the way I would recommend [00:27:21] to do it. But I want to talk through the [00:27:23] the sort of methodology [00:27:25] of what we're doing. [00:27:26] What I wanna do is loop through [00:27:28] each of those options [00:27:30] that I'm trying to pass [00:27:32] and see if they exist in [00:27:35] the current field options [00:27:37] if they exist, [00:27:38] I don't have to change anything. [00:27:39] If they don't exist, [00:27:41] then I'm going to have to [00:27:43] update that field before I try to [00:27:45] pass the payload so that those [00:27:47] values will be able to stick. [00:27:51] So [00:27:53] with my new array of options [00:27:55] that I'm trying to pass [00:27:58] good old for each [00:28:01] for each [00:28:03] option [00:28:07] check, [00:28:08] I'm gonna do [00:28:10] simple. [00:28:12] Does this value exist? Exists equals. [00:28:17] And I'm looking in [00:28:19] my existing options array [00:28:23] so I wanna do existing [00:28:27] options [00:28:30] includes [00:28:35] Yeah, [00:28:38] doesn't like that. Why not? [00:28:44] That should work. [00:28:46] I don't know why it doesn't like that. [00:28:48] Just [00:28:50] so either the current option exists [00:28:54] or it doesn't if it doesn't exist, [00:28:57] this will return false exist, [00:28:59] will equal false. If it does exist, [00:29:01] then that variable will equal true [00:29:04] if it doesn't exist. [00:29:08] I want to do if [00:29:11] not exist [00:29:13] sure which I could spell [00:29:16] if it doesn't exist, what I want to do, [00:29:21] I should set up [00:29:23] another array up here [00:29:25] so I'm gonna create a new array [00:29:28] called missing. [00:29:29] So any option that doesn't exist [00:29:31] currently that I'm trying to pass, [00:29:33] I want to make sure that I get, [00:29:34] I want to add those. [00:29:35] So if this option doesn't exist, [00:29:38] I'm gonna add it to [00:29:39] missing. So missing, [00:29:41] push [00:29:44] option. [00:29:47] So after you've looped through [00:29:50] each of the options that are [00:29:52] in the list, I'm trying to pass [00:29:56] if there's any that are missing, [00:29:59] I need to update the field. [00:30:01] Now each field in Airtable has different [00:30:05] requirements for how you edit the [00:30:10] options. But what you wanna do [00:30:14] is go to, [00:30:17] I already have a variable set up [00:30:20] for the field itself table.Getfield [00:30:24] so down here I want to say field [00:30:27] update [00:30:29] options, a sync. [00:30:35] And then [00:30:37] I'm looking at the A. P. I [00:30:40] just to double check [00:30:41] what I wanna do is get [00:30:44] the choices [00:30:48] and then I want to pass an array. [00:30:50] Now [00:30:51] I have options that are currently [00:30:55] in the field. [00:30:56] I believe I had five and I [00:30:59] want to pass new ones. [00:31:00] The default behavior [00:31:02] for when you're doing this is it's [00:31:04] going to take your array [00:31:06] and try and make those the set of options. [00:31:10] If you don't pass options [00:31:12] that already exist as part of your array. [00:31:15] Airtable is not going to like it. [00:31:17] There's actually a [00:31:18] separate setting that you [00:31:18] have to enable for this function [00:31:22] for it to actually [00:31:28] for instance if I tried to pass [00:31:30] an array here [00:31:31] that didn't include these five, [00:31:34] there's a separate setting [00:31:35] I have to enable that says, [00:31:36] hey, I didn't include [00:31:37] these five. Delete them as options, [00:31:39] that's in this case, [00:31:41] that's not what I want [00:31:42] to do. [00:31:46] So what I wanna do, [00:31:50] it's like I said, [00:31:51] I wanna pass the options [00:31:52] that I currently have [00:31:55] and that is [00:31:56] my existing options array [00:32:00] and then I want to pass [00:32:03] my [00:32:04] missing [00:32:06] array. [00:32:09] Also spread. [00:32:12] And one thing [00:32:13] that I will change really quickly [00:32:16] when I'm passing the option [00:32:19] into that array, [00:32:20] I'm going to pass it in the format [00:32:23] Airtable prefers name, [00:32:25] colon option as an object. [00:32:27] The reason I'm doing that [00:32:30] is because as I said previously [00:32:31] each of these select options has three [00:32:33] properties. Its I. D. [00:32:35] Its color and its name. [00:32:37] So I'm just specifying the name [00:32:38] is that option [00:32:41] now, I see a bug [00:32:44] that needs to be a wait [00:32:46] for a sync. You know [00:32:48] what I do existing options [00:32:51] is not the one that you want. [00:32:53] That's just the names. [00:32:55] You're right. [00:32:57] Okay. So I don't have a variable set up [00:33:01] for for that. But I could just [00:33:03] do this get the field get the options, [00:33:08] get the choices and then it should be [00:33:12] fine. Great catch. So [00:33:16] hopefully that works [00:33:19] real quick from the top, [00:33:21] we have a table, [00:33:22] we have a field. [00:33:23] That field is called [00:33:23] select I have set up to look at [00:33:26] what are the current options [00:33:29] in that field and [00:33:30] then I have a set of values [00:33:32] I'm trying to add [00:33:33] in this case by creating new [00:33:34] records. [00:33:37] I have two of the value 6. [00:33:38] 1 of the value eight. [00:33:40] I'm looking through what my current [00:33:43] options are [00:33:44] and if those options don't exist [00:33:45] I'm trying to add them as options [00:33:48] to the field before I update the table. [00:33:51] Hopefully this works. [00:33:55] I think I will [00:33:58] it did [00:34:00] and hopefully that was clear [00:34:02] so you'll see 6, 6 and eight, [00:34:04] but if I were to look [00:34:06] in my options I only have one value as six [00:34:09] just so you know if you don't pass a [00:34:11] color option [00:34:13] it will always default to gray. [00:34:16] And then an I. D. Will be generated [00:34:19] at the creation of the [00:34:22] select option [00:34:24] and hopefully that was clear. [00:34:27] Again this is not in production [00:34:30] I wouldn't have [00:34:31] written the script in exactly [00:34:33] this way but it is [00:34:35] for me at least the easiest way [00:34:37] to explain it as it's happening. [00:34:41] Yeah all that to say [00:34:43] you wonder if Airtable specifically [00:34:47] didn't make it easy to where [00:34:49] it just automatically populated [00:34:51] new fields because [00:34:53] I don't know maybe they were [00:34:55] trying to like protect you from [00:34:57] creating duplicates or misspelled options. [00:35:00] Maybe I don't know what the reasoning. [00:35:03] I don't know either. [00:35:04] It's the only it's one of the few [00:35:07] Naturally occurring [00:35:09] if you will [00:35:10] points of data validation and Airtable [00:35:13] where you can define a list of [00:35:15] selectable options [00:35:16] and then say you selected one [00:35:18] that doesn't exist, [00:35:20] we're not gonna allow you [00:35:22] to update your records. [00:35:23] But if you're using Airtable like normal, [00:35:27] if I go in here and say, [00:35:30] you know, 20, that option [00:35:31] doesn't exist [00:35:32] and it'll let me do it pretty simply. [00:35:34] So [00:35:36] why isn't there a simpler workaround [00:35:39] to create records a sync or update [00:35:43] records a sync? [00:35:44] It would be great if you could, [00:35:47] you know right now, [00:35:48] it only accepts one argument. [00:35:50] An array of potential updates [00:35:52] would be great if [00:35:53] there was additional arguments [00:35:56] you could pass [00:35:57] that would say enable creation of [00:35:59] missing [00:36:00] field. [00:36:01] field selects if you know, [00:36:03] if that's something that you wanted to do. [00:36:05] So you don't have to write, [00:36:07] you know, something [00:36:08] that is the equivalent of this [00:36:10] before it, especially if you have [00:36:13] more than one select field now, [00:36:17] you could, you know, you could loop this, [00:36:20] so the structure of this would be [00:36:23] the same for any type of select [00:36:25] or I should say [00:36:26] select or single select not [00:36:28] including collaborator fields [00:36:29] which are a different, [00:36:31] similar field type, [00:36:32] but this doesn't quite work with that. [00:36:35] But [00:36:36] yeah, if you had more than five, [00:36:39] it certainly would feel [00:36:40] even more arduous than [00:36:42] it feels now [00:36:44] and now here's the kicker. [00:36:47] This code will not work [00:36:49] in an automation scripting [00:36:51] step, you can't [00:36:55] I believe it's the editing [00:36:57] the options portion. [00:36:59] Yeah, everything else, [00:37:00] you know, you could put an error [00:37:04] handling so [00:37:06] I like to use try [00:37:07] and catch in in java script [00:37:09] so I could wrap this in a try [00:37:11] clause and then if it gets stopped [00:37:14] because of missing select option, [00:37:15] you know, doesn't exist, [00:37:17] you can have it do something else, [00:37:20] may be added to a [00:37:21] single line text field [00:37:23] and then do some data clean up later. [00:37:28] But that's certainly not ideal. [00:37:31] Yeah, it's frustrating. [00:37:33] I worked on a project [00:37:34] that had to overcome that in an [00:37:36] automation and it was just [00:37:37] we figured it out. [00:37:39] I know some people that just use [00:37:40] the rest api and that's in that use case [00:37:44] and that seems crazy that you have to [00:37:46] do that, but [00:37:49] yeah. So for the A M A [00:37:51] is it next week, [00:37:53] where what's the developers and [00:37:55] Yeah, maybe I'll maybe I'll pose [00:37:58] that as a question. [00:38:00] Yeah. Close the gap because [00:38:02] you could do it somewhere else, [00:38:04] you know, adding parody would make it [00:38:08] Yeah. Especially if the reasoning [00:38:11] was to like help you avoid issues. [00:38:13] It's like people are just going to [00:38:15] come up with these crazy [00:38:16] workarounds anyways, [00:38:17] so just make it easy to do [00:38:19] what everybody wants to do anyways. [00:38:21] Yeah, because you don't want to do this, [00:38:24] you don't want to do this, [00:38:25] this isn't this isn't [00:38:27] what you wanted to write, [00:38:29] but in a script, [00:38:30] it's not as bad what you did [00:38:32] in in an automation, [00:38:33] it's crazy what you have to do [00:38:35] to work around it. Yeah, yeah, [00:38:37] we'll do that, do that down the road. [00:38:39] I think we did. I think, [00:38:41] I think last season [00:38:42] we had a segment on that, [00:38:45] but cool, well thank you, Kamille [00:38:48] sharing that [00:38:49] everybody now knows to stay out [00:38:52] of scripting automation [00:38:54] or scripting with options. [00:38:56] So normally I'm the one like, [00:38:58] oh everyone should learn scripting, [00:39:00] it's so much fun, you gain so many skills [00:39:01] and then every now and again [00:39:03] we'll get one of these and I'm like, [00:39:06] yeah, yeah, [00:39:09] All right, let's move on. [00:39:11] So today this segment is App A Day. [00:39:14] We're gonna look at [00:39:15] Airtable's marketplace, [00:39:17] see what's going on there [00:39:19] and look at one of the apps [00:39:20] that's relatively new [00:39:23] and let's see it was added yeah, [00:39:26] the day before Christmas [00:39:28] 24th, so [00:39:31] that's right. [00:39:32] They actually pushed updates. [00:39:36] That would have been a Saturday, right? [00:39:40] Yeah, so somebody at Airtable [00:39:43] working on the holidays. [00:39:45] Very good. So send SmS easily. [00:39:47] So I saw this in the [00:39:49] marketplace and and I just wanted [00:39:51] to see what it looked like, [00:39:53] so I installed it. [00:39:56] and it actually, it easily sends SmS, [00:40:01] so it's kind of cool, [00:40:03] you can actually [00:40:05] you know to test it, [00:40:06] they allow you to send 10 text messages [00:40:09] before you have to purchase anything [00:40:13] and they don't make you [00:40:16] pick a phone number [00:40:18] that sends, it really just [00:40:21] happens, there's no api key involved. [00:40:24] You literally just have to pick your phone [00:40:27] number field. Now this was kind of [00:40:30] frustrating because [00:40:31] it actually has to be [00:40:33] a phone field, [00:40:35] it can't be a single line text [00:40:37] or a formula text or a field. [00:40:40] It literally has to be a phone [00:40:43] a phone number like this, [00:40:45] so that's the only [00:40:47] one that works. Like I have this [00:40:49] in a formula, [00:40:50] you can't pick a formula field. [00:40:52] So that's kind of frustrating [00:40:53] because you can't have phone numbers [00:40:55] and other [00:40:55] types of fields. [00:40:56] Well I'm wondering how it plays now [00:40:59] with sync tables because [00:41:00] sometimes sync fields don't come in [00:41:03] as their original field type and they'll [00:41:05] default to a long text field. Yeah. [00:41:09] Yeah I did not try that on the sync field. [00:41:13] So yeah you pick your phone number, [00:41:16] you pick where the text is so that the [00:41:18] text message actually has to be [00:41:22] in a field. [00:41:24] So I just have a quick send and [00:41:27] then [00:41:30] and then you can specify a [00:41:32] status field or something. [00:41:35] Quick status of where it [00:41:37] will output the response [00:41:40] and how this works [00:41:42] is this is going to send to [00:41:44] everything that's in here, [00:41:47] so you don't pick [00:41:48] like a single record of one [00:41:50] person to send to, [00:41:51] it's going to send a text to [00:41:53] everybody that's in the view [00:41:54] that you're on. [00:41:55] So if you only want to send to [00:41:57] like one person, [00:41:59] you have to create a new view [00:42:00] and filter to that person [00:42:02] or the people [00:42:03] that you want to send a text to. [00:42:05] And then you'll see this change [00:42:07] from send to sms to just send one. [00:42:09] So it's basically whatever [00:42:11] is visible in the view that you're on. [00:42:13] And um yeah, and then you just hit send [00:42:18] and it will instantly send. [00:42:20] So I sent to this one [00:42:22] that I have a google voice [00:42:24] too and [00:42:27] and I need to refresh. [00:42:37] interesting. [00:42:39] Is it that 1? Yeah. Yeah. [00:42:43] Hi, how is this working? [00:42:44] Okay. So and it actually looks like [00:42:47] it sends different [00:42:47] okay. Yeah, so this is the test one [00:42:50] that is coming from their test account [00:42:54] that I didn't create. So [00:42:56] that's it. [00:42:57] It very is easy send smS easily. [00:43:00] So if you have a very basic use case [00:43:05] And you want to test it out, [00:43:06] you can send 10 text messages [00:43:08] before you have to [00:43:09] purchase and you don't have to [00:43:12] log in or anything [00:43:13] to their website to be able to [00:43:15] test it out. So just pick the field. [00:43:19] So nice little app. [00:43:22] but I wanted to take things [00:43:24] up a notch but before I do that, [00:43:26] just a quick shout out to [00:43:28] join our community at BuiltOnAir. [00:43:30] Amazing people in our slack community [00:43:33] talking about Airtable and other things [00:43:36] we'd love to have you join. [00:43:38] So join us at builtonair.com/join [00:43:40] we have some exciting things [00:43:42] coming up this year. [00:43:44] So we'd love to have you join [00:43:45] with thousands of other Airtable [00:43:48] users and fans are goals to get to 2000 [00:43:53] members of the community this year. [00:43:55] So we'd love to have you join, [00:43:56] builtonair.com/join [00:43:59] so I wanted to take things up a notch. [00:44:02] I have a use case where I participate in [00:44:04] kind of a nonprofit church group [00:44:07] and very often I send, I need to send out [00:44:11] text messages to a larger audience [00:44:14] and I it's annoying when you get a text [00:44:18] message from a group and [00:44:20] somebody replies all, [00:44:22] you know, kind of an email, [00:44:24] the reply all feature [00:44:25] well in text messaging, [00:44:27] if you send out to a group, [00:44:30] there really isn't an option [00:44:32] to just reply once I know on my phone. [00:44:33] I I have android and I can make it [00:44:36] to where any replies, just go back to one. [00:44:40] Just come back to me, [00:44:41] but that's an all or nothing setting. [00:44:44] So that's across the board. [00:44:46] So in the past I would [00:44:47] send out a text message, [00:44:48] I would change that setting in my phone [00:44:52] and then send out a group text. [00:44:54] So then they would reply individually. [00:44:57] But then I'd go back and change [00:44:59] my settings because I do have other group [00:45:01] messages that I want to be, [00:45:04] you know, a typical group. [00:45:06] And so that's kind of [00:45:07] annoying that you have to go [00:45:09] into your settings [00:45:10] and change it across the board [00:45:11] and then come back. And so [00:45:12] I was thinking of a use case. [00:45:14] I actually looked for [00:45:16] a software solution that [00:45:17] that would do this [00:45:18] and there definitely are some out [00:45:20] there but most of them [00:45:21] require a monthly subscription [00:45:24] and I was like I don't want [00:45:26] I don't do it enough, [00:45:27] it's not for business use case. [00:45:29] And so I was like you know [00:45:31] I'd be willing to pay [00:45:32] kind of on a per whenever I [00:45:34] needed to to do this [00:45:36] type approach. And so when I found that [00:45:40] when I found that send sMS text [00:45:44] send sMS easily I realized that there's a [00:45:48] company behind it called Text Belt. [00:45:51] So that app in the marketplace is actually [00:45:54] from this company called text belt. [00:45:57] That's actually been around for 10 plus [00:45:59] years doing just very [00:46:01] basic text messaging, [00:46:03] very similar to Twilio. [00:46:05] If you've used Twilio, [00:46:07] I've used Twilio quite a bit. [00:46:09] This one actually is [00:46:10] simpler to use than Twilio. [00:46:12] And so literally in about 20 minutes [00:46:16] I implemented this use case of being [00:46:19] able to send out a group message [00:46:22] that sends to each user [00:46:24] individually and then [00:46:25] accepts the response, [00:46:27] any responses that they reply to [00:46:30] that text message gets [00:46:32] added right back into Airtable. [00:46:34] So just by sending this [00:46:36] I did have to purchase [00:46:37] an api key for $3 [00:46:39] you can get 50 text messages [00:46:42] So I you know and it's a one time fee [00:46:45] it's not a monthly and so you just fill [00:46:48] up whenever you run out [00:46:51] of your quota [00:46:52] and so that makes a nice you just by as [00:46:56] you need [00:46:57] there's discounts if you buy more. [00:46:59] But so what I did was you know I [00:47:01] have my contact list [00:47:03] with with users [00:47:05] and they've got their phone number [00:47:08] we're gonna have to troubleshoot [00:47:10] we've got time so Kamille I'm gonna need [00:47:12] your help. [00:47:13] Okay so they use, [00:47:15] it actually works to send [00:47:18] actually will come back to this [00:47:21] because this is this [00:47:22] is this was frustrating me. [00:47:24] So basically I have my users [00:47:25] they have their phone numbers [00:47:27] and then I want to create a [00:47:29] text message that I [00:47:30] send out just something simple [00:47:33] here everyone please respond respond asap [00:47:36] whatever your text message [00:47:37] is gonna be. [00:47:38] Then you pick the users that you want to [00:47:40] send it to. [00:47:42] And I could probably improve this [00:47:44] to make it send to all [00:47:46] or something but you [00:47:47] can just quickly add everybody [00:47:48] that you need to send that to [00:47:50] from your contact [00:47:51] list that pulls in their phone numbers [00:47:54] and then what I have is a button that [00:47:57] runs a script. [00:48:00] So if I look at the script [00:48:03] down here the syntex [00:48:05] script. [00:48:07] what it does is it basically [00:48:12] it basically gets the record. [00:48:15] So so this is kind of a shortcut. [00:48:18] You could run this and it will ask [00:48:20] you what record that you want to pick. [00:48:22] But you can also set a button [00:48:25] that basically auto fills [00:48:27] this input.record a [00:48:29] sync. And then it'll automatically [00:48:31] run when you click the button. [00:48:33] So it actually works either way. [00:48:35] So it's a kind of nice way to [00:48:38] to quickly run scripts [00:48:39] off of a single record [00:48:41] and pass that record into your [00:48:42] script. And then all I'm doing is [00:48:45] I'm I'm getting the message [00:48:47] from that record [00:48:48] what the message is [00:48:49] and then I'm getting all of the phones. [00:48:52] So this returns an [00:48:53] array of the phones [00:48:55] that come from my contact list [00:48:58] and then I'm simply looping [00:48:59] through each of the phones [00:49:02] and calling this send and this send [00:49:05] does a remote fetch a sync [00:49:08] to that text belt to their A. P.I. [00:49:11] And [00:49:13] it passes [00:49:15] a the message to the phone number. [00:49:18] So it does send one message per phone. [00:49:21] So I'm kind of faking the group message. [00:49:23] You're really just looping through each [00:49:25] user and sending one message [00:49:27] to their phone. [00:49:29] So that's how you avoid the reply [00:49:31] all because you're really just sending [00:49:34] one text at a time which I've had to done [00:49:37] manually and you're copying [00:49:39] and pasting to each person. [00:49:40] So this definitely is [00:49:42] easier. [00:49:42] But the trick here is you're you're [00:49:45] replying [00:49:45] you're giving it a web hook U.R. L. [00:49:48] And that basically is just telling [00:49:51] this text service that if they [00:49:54] respond to that email [00:49:56] or that text then notify me [00:49:59] at this U.R. L. That they responded. [00:50:02] And so Airtable which I'll show next [00:50:04] has automations that can be triggered [00:50:07] off of a web hook U. R. L. [00:50:09] So you use Airtable [00:50:11] as essentially you're receiving [00:50:13] server for any replies that come. [00:50:16] The other thing you have to do is you have [00:50:19] to specify this kind of code [00:50:21] that you create when you [00:50:23] when you buy your api key. [00:50:26] And you have to always include this. [00:50:28] This is kind of how they know that it's [00:50:30] a valid message. [00:50:31] It's kind of a way to validate. [00:50:34] And so you're not also not [00:50:36] spamming, you're supposed to specify [00:50:38] you know what entity the message is coming [00:50:40] from. So I set it up [00:50:42] where it has to have BuiltOnAir [00:50:45] somewhere in the message. [00:50:46] So I add that to any message [00:50:48] that's going out so [00:50:50] that their service knows it's [00:50:51] it's coming from the right one [00:50:53] based off of the api key [00:50:55] and that's it. [00:50:56] So you're basically just sending it [00:50:58] and then you're you're [00:50:59] passing along this [00:51:00] this response to U. R. L. [00:51:01] Of where you're going to get [00:51:03] responses from. [00:51:04] So if I'm were to run this [00:51:09] I'm gonna this is gonna send to two people [00:51:11] one to that google voice. [00:51:12] And then the second one goes to my [00:51:16] my actual cell phone. So I will get a text [00:51:19] message I just received on my phone [00:51:22] and if I check my hear [00:51:24] this I got a new one. [00:51:26] I these are my tests from before. [00:51:28] Hey everyone please respond now [00:51:31] and I'm gonna say Dan and [00:51:34] hello. So I'm gonna respond here [00:51:37] but before I do that [00:51:40] and hit submit let's look [00:51:42] at our automation. [00:51:44] So on the receiving side [00:51:47] we set up an automation and [00:51:50] we set it up to say [00:51:52] when a web hook is received. [00:51:54] And so Airtable actually gives [00:51:57] you the web hook U. R. L. [00:51:59] So you simply hit copy here [00:52:01] and I already did this [00:52:03] beforehand but you [00:52:04] would copy this U. R. L. [00:52:07] And that's what I had in my script [00:52:09] to send each time I send a message. [00:52:12] So I'm saying whenever somebody responds [00:52:15] they're gonna hit this automation. [00:52:17] And I did a test here and it'll [00:52:20] tell you once you [00:52:22] once you do a test you hit [00:52:23] this button and then it will receive that. [00:52:26] And then this is what the response [00:52:28] from that text service looks like [00:52:30] it has a unique I. D. For that response. [00:52:33] It tells you who the number [00:52:36] came from the reply [00:52:38] and what their reply was. [00:52:40] And then all I'm doing for now [00:52:43] is I'm just creating a record in my [00:52:48] right here for any responses. [00:52:51] And so ideally I would tie those [00:52:54] one thing I didn't like is [00:52:56] there was no unique [00:52:58] id identifier of [00:53:00] of where it came from, [00:53:02] of which message it came from. [00:53:05] I think in the future I might be [00:53:07] able to pass [00:53:08] as part of the web hook like a [00:53:10] U. R. L. Parameter that I could maybe [00:53:12] pull in so I knew what message they were [00:53:15] responding to. [00:53:16] So that is to be continued feature [00:53:21] but basically like [00:53:24] let's run it. So if I said [00:53:28] I should [00:53:30] that in a second here [00:53:32] the automation will run [00:53:34] and there it is, got our [00:53:36] response back [00:53:37] and I know it came from this number [00:53:40] which is my google voice [00:53:41] number. And so my automation ran [00:53:44] and performed the update [00:53:46] to create the record. [00:53:48] Now what I was trying to do [00:53:50] and where we could troubleshoot [00:53:51] for some bonus time [00:53:52] we've got some time. [00:53:54] So the response that we get from [00:53:57] the text service [00:53:58] gives us a phone number in [00:54:01] this format. [00:54:02] So it's more kind of standard. [00:54:04] It also adds the country code. [00:54:06] And by the way this [00:54:08] this text service only works in the U. S. [00:54:10] So if your international [00:54:12] this this won't work. [00:54:15] but it but it gives it in this format [00:54:18] well in our contacts because I was using [00:54:21] the app [00:54:21] I needed it to be a phone number [00:54:24] and so it formats it like this [00:54:28] and so I wanted to convert from [00:54:30] this format into this format [00:54:33] and you know what's [00:54:34] amazing is that this formula [00:54:36] actually worked on this [00:54:38] phone number but not on [00:54:39] this one. Which is very strange. [00:54:42] So what is going on [00:54:44] if we can troubleshoot this. [00:54:46] So what I was basically doing [00:54:49] was a rejex replace [00:54:50] and I was taking out a space [00:54:54] a dash and the parentheses [00:54:57] to basically remove everything. [00:55:00] And then I also add [00:55:01] this plus one in front of [00:55:02] it. And so at first [00:55:04] I did it without this right [00:55:08] and what was weird, [00:55:10] so if I do this this [00:55:12] is what I would expect it [00:55:13] to be that looks like it's right, [00:55:15] right. [00:55:16] But somehow [00:55:18] the automations that run, [00:55:21] so if I take this [00:55:22] and I go to my responses, [00:55:24] the value that I'm getting [00:55:27] does not match [00:55:29] this number even though [00:55:32] everything looks like it is. [00:55:34] So somehow there's like [00:55:36] this weird character and unseen bite [00:55:40] that's being inserted when I convert from [00:55:45] here to there because [00:55:47] if I take out that then it finds it. [00:55:50] So it doesn't like the plus one [00:55:52] and it's really [00:55:54] it actually doesn't like the the [00:55:56] plus whatever is in between [00:55:58] the one and the three [00:56:00] that somehow I'm not stripping out [00:56:02] somehow, [00:56:03] there's some funky character at the [00:56:05] beginning of this that get [00:56:08] removed when I do this rejex. [00:56:12] Can you do a trim if [00:56:14] you wrap rejexs replace and trim, [00:56:17] does that [00:56:18] Do it? The phone or after the [00:56:21] rejex? [00:56:22] Outside of the rejex but before plus one. [00:56:26] Yeah I did that [00:56:27] and it didn't make a difference. But [00:56:30] I'll [00:56:31] try it inside the phone [00:56:34] maybe be there. I didn't try that [00:56:38] like that. [00:56:40] I [00:56:44] need to get the exact [00:56:48] okay [00:56:50] could you [00:56:52] now [00:56:53] we all love rejex [00:56:54] could we not use rejex [00:56:57] and instead value phone? [00:57:01] Would that mess it up? [00:57:05] That's a value converts it to a number. [00:57:10] Sometimes reliable. [00:57:17] hey look at that. [00:57:19] So now I don't know [00:57:21] if we've technically [00:57:23] solved the issue by using a [00:57:24] different function. [00:57:26] Rejex should work. I don't know [00:57:29] is it you are removing a space right? [00:57:34] A regular space? There is [00:57:38] there is a rejex [00:57:42] I don't actually yeah there's a [00:57:44] there's a white space thing that's not [00:57:47] necessarily the space you get [00:57:49] when you press the space bar [00:57:52] and then there's [00:57:53] there's non digit characters [00:57:56] is another one. [00:57:58] So if you just replace all non [00:58:00] digit characters to nothing, [00:58:03] maybe that would work [00:58:04] because it should also do all [00:58:06] variations of white space [00:58:08] because it's not a digit. [00:58:12] I don't remember [00:58:13] what those wild cards are. [00:58:15] I like value that works. No rejex. [00:58:20] So what I could do now is [00:58:22] now that I have the the [00:58:25] contacts in this on my on my [00:58:27] automation, I could do a look up [00:58:32] and add find records, move this up and [00:58:39] select my contacts and then [00:58:41] find it based off of the condition [00:58:45] where standard [00:58:46] phone is [00:58:50] dynamic [00:58:52] and then equal to the from number. [00:58:55] Let's try that, see if that works. [00:58:58] Okay. That worked was not working before. [00:59:02] Which is crazy. So now [00:59:04] and then now I could, [00:59:05] now that I have the contact, [00:59:07] I could automatically link it [00:59:09] to the response. [00:59:10] So you could automatically link [00:59:11] your responses to your contact table. [00:59:15] So that would be the next step [00:59:17] that I would add. [00:59:19] So you could build a full blown [00:59:20] text messaging solution [00:59:22] where you can send out [00:59:24] to a big group and then manage [00:59:25] replies individually [00:59:28] which I think I'm going to use [00:59:30] in my use case [00:59:30] which is very helpful. [00:59:34] Is a cool way to use [00:59:36] and not too expensive. [00:59:38] Just purchase this where's the [00:59:41] person? [00:59:44] There you go. [00:59:45] So $5 for 200 texts [00:59:47] gets definitely cheaper as you go. [00:59:49] Probably should have done the $5.00 one. [00:59:53] Okay. [00:59:54] Alright. And that concludes today's show, [00:59:58] did you have any final comments [01:00:01] Kamille? [01:00:02] I just think of, [01:00:04] I very rarely need to [01:00:05] implement something similar. [01:00:07] And the last time I needed to [01:00:10] send a text to someone, I cheesed it by [01:00:15] emailing their phone number [01:00:18] which [01:00:20] every cell phone carrier is [01:00:22] has a different format [01:00:24] of exactly how you pass [01:00:26] the phone number. [01:00:28] It's some variation of the phone [01:00:31] number at and then like t [01:00:33] mobile dash something dot com or whatever. [01:00:36] And then that will come into your [01:00:38] phone as a text. [01:00:39] A very strange looking text [01:00:41] but it'll get there. [01:00:42] That's not ideal. So don't do that. [01:00:45] You could don't do it. [01:00:47] Yeah. Yeah, I've seen that. [01:00:49] I've seen that before. [01:00:51] Great, well thank you all for [01:00:53] coming and we will see you [01:00:55] next time on the BuiltOnAir podcast. [01:00:57] Have a good week.