 All right. Well, good morning, good afternoon, or good evening wherever in the world you're joining us from today. My name is Jennifer. I'm a product marketing manager that works with AppSheet. And today I'm joined by two very special guests to discuss a very important topic on working with AppSheet and Google Sheets. Christian, would you like to introduce yourself really quickly? Sure. Thank you. So my name is Christian Schalk. I'm a Google Developer Advocate. I work primarily with Workspace and Cloud, but more recently I've been spending a lot of time with AppSheet and helping to integrate it better with our Cloud and Workspace products. Excellent. And then we also have Charles with us today. Charles, would you like to provide a quick introduction? Hi, everybody. Sure. So hello, I'm Charles. I am a Developer Advocate also on Chris's team, and I've been focusing on Google Workspace as a solutions platform for many years. And I am a huge spreadsheet fan. And so I joined the call today to debunk some of the cool things that spreadsheets can do to make them way more usable with AppSheet. Awesome. Well, thank you both so much for being here. And with that, we'll go ahead and get started. Next slide, please, Christian. Yep. All right. So just a quick note of context. Some of you may be wondering why we have a webinar to talk about Google Sheets and AppSheet. So to help with that, just a couple of things to call out. AppSheet is what's called a data-driven no-code platform. What that means is your data is used to build applications. The cleaner your data is, the more successful you will be in your application development process. And tabular data, which Christian and Charles will talk about in a moment, is really key for that. Sheets just happens to be a natural fit. It also happens to be within our Google family. So we want to really highlight and emphasize how you can find success in your data structure to create really beautiful applications as you move forward. Cool. Thanks so much, Jen. I'll go ahead and continue on here and we'll dive into kind of like the core of our topics here. What we're really discussing today is like how to take a Google Sheet and essentially transition it over to being very easy to work with and essentially ingest it into AppSheet with a minimal amount of friction. So in this sense, you want to think about how to prepare your Google Sheet in certain terms. Like, for example, AppSheet is looking for kind of your very basic table structure in a Google Sheet. So you're going to have columns and have simple names. You're not going to have strange characters all over the place. That's definitely not a good pattern. You want to essentially avoid lots of numeric columns, also repeating columns and having like data that's not necessarily set up in your most optimal fashion. So Charles is going to go through and actually walk through all of these steps of how to kind of clean up your data in a sheet and make it essentially into a more of like a relational data setup. Now, a few points on column naming and data types. So AppSheet is intelligent in the sense that it has these pre-designated data types that are intelligent in the sense that it has a data type for email, image, address, photo and such. And what it does when it takes the actual sheet data, it's able to correctly decide what's the most best fit for the data type for the actual data that you have in your sheet. So if it sees photos, it will say, okay, that's an image. If it sees email, so I'm going to sign that as an email. And this actually dictates the behavior of the generated app for you. So that means you don't have to actually hand code or hand set up a lot of these things. It just comes out of the box for free and the app just does what you would expect it to be. So just keep that in mind as you're having your data in your sheet, you might want to make some of your column names to be a little bit more descriptive. So that way those hints can be picked up by AppSheet. Now, keys is also an interesting topic as well. So right out of the box, AppSheet is going to give you or it's going to predict essentially what kind of a unique underline like unique identifier for each record, because that's essentially typical databases have this concept of a primary key, meaning like a key that essentially allows you to identify individual records. So AppSheet has the same thing. But in the sheets world, you don't necessarily have that. You're going to have a lot of different rows that have different values and you can have rows that have the exact same values. So this is where AppSheet has to decide how do I define what is a key to use in the data such they don't have like record collisions and such. So the way that AppSheet works is that it will automatically choose the left most column, providing that each value in the rows are unique. And we'll say, okay, this looks like a valid key. I'm going to go ahead and designate this column as a key. Sometimes it doesn't have like the most unique values. It will take a combination of the left two columns, meaning like task and description could be an example where it says, you know, that way you have a higher degree of uniqueness, I guess, within the data. And then also, you can specify specifically which column you want to use as your key. And you can then even ensure that it has a unique value whenever new values are created by setting its initial value to the function unique ID. Again, this is getting a little bit into the weeds, but the main concept to just remind yourself is that sheets and in general spreadsheets, they don't have the same rules as like a typical database. And so this is the kind of a transition into AppSheet where it's treating the data more like a traditional SQL database or, you know, essentially a database table in that sense. All right, so I'm going to hand it over to Charles and he's going to start off like a fairly busy spreadsheet that has a lot of data. It's got a lot of formulas, a lot of like formatting, things are going. And he's going to walk you through how you would actually start to transition that sheet into something that is then very easy to be pulled into AppSheet and generating an app with minimal effort. Okay, so take it away, Charles. Sure. And actually, before we dig in, let's set up the application. Next slide, Chris, by the way. Okay. Let's set up the application a little bit of what we want to do. So we're going to take the very traditional use case that spreadsheets often get sequestered to do, for lack of a better word, and that's actually project management. In fact, if you ask everybody what is their favorite project management tool, unfortunately, they may tell you it's a spreadsheet that we've seen. Everybody do that and I'm sure you've probably done that yourself as well. I know Chris and I have had these spreadsheets to run things in our business. And so within the application, we're going to keep a real simple look at a task tracking application or a project management scenario where we have many tasks that belong to a number of projects and those projects obviously have project managers as well, too. So no, those can be real simple. We could have many project managers and having many, many, but we're going to have a real simple example that we show here. So with that, let me flip over and show you my spreadsheet. I'm going to share my screen for a second and we will start creating this thing. So I'm going to pull this away and over here, just give me one second and hopefully now you'll see my spreadsheet. Beautiful we do. Okay, awesome. So this is kind of the before version. I need to test manager before and you've seen this type of spreadsheet. Undoubtedly, you probably work with folks in your organization who have said, hey, fill this out and let me know what you're working on and let's work together and let's make priority out of this. It's going to be super hard, right? It could be, you know, a lot of data that's just kind of floating together and it doesn't always transpire correctly into AppSheet when you want to build a app immediately. So let's take a little look what I mean by some of those things here. I'm going to zoom out to just to give you an idea of what's going on. And the first thing you'll start to recognize here is this spreadsheet has data everywhere, right? There's data in a big block, there's data missing in columns, there's data shoved way out on the window here, sometimes in the multiple tabs, sometimes it's even in multiple sheets that people expect you to work and open and combine and do those things together. And what we want to do and what's really clear here of what Chris and Jen mentioned is if we can clean this spreadsheet up and structure it in a way that when it's actually pulled into AppSheet, your application will run a lot smoother right out of the box. There'll be less work for you to do and therefore you can hit the ground running way faster in AppSheet. And so you convert this beast a lot easier by making it work better. So let's take a look at some of the things that I like to do to get started here. The very first thing I want to do is really understand my data. And as I mentioned in our test manager application here, we've got a couple of main things we're working with. We've got entities that are tasks, we have entities that are projects, and we have entities that are project managers. And logically that would tell you that if I'm going to normalize this data, I'm going to have a table, in this case a spreadsheet, if I actually normalize it here inside of Sheets, that matches each one of these different entities and these type of fields. And you'll notice, and again, if you're familiar with normalization and making data fit better, the whole goal is we don't want to have redundant data for a more optimized database. We don't want to have redundant data and data repeating for maintaining it and updating. So say, for example, if I have an email address for a manager that works on a project and I had it listed multiple times, not only is that more space, but say, for example, somebody changes their email address, I have to then fix that in 100 different places if that person is associated with the project. So the data gets a little bit sloppy. And so not the best experience for the data, not the best experience of trying to dig through it. So what we're going to do is we're going to normalize this real quickly and make it work. One thing I love to do real quickly is just figure out what is the current data I'm working with and understand it better. So what I do a lot is I come down here and I say, with the command and the shift and the arrows, I actually see what is the block of data that I'm working on. In this case, you can see this is the data that I need to do something with. That data on the outside is an outlier. So I'm going to want to get rid of that. So we'll take care of that in a second. But let me zoom back in for a second and also show you a few other things that kind of really go against the rules that Chris mentioned when he was talking through some optimization techniques. The very first thing is you want to give the sheets that you're bringing in really nice concise names. If you load us down here, I have a kind of long name of my sheet, all project tasks forever since May 2020. A super long name that again, if I pulled it in, it won't look great in the UI. It's not very explanatory. And it's not really useful in the context of working with an app sheet app. You'll also notice up here, I've got my column names. And again, some of the rules were pretty good. We've got tasks, we've got status, we've got due dates, and those can all be inferred. But we've got one here where someone's trying to actually tell the user what to do while also mentioning the field type. So in this case, priority don't use one, two, or three scale, use the critical high, medium, and low scale. So we're going to want to clean that up as well too. And again, we've got some other note over here. Here's a field that doesn't make any sense. It's partly filled out. It's note data. Kind of looks like it's a junk column. And again, you've kind of seen things floating around a spreadsheet that don't make sense. Here's a great example of that as well too. So let's clean some of this up. I'm actually fast forward to a second to a spreadsheet that's a little bit more completed just to save some time. And you'll notice a couple of things I did. The first thing that we've done here is we've cleaned up that task name. So now you can see it's just tasks for the sheet name. And then we've added two new tabs for each entity, one called projects and one called managers. And again, we don't have the data filled out in there yet. We'll get that in a second. But the neat thing is you can see it's starting to look like our data model of the three tables we want to build, tasks, projects, and managers. Okay. So now the next thing I want to do is a couple of things I just like to do because I'm in sheets is make this a little more usable. So I do things like you just grab the thumbnail here and make it so I can freeze the pane so I can scroll it. I'm going to format that just so again, it looks a little better. And I can maybe see that this is my data and my titles. Now one thing to note, the formats that you do inside of sheets are not going to translate inside app sheet. So I can format these and do things like that. These are visual keys I'm doing here, but you really don't need to do that there because again, you'll do your formatting and your UI elements on the app sheet side. This is just more for me in this case just so I can see what I'm working with. Okay. So now the next thing I want to do is I'm going to want to come in and I'm going to want to clean up the names here. So again, I'm going to jump out this don't use the 1, 2, 3, 4 scale. That's fine and make all my column names way much easier to work with. Then I'm going to zoom out again just to show all the other data again and talk about what we want to keep and what we want to remove. So again, we don't want this information here. The reason it was here, by the way, you probably recognize this. If you've ever seen how folks can use spreadsheets where they're trying to use it like a database and we all know people try to, but they shouldn't, you'll notice that they're using this little table off to the side as lookups for the email address. So you can see here I've got the manager name and they're using this case, the match and the index function and they turn it into a hyperlink. Some folks use the lookups or hlookups. We don't want this data here because we're going to actually use it to look it up from the manager's table. Also notice just like formats, all the formulas that are inside a sheet are not going to be persisted when we go into the app sheet application. This data would simply be flattened and it will not be a formula. Also sometimes for certain formulas, like array formulas, for examples, they won't even be brought into an app sheet. Actually, you want to make sure that you turn all of your formulas into values. I'll show you quickly to do that in a second, but you want to make sure you do that so you don't try to push any formulas that won't get understood by the app sheet conversion process. One thing we want to do is we know we can do here is just get rid of this column. So we'll just delete that whole column out and I won't delete the manager field out yet because note that the manager field is being used to relate to the projects. Again, those keys and the lookups and those relationships are being made. So what we'll do in this case is we're going to take that little lookup table though and just copy it out. And then while I'm here, I'll just delete the rest of them out and then we're going to go to the manager's page and just push that into a brand new table. And notice one thing I always do just to make sure there's no formulas is what I paste. I paste special and I paste values only, which gets rid of all those formulas for me. So there we go. Now we've actually created the table of managers. Again, it's normalized. So it just has the manager information that we had available. We're going to do the same thing in a second for projects. So we'll bring the project names and then we'll bring in the relationship so we can see who the project manager is that it belongs to. But how are we going to do that? Let's take a look back at our data for a second. So let me zoom back out and just go up to the top here and make this a little bigger and look at the data we're working with now. Now the big difference is we still have our task status due date priority and project. But again, we don't want the manager field here and we don't want the notes field here. But before we get to that, we also need to capture again all the projects that are being worked on and we need to get a unique version of this list. So one of the neat newer features introduced into sheets will allow us to quickly come in here and say data, remove duplicates, and then will allow us to quickly get a unique list. You can see here, it found that they've got a bunch of duplicates, cut them out, and then bring that information back as just a unique list. Now one of the problems though is we've just now removed the key project information from all these tasks. So now we won't know what tasks belong to what projects. So that is a neat feature, but it's not going to work for this instance. So what we need to do is actually come up with a better way of pulling it out. And so I'm going to show you a really, really, really cool feature which I always say is your first homework assignment, if you've never seen this before, is to go play with this the next time you're in sheets. And it's something called the explore feature. So if I can have you vision and journey down with me to the very bottom right hand corner of sheets, you'll see the explore button kind of hovers over it and it turns green. And when I open it up, this will allow me to do some amazing stuff to this data by using machine learning and automatically inferring some key things about this data. This is a super cool feature. If you're simply looking to do things like format or create pivot tables or look up information inside your data, it works super well for doing those other features as well too. But where I think it really shines is when you can come in and you can actually ask it questions that are just logical about your data and even ask it in natural language. And this explore function will know how to respond, even though you don't even have to train it on your data. It kind of just learns about your data. And again, just like AppSheet will do when we pull it into AppSheet, it's using some key syntax, some logical data constructs to understand it. So again, those great task names up top will make it easier for the explore feature to understand what this data is. So say for example... Charles, a quick question for you though. So just so the audience is aware, we have not done anything with AppSheet yet, correct? We are still in sheets. We're not talking to AppSheet. We haven't connected this specific sheet to AppSheet yet, correct? Correct. Perfect. Right. And remember, our goal is to simply make this data as pure and clean and as friendly as possible. So when we do pull it to AppSheet, AppSheet looks at it and goes, I know exactly what to do to this. Okay. So in my explore feature, I can ask it these very natural language questions. So say for example, I want to ask it, how many of these tasks are actually completed? So I can just ask it, how many? And notice, I have not trained this at all. How many tasks are completed? And notice, it can come back and already answer that for me. And again, I haven't told it where to look. I haven't told it what to look at. But again, by knowing there's a task column and there's a status column, it was able to infer that and look it up and notice how it returns the comment or the number there, three. In fact, it even creates the kind of complex formula for me to show me how I could build that myself. But now, just quickly knowing my data like I do, only knowing three tasks were complete, I recognize that something's a little weird in my data. And I can visualize here that some people put completed and some people put complete. And this is a challenge with spreadsheets, right? Spreadsheets are great for collecting data, but they're not really good for making sure people put the right data in the right places. And so, this is a great example of why this spreadsheet is way better inside of AppSheet. So now you can see when I said how many tasks are complete, it gives me back the answer five. So I know before I actually go into AppSheet, I want to fix and clean up this data. And I'll show you how we can do that in a second. Let me show you a couple of other cool things you can do with this explore feature again, which is super powerful, what I want to clean my data up. So say for example, I want to check out the due dates of some of these things. Maybe I don't want to bring old tasks over with me. Maybe there's tasks maybe like last year aren't important because they're old and they're already done. Notice when I start to type due date, it recognizes again, because of that beautiful column name, it recognizes this as a data type. And I can just say due date, let's say before this year, one slash one slash two oh two one. And notice it'll go back and automatically show me, here's all the tasks. And I can even get again, get that formula of all the tasks that are done before, making it really easy for me to identify what's happened and cut through that data. So again, explore tool is super amazing to learn what your data is doing without having to train anything or create any functions or formulas. Great tool. Do please play with it. But the real reason I came here, if you remember, was I wanted to get a unique list of projects. That was the goal. So how do we do that? Again, since we have a great column name, and we say all the different projects, if you spell it right, it helps. Again, I've got the projects here. Like you say, just simply I want a unique list. Again, in terms of what I'm talking about, I say unique. And notice how it's gone out and quickly shown me, here's all the unique projects that I have. And again, it's giving me the formula, which I guess take that formula if I want, copy it. And then we'll go over to the project table and just paste those in. So that was the fastest way of doing it. Again, I explained a lot there, but a fast way to do it. If I came in and simply ran that and then said paste the values only, and now you'll have it. Oh, and again, I didn't say paste values only. Apparently, I must have hit the wrong things. Notice there's a value in there. And again, if you ever want to take the entire spreadsheet, for example, and just make sure all, all of your data is coming in as real data, when you bring it into AppSheet, I can say copy. And then I can just say paste special and paste special as values. And again, all those formulas are in fact gone. And you don't have to worry about any of that getting lost in translation. Okay, but back on task here for a second. Notice I still need to go out though and get all the keys for all the projects. Let's just say project manager, by the way. So the project manager unique key in here. And again, the project manager, we've already determined we have email addresses and names. Now, this is a great use case or a great example of how keys may or may not get inferred. Now, if you think about talking about project managers or even people in your organization, remember, Chris mentioned the value of a unique key. Now, your organization may have, you know, two Alicia Williams, or you may have two Eric Calitas. And so how do you do unique keys? Best way to do that is through email. As Chris mentioned, though, a lot of times when we think of people or a project manager, normally you think, oh, the name of the person, you don't talk to somebody by their alias, although maybe once in a while you do. That's the most part you call them by their name. To do this, you can obviously set this up later if you had an order where you had named first and then email. But again, to make it super easy and super valuable for AppSheet to pick it up on the unique field, if you just plot that unique field in the first column, this is a great way of making sure that you don't have to go back and either correct anything in AppSheet or actually have some of these columns brought together as a calculated column, which again would make it, you know, harder when you don't need to when the email obviously is your unique field. So a great use case right there. Anyway, so I want to now figure out who are the project managers for each one of these projects. So again, we had all that in our de-normalized table. And so again, I'd have to come down here and figure out what manager belongs to what project. So again, in some data, you may even have use cases where you have multiple project managers working on the same project or vice versa, multiple project managers with multiple projects. But in this case, what I need to do is figure out, how do I build a lookup table to do this, right? And again, you've seen each lookups and V lookups and all these fancy ways of doing it. But again, we're going to go back and use a really neat function that allows you to build out a formula to look up who these people are. And again, the explore button could do some of this for you, but I'm just going to show you how we could do it here by using one of my absolute favorite formulas inside of Sheets. And it's called the query function. The query function allows you to do exactly what it sounds like. You can come in and say equals query. And what it will do is it will run using the Google Digitalization API, a natural query language query of any data sitting inside of your spreadsheet. So in this case, what we're going to do is we're going to say I want to go look up all the project managers and the projects. So I'm just going to take that range. And again, remember we had the project range. We also have this weird range in the middle. We're going to ignore it now. We'll just click on it and include it. So I can add one big block of data. But then we're also going to have the project manager. So when I enter that, notice the query function did exactly what we told it to. It went out and it queried and pulled back all the data for all those three columns. Now, that's super neat and super easy. But notice I also don't need the project name anymore. I just need the project manager name. And also notice I want to clean up these headers here. So I'm just going to finish this formula. Do it. First thing I'm going to do is I'm going to make the headers work. You'll notice here you can see the help showing me how to do that by simply putting in a one or putting a zero in to make the headers work. And you'll see how that cleans that up. But notice we still have this kind of weird column that we haven't gotten rid of yet. So I want to actually just ignore that column for now. And the way you can do that with this really brilliant query function is simply by putting a select statement, a SQL statement inside of this function. And again, if you've never written SQL by yourself, it's pretty straightforward. The help function here, if you hit learn more, if you go to help, it'll show you all the great examples. But for the most part, it's pretty straightforward to do in most use cases, where I can do things like say select. And in this case, I want everything from column E and column G. So it closed that quote there. And when I say select E and G, notice it goes out and it ignores that middle weird column. And now I just have all the projects and all the managers. So again, in this use case, we already know the project managers. I'm sorry, the projects. So I don't even need that column anymore. So I'm simply going to come in here and say, you know what, we don't need even the project name anymore. So delete that out. And notice now we have all the managers in place, which is super neat. Just to give you a cool example here, if I was actually to re-include that, put that E back in, I can even do things like conditionally have like a where statement or sort it by a certain thing. So in this case, I can say where. So for example, I wanted to find out where every time I was actually one of the project managers, I can just put again a nice SQL statement in there. So I select E and G where it's my project. And I think I spelt something wrong. I have actually simply the column G equals. And now in this case, you can see, we'll come back and bring back all the projects I worked on, which happens to be just one in this case. But again, just a really neat, powerful function to get things done. But let's finish up here by cleaning this up. We don't really need to do the SQL statement. We just need to bring the back column G. Again, there's all of our project managers. But again, we need it unique. And if we remember when we used that feature before using the explore function and IQ UV, you do have to spell it right. We can simply put another formula around the query function unique, which will pull back all those unique records in order as they correspond to our projects. And we've built it. So again, pretty fast. Once you know what you're doing with the query function, pretty powerful. Let's just put it in the right place by doing a paste special values once again. And then we'll get rid of our little workspace over there where we figured out. So that's how fast you could actually go through and mine some of your data out. Let's do one final thing and clean up the sheet so we can pass it over to Chris so we can pull it in. Now that we've got our project table done, let's fix up some of the data that's not consistent or regular. And I'll show you what that means. So first of all, we've already added the manager in. So we don't need that manager information anymore. And we don't need this crazy notes column anymore. So let's just delete that out. And now we have just the project name, which will help us figure out who the manager is with the different keys. We had some anomalies on our data. Remember, for example, we had status and then we had with complete and completed. Also note that we've got some data in the column C, which looks a little weird. It looks like we've got some of the normal data. So there's a great new tool as well, which I can just come up here and say under data and scroll down a little to clean up suggestions. Clean up suggestions will quickly come out. Again, much like explore works, it'll automatically look at my data and infer my data and look for patterns of my data and even find anomalies like it has here. So for example, if you hover over column C, notice that it's gone out and recognize you've got some dates in due date. You've got some strings in due date. It looks like you have somebody here with a sense of humor putting in not even anything. And also somebody thinking that time is not as valuable as money. So they put it in as a number format. So what you can do is not just recognize these, but notice when I hover over this cleanup suggestions feature, it'll automatically show me the correction and allow me to make the correction right in line and make my data cleaner. And this is super important because when I import this into AppSheet, it'll look at this column and go, oh, this is all dates. This is all date data. I'll make that a date data type, which is so much more powerful for your application. Okay. So a couple of these dates need to be fixed, of course, and we could just fix that and change those later. But let me show you how we handle this complete button and this complete error or completed error. There's a little kind of anonymity that you see here. So let me go in and add some data validation. So quickly, I'm going to select this column. And under data, under data validation, I'm going to come in and say, from a list of items, and again, I'm just going to paste these in. I actually had these in the clipboard already. I want to reject the input if it's not started in progress or complete. And when I hit save, notice it goes out and it's automatically flagged and found the errors. So when I bring these in, they'll have the correct convention on it. So I don't have a new data item or data that doesn't match. And so now all my items will be complete. And if anybody needs to go forward and any new records here, if you want to do any records manually on this side, you'll be ensured that you'll have the right type of data when you do this. So data validation, super powerful. Real quickly, I'm going to go out and do data validation on this field, on the priority field, again, to make sure it's up that one, two, three, four like we had in the beginning, by simply running a macro. And again, if you've never used a macro, macros are a great way of actually creating functionality to happen over and over again automatically. So I just ran a macro that allowed me to put it on data validation. And I also built one, which allows me to go in here and use conditional formatting. This is a neat feature I like that I can actually highlight in format content based upon the different values with inside it. So under format, under conditional formatting, I can come in here and say, here's some rules based upon data elements, which again is super powerful visually. So I can see it. So in this case, I'm just going to run again a macro to show you how I can add some of these real fast, and you can see how they bounce in with my macro. So when I'm done running those macros, and again, I couldn't set that up manually, but I want to save a few steps here. Notice how visually my spreadsheet looks a lot easier to understand and making sure I get clean data. Now, again, these formats aren't going to show inside of AppSheet. But the neat thing is now I am really confident, I am really comfortable that this data is the best that it can be. So now let's bring it to AppSheet and we'll show you what it looks like. Chris, take it away with my data and show me a great AppSheet app. Okay, thank you, Charles. Yeah, that was very informative. Just kind of put a nice summary to what you just described and feel free to jump in on anything. Basically, you did two steps. First step was to clean up your data, clean up any columns, and then second part of that was to clean up your data by removing formulas and establishing data consistency, such as the complete versus completed, or the different date formats. And then the second thing you did was you normalized your data. So you took that large flat spreadsheet and turned it into a more of like a relational database where you have different tables that then refer to each other. Is that fair to say? That definitely does. And Chris, let me just ask you a question. If I would have gave you that original spreadsheet, how much more work would you have had to done? Oh, to bring it into AppSheet. Yeah, I mean, it would have not made for a very good app generation because of the hints and stuff. There's a lot of conflicting hints, to be honest. And so it would have been a trial and error. So I would have had to do what you did, basically, to go in and clean out a lot of these things and then remove formulas, make sure the columns, make sure the data is consistent, break it up into essentially a set of relational tables, so to speak, and then step through that process. But yeah, it has to happen one way or another, basically. You mentioned a great point, Chris, too. I mean, you don't have to get this perfect. You can use a little bit of trial and error and see what works. And when I started to work with AppSheet myself, I didn't understand exactly what I was doing with my spreadsheets. And so I would try something, see how it worked, throw it away and start over until I kind of understood what I needed to do and, frankly, I also read a little bit to see what I needed to do. But now I can turn a spreadsheet into an AppSheet app really, really fast. Okay, cool. So as you can see, I'm starting now with the spreadsheet that essentially Charles has prepared with us. So he's taken out all the formulas, taken out essentially all the issues that crop up when you're trying to incorporate into AppSheet. And we also have some nice formatting going on. The status is now distinctly different types here for the status. And then there's also some nice color data formatting that's going on. And of course, the big one is that he was able to take the data, separate it into different tabs here. And so all this stuff will link together very nicely in the application now. All right, so let's take the next step and let's generate an app. And so directly from Sheets, you'll see that I can do AppSheet and then create an app. So click on that. And it's going to go ahead and set up with a new application. So we'll get a few seconds. And then right out of the box, we're going to have a perfectly runnable app. Now, because I was viewing the tasks tab, it gave us this one table here. And we have all of the columns available here. So essentially mapped different columns to the different data types that is expecting that it looked at from the Sheet directly. And so we have text, date, and enum is actually enumerated type. This is because we have different statuses. So like, you know, whether the status is not started or in progress and such. And so it actually defined those enumerated types for us without us even having to do anything. So if you see on the right side, this is our UI in the preview window. This is a perfectly functional application at this point. So it's a CRUD application. So create, replace, update, delete, and also search. So I can search through all of the records very quickly. There are a few more enhancements that we can do as well. So for example, if I click to create a new record, first off, you can see that the status is now broken down into different options and via those buttons. We have a due date of today, but I might want to make that a little bit better. And we have our dropdown list, which is already auto created for us. So it gave us quite a bit out of right out of the get go without having to do anything. But let's go ahead and make it even a little bit better. Right. So in this case, what I'm going to do is take a couple of these columns and give them some initial values. So status, I'm going to go ahead and set it to, I'm going to give it like a preliminary value. I'm going to say not started. So that way we'll just start off with this not started value and evaluates gives you a little checkmark to let you know that evaluated correctly. And then for this today, so that's whenever someone enters in a new task, it auto encodes that web of today's date. So that's not entirely practical, obviously. So we want to do something that will give them or whoever is being assigned the task a couple of days to work on it. So I'm using this handy function to call workday that will give me the next date that's five business workdays into the future. And so it's basically taking that those arguments and generating that data for us when we create new records. And then finally, for the priority, we're just going to create a simple value of medium. So we'll just say medium and leave it at that. I'll click save. Once I get a confirmation that it evaluates correctly. And so that's, we're good to go at this point. I will point out that different like compared to like Google sheets or some of the other Google products where it's auto saving every time. That's not the case with that sheet. So you actually see the save button here. It is actually saving, but it gives you a little bit more fine grain control on how and when you want to save it. You can also roll back to specific earlier versions if you wanted to, but just wanted to point that out there very quickly. Yeah, that's a really good call out question. So thank you for mentioning that. Oh, sure. No problem. It's obviously people are coming from the Google world will start using app sheet. That's the first thing they'll notice in many cases. So also, before I start building out the other tables for projects and matters, I want to point out there is this project column here, which is a simple type of text. Now watch what happens when I add the other tables. That's actually going to create a relationship and it's going to change the data type to something else. So let's go and add a table for projects. And so that will generate out the necessary, essentially data table in the background. So we can do all the data operations that we want. And while I'm at it, let's go ahead and add one for managers. So now we have these distinct three tables, and they are all now related to each other as well. So if we return back to our tasks table and take a look at the columns again, you'll see that the tasks table in the project column instead of text is now point is the type is ref. That simply means that it's referring to another table of this name. And regardless of whether it's plural or single, and this is the table that it's referred to. So that essentially establishes the linkage between the two tables. And we can also see it here on the UI. So for example, if I just click on any one of these tasks, I can see the related project and such. I can even drill down further and see the projects and the actual tasks themselves. So managers, projects, tasks, it's all related now. So it's a fully relational database app with very minimal effort at this point. And typical, like in the past, if you wanted to build a fully relational database web application, that was not trivial, but we've done it in just a matter of a few clicks, I guess. All right. And I do want to add really quickly, Christian, this is one of the biggest questions or most common questions we get is how to implement this type of relational table piece. So thank you for highlighting that. I know that's something that people are really curious about really often. So thank you. Yeah. So Charles actually did the majority of the workforce in this sense. Like what he did on the spreadsheet was he just ensured that we have a column here, this column here that says project. It actually matches with another table of the project's table or tab. It doesn't really matter. It could be external table or an actual tab in the spreadsheet. And by virtue of creating it with the same name, AppSheet is able to recognize this and provide a reference. And that's why it set the data type to type ref. And so in AppSheet's kind of overall kind of thinking, I guess, it is now establishing the linkage between those two. And the same thing happened for managers. So we happen to have this table for managers, and from a project standpoint, it actually has this column of managers or the same name, essentially. So that's how you can prepare your data if it's relational for it to be essentially integrated or ingested into AppSheet. And AppSheet will automatically recognize those relationships for you. I should also point out if you're working with a, instead of a sheet, but say a SQL database, and if you have foreign key references, AppSheet will do the exact same thing. It will recognize those foreign key relationships between the different tables and create the appropriate linkage within AppSheet. So it will also set up like a reference column. That way the tables are linked together from the standpoint. And then the resulting UI will also be linked together as well without really any effort. Okay. Hopefully that makes sense. Incidentally, like I was going to show you really quickly, like if I click into these other tables, it has this manager ref. So it's pointing forward to the manager, but it also has related tasks. And so this is kind of like in the middle of the relationship. So project is kind of backwards pointing to the related tasks using this expression here, where it joins the tables together and has a reference to the manager table. And likewise, if I open up the columns on the manager table, I can see that it has this related projects where essentially using the same mechanism to join projects with managers. Okay. So at this point, my data is good to go. I don't really need to do any further customizations. I'm going to switch now to updating the UI. Because as you can see over in a UI, although we have a perfectly functional application from a task perspective, we don't really have any options to go and edit or view the data directly on the projects and managers. Now, of course, I can drill down any one of these, but I'm going to go ahead and provide some new buttons here on the bottom that gives us direct access. All right. So I'm going to, I'm also going to use some updates. We have this Google map that was given to us for free just because we have some, I'll just go ahead and leave that alone, because we actually have some address data. So it's like, okay, this user probably needs a map. And there's also some interesting statistics there that was given to us for free. So I'm going to customize these a bit. So to do that, I click on UX. And first off, let's move our little statistics chart. And instead of having it on the right side of the action bar on the bottom, let's just go ahead and load it up on the menu. All right. So that's going to disappear on the right, on the bottom right there. You can see that it's gone. And then for the map, let's just shove that over to the right side of the action bar. All right. And we'll just click save. Everything's happy. Now we're going to add two more views for both projects and managers. So if I go back to the top here, I can say, we just close that down, I'll click on new view. And let's start off with this one. I want it to do, let's just add the manager's one, the manager's view. There we go. So I give it the name that corresponds with it. And then of course, I can toggle the different view types, but I'm going to stick with deck. Deck is good enough for me, I think. For the UI, I might customize a few more things, like maybe the rounded image. And then the other thing I like to customize, at least for this case, is I like to change the icon. So this is the icon that shows up on the bottom of the bar there. So you can see managers in this case. So that makes sense. Let's go ahead and add another view for projects. So I'll click new view. And I want the data to come from the projects table. And I'll just give it a corresponding name. And for this one, instead of deck, I'm going to use tables, a little bit more succinct. And I think that's probably good for now. Although projects, I'm going to change the display icon. And this one, let's see, it's one of the list icons that I tend to like. I go for the clipboard. There we go. So now you can see we have this projects icon that matches. And so at this point, as I walk through the app a bit, you can see that I can click on the different projects, tasks, managers, or likewise, I can start with projects and drill down onto the associated, you know, click on a particular manager, drill into a project, and then drill onto individual tasks and such. So it all makes sense. Pretty straightforward. So I'm going to add a few more things to the UI. So because we have some budgetary data in the projects table, I'm going to add a new chart. So let's create a new chart. And this is going to be a chart type. And I'm going to say, let's go ahead and just stick it on the right side. I think this is good. And we're going to call it budget. And instead of tasks, I want it to go against projects. And I want it to be a pie chart. And now I just have to add a chart column. In this case, I'm going to have budget. So that's the actual column. And then I can just toggle what I want to show the actual value or the, you know, the key in this case happens to be the project name. But in this case, I'm just going to go ahead with percent. So now I have a little, you know, pie chart of the different budgets or the different dollar amounts, I guess, for the different projects. So that's basically providing me just some additional enhancements. So I selected our conduct that seems to match. And so there we go. We have kind of a nice UI of managers, projects, tasks, and our budget. And then of course we have our map. So I'll click save. And so that's it from a general UX standpoint. I'm going to add now a little bit more on the formatting or kind of like the UI specifics only. So first off, just to kind of recall, there is like these, actually I didn't mention it, but I wanted to kind of just walk through the branding feature. In this sense, like without really having to dive into any complex CSS or kind of advanced HTML, it's very easy to just go through and start changing things on the UI. So maybe I want to have like a different app logo, a different primary color and such. Maybe I'll go back to the light thing there. There's a notion of a launch image. There's a background image like this. And just to kind of show you what the effect is of toggling these different features, you can see that it's changing the look and feel of the app. And I can do this just very simply with a matter of a few clicks. All right. So I think I'm going to go with this looking feel. It generally fits what I want. So I'll click save. Oh, actually I think I'm going to tweak the view type for the projects or enough for the tasks. Let's see. It's currently a deck. I'm going to make it a little bit more compact and make it a table. So now that's happy for that. I have to be careful saying happy. I'm going to start to sound like a painter. Is it Bob Ross or something? Any old tables and projects and stuff. Yeah. So sorry, you were saying? I was going to say, we mentioned this so casually, like, oh, I just changed the table and oh, I just added some colors and changed the way it looks for the end user. It's so quick and seamless to implement in this regard, but you can really customize it to almost any need you have. Add your own special branding to it. But this is kind of the beautiful part about no code, right? Like you don't have to go in, as you mentioned, and write any type of custom coding. You just input what you need and it performs what it's supposed to do. So really cool. Yeah. I mean, take it from me. I've been building these types about three years and it's just like it's such a time saver with regards to all the complexity that you'd have to get into back in the older days. So let me go ahead and continue. Sorry, is that clear my throat here? So one of the other things that Charles has done for us is he's actually applied some formatting of the actual data here based off of the values. And so it applies like different colors and such. And so although AppSheet didn't automatically do that, let me show you really quickly how you would actually set that up on your own. And this is where you can use the format rules feature. Again, it's under the UX tab here. So in this case, I can either start from scratch or just take one of the suggestions here. So change font color. So that's basically what we're going to do for any data in task. We're going to change the font color and we're going to give it a specific condition. So in this case, we want the condition to be when the priority column equals critical. So that's fairly straightforward and it evaluates perfectly fine. And then now we just have to select which particular column we want it to apply that rule to. So you can see it's already starting to work. And now I'm just going to change the text color. So down here, I've selected the different text color. And so there you go. You can see like the different records there that have a priority of critical and now has that text color. Now I could set this up additionally for the other colors as well. But you get the idea like how I'm relatively straightforward. You can just set up the basic format. Okay. So I think for that, I think that that more or less covers what I wanted to cover from an overall UI and UX standpoint. I think I'm going to add one more little demo or one little feature to the app that kind of really kind of brings it home. And to do that, I'm going to actually utilize a new feature called the automation capability. Sorry, a new automation capability, which is just launched earlier. And what that, in a nutshell, it allows you to establish essentially a overall process which consists of an event as well as like a set of processes or a set of tasks encompassed within a process, right? And so, and the way you do it is you configure a bot, which will go through and help you define those processes. And as you configure the different components of the bot, it will actually give you suggestions based off of your own usage patterns. So it's a pretty cool feature. And as I start to build out the different events and processes and tasks, we can kind of follow along and do it fairly quickly, right? So first off, let's create a new bot. And so it's going to give us some suggestions. And so in this case, I'm just going to go ahead and select a new, whenever a new task record is created, send an email. So that's kind of like a starting point, but now I can go in and customize further. So now, if I were to look at the event that it created for me, we have this new event. And then we also have a process. And in the side of the individual process, we have all the steps. And so, and the steps themselves have these tasks. So send an email. So if I return back to the overall bot, I can also customize this further. So for example, maybe I want to do a little bit more than just send an email. Maybe I want to, let's see, I can load the suggestions. There we go. I can check to see if a status is blank, right? So maybe if the status is blank, I want to do another operation, right? So maybe I want to set some of the data. So in this case, I can just set the due date to today, or I can even customize that. So in this case, let me just hit save really quickly just to make sure everything's kind of all synchronized. So now that I've set, I've actually established a task for when a new record is created, I can say that correctly. So whenever I create a new task is checking to see if the status is blank. And if it is blank, I'm just going to do a data operation. So let's go ahead and change this a bit. So I'm going to change first the step name. So I'm going to say, set the status. I'm going to just write whatever I want here. This is like a note for myself. Set status to say not started. I like the why. The why is fun. It gives a character. That makes sense. And I'm just going to kind of apply this on it. So I'm actually redefining some of these tasks, but I'm preserving what I want it to do. I want it to do a data change. So this is the type of task. And I want to actually set a row value. So I'm going to actually just customize it all along the way here. And I just wanted to add a note while you're typing some of this in. So what was on the right hand side of the screen, the emulator which showed your application, that is, it's still there, but right now you're looking at the bot building process, essentially no pun intended there, but you're looking at the different pieces that make up these bots to perform these actions to execute these processes and tasks, et cetera. So just know that your app didn't go away. It's still there. You're just looking at more under the hood. Yeah, totally. That's totally a good point. Because like before this feature, or I keep saying feature, but essentially before this capability was rolled out, you didn't necessarily have that little gear icon showing up. And this gives you like expanded property editing capabilities. Exactly. You go walk into it and set all the different properties. So yeah, so here we go. I have my automation essentially complete, but I'm going to add another little update. I'm going to make it so this send an email. It's not going to just be sending an email to a hard coded email address. So in this case, what I'm going to do is let me just grab a bit of text here that I saved off in a little buffer file. Instead of the hard coding it, I'm going to set an expression and I pull that up and do the expression assistant and I paste that in. And let me just describe what it's going on here. This is actually going to send an email to the task owner. And so this is a reference where it's going through from a task table perspective. It's pulling up the project column and referring to the manager table. And then within the manager table, there's an email column. And so that's how it derives the correct email address. So it's no longer just hard coded. So it will definitely send an email to the task owner. So I click save. Also for the content itself, the email, there is this kind of a nifty feature where it just says default content, which all it is is going to send me send the task owner the values of the task record. But if I wanted to, I could actually add customized email content in this case. This is where I can go in and start to use individual wording and then I can refer to the data parts just using the brackets and such. And then there's even more interesting features where I can use a body template where I can create a Google doc and then using a similar templating write up, I can actually have all of that defined for me in a more sophisticated email, I guess. But just to step back from that, let me just switch back to my original bot here and I'll go back to the send an email part and I will change this to just use the default content. So just want to show that before I fire it off here. So I think at this point my app is good to go. I'm going to go ahead and do a test to make sure everything is functioning correctly. So what I'm going to do now is create a new task. So I'm just going to first drill down from the manager's perspective and I'll pick this one guy over here and I know that he has this one project. And then now I do is just add a new task. So I click on the add. As you can see, I have not started as the status. I can even change that to in progress, I guess. I can see that my date is five days, four days in the future. Maybe you can give it another day and I set it to critical. And also notice like the critical is not even color formatted as well. So pretty cool. And so now I click save. And we see that it's synchronizing now with our backend sheet. And then I can now go over to my email. I'll click refresh. Incidentally, this email was created when I generated the app. And then I should see my new email, which is simply the content of the task record there. So as you can see, it's critical. I have the new finish. I meant to write finish demo, but you got the idea. I was in a mad rush to finish off the demo, but you get the idea. So yeah, hopefully this explains kind of the overall transition from taking a sheet, cleaning up the data, separating the data into different tables, having them set up via relations, and then bringing that into app sheet. App sheet is able to take those hints, both from the data validation, the data formatting, as well as the relational, essentially the relations between the data, and give us a workable app right out from the start. And then I was able to customize it further and enhance the application that providing just some fairly sophisticated behaviors at this point. Christian, I have a question for you in terms of what you just showed. So what happened in your sheet when you did all of this work in app sheet? So what happened in the sheet? Oh, yes. So the data is still the same. So it's not going in and changing anything. It's not adding formulas. The data is the data that you left it as is. Now, the only thing that does change is when I interact with the app, obviously, I have a new record here that was inserted because I was using the app. But as I'm editing, editing, formatting, et cetera, et cetera, that's all independent of the underlying data sheet. Right. So that is really critical to understanding this relationship, right? You can have your data where it lives in its own source, have it structured how you need. And then you also have your app application. And they do seem independent, but they are speaking to each other. The difference is one is more of kind of a front end piece of your data. It allows people to interact with it based on what you provide or what you tell it to provide the end user with. And then the data is in a different area. So I really want to highlight that. I think a lot of people are scared to get in and work with something like app sheet. They're afraid it's going to break their data if errors are thrown. That's not the case. We throw errors all the time. And that's how you know you're learning and getting better is by breaking stuff in app sheets. So feel free to do that. Your data will be okay. Yeah, totally. And I would say that what you just said extends also to all the back end data sources, whether it's sheets or SQL tables, et cetera, interacting with the app that you can actually add or delete or edit records themselves, but not any of the other kind of built-in functionality of the sheets and back end data sources. Really good call out. All right. So I think we have a couple of closing notes for everyone. Would you like me to pull up the tips and tricks slide or would you like to do that, Christian? How about you go ahead and drive and I'll stop presenting and then I'll just hand it over to you. All right. Let me pull this up. I feel like we just covered so much, but we did it so quickly. But that also shows, though, that once you get the hang of it, how quickly you can build applications and automations with a no-code technology. All right. Almost there. Almost. I think I have the slides handy somewhere. No, it should be out. There you go. All right. Perfect. I believe it's presenting now. All right. So a couple of sheets, tips and tricks just to review. Charles gave us a lot of really, really good information. Again, as he mentioned, a lot of, and Christian, you mentioned this as well, a lot of what happens in app sheet when you build actually starts in sheets. So here's just a quick summary of some of his favorites that he pointed out. I know that the unique function, excuse me, in particular, was one that he highlighted a lot. I really liked the Explorer. I knew that it did something like that, but it was a good reminder that that was there. So I feel like, Charles, I owe you a debt of gratitude for reminding me of that. I was just going to say, feel free to rewind and even just play with the Explorer feature. It's pretty impressive what he can do. Yeah, absolutely. Did you have anything else you wanted to add on the sheet? No. I think that's pretty much it. I mean, those sheet functions are also quite powerful, and you can experiment. Plus, there's plenty of examples out there, but these are just tools allow you to kind of work with your data and continue to clean them up. And then that unique function was very helpful in that he was able to take a bunch of disparate different items and then just unify them. And that was very helpful to AppSheet because then AppSheet was able to be able to read that. So, oh, these are just sets of enumerated data. So I'm going to create an enum data type and then give you these options like a pop drop down or a set of buttons. So it really enhanced the integration experience. Absolutely. All right. So, Christian, actually, have you covered this slide? Oh, for this one. Yeah, in general, these are just a set of points. So these are all linkable and they'll be included in the video when it gets published. So you can click on them. But yeah, in general, AppSheet, as you guess, AppSheet.com, blog.appsheet, we have a community app sheet as well. There's also some key things that are very helpful for these topics like the data. And so obviously, yeah, you can click on them within the published video and stuff like that. Also, just a plug up on my video series that I started a couple months ago called Building with AppSheet. We just launched a new video just the other day on automations. And so if you go to that hashtag building with AppSheet, you'll see the latest video. Feel free to check it out. And I go into a little bit more detail on the types of automations you can do. But yeah, feel free to have a look at that stuff. Yeah, really great series, Christian. We reference it all the time. I will also just, I want to really double down on the community.appsheet.com. I cannot emphasize enough how important or impactful that space is. You get to connect with different app creators from all over the world, as well as the AppSheet team. I know I personally am on there quite a bit. I read everything. I may not get to respond to everything, but I do read everything. And it's amazing what you all are doing on there. So I highly recommend that space as well. Okay, so a couple of questions we have that we want to do address. All right, what's the advantage of AppSheet versus a formula heavy sheet? I feel like we covered this in some good detail, but Christian, do you have any summary points? Well, I'll give you my take on it. So AppSheet is an application development environment, right? So it gives you the end product is like, as you can see in the little screenshot there, it's an actual mobile or even a desktop app if you want it. And so that's catering towards a particular set of personas that may or may not have full comfort with working in a very complex sheet. So in this sense, yeah, you can use a sheet, whatever, if you're perfectly comfortable. But there may be people say on the shop floor that just want to go in and double check certain items or scan a tag or whatever and just do some data input, quick data input. For those folks, they don't necessarily need to go into this massive complex sheet. They just need to get in, do whatever operation they need to do and get up. And that's where AppSheet provides that nice compliment to your overall data so that it fits those types of personas in a much more efficient manner. And one also thing to add, you mentioned working on the floor or also if you're in the field, AppSheet has a really cool component. It's the offline capabilities. So you can be in the field where you don't have access to the internet. And you can collect all whatever data you need. We have companies, for example, that work in mining. And that's one way they actually take their devices in, collect information. And then when they reconnect to Wi-Fi or internet whatever they may be, they're able to actually sync back to their data source. So that is one really, really cool feature that AppSheet has. The sheets, I don't believe, does have. So something to keep in mind. Okay, next. Is it possible to start an AppSheet app without having the data sheet and no data fill into? Just start to draw the screen and the button. So the answer is, and technically it's no, the answer is no. So you'll need some sort of initial data defining document. So typically you would start with a sheet or it could be a SQL table. But that's kind of just the starting point. Because as you saw, when I built the app, it was actually reading deeper. It saw all the hints within the data itself. And it created those data types. It created like the enum, for example, it created like a certain level of customization that it was only able to do that based off of the extra data that you provided. So without a doubt, yeah, you do need to have some initial document by which to base the data. This is a little bit different from some other similar low code or no code work. They actually provide like a data modeling feature where you start literally from scratch. But that's not the case here. And I think there's actually a good point in this sense that you just cut to the chase, point it to your data that you already have, and then just quickly give you something that is workable. And then you just customize at that point. So it's a very efficient overall kind of user journey in that sense. Right. And I would add to we have sample apps you can get started with. They're free of charge. You just have to have an app sheet account, which is also free of charge to get started with too. They actually have a data source built in. And you can see what it looks like. And when we talk about, you know, a data defining document, it can just be the names of columns, you don't actually have to have those filled in. So that that's also helpful, a little tip to get started with there too. Yeah. So if you start from scratch, just open up a sheet, add a few columns, and then you're good to go. You just do the tools menu and then generated an app. And then you're good to go. Yeah, absolutely. All right. Can I connect multiple Google Sheet files in one app sheet window or slice? Yes, yes, you can. So if you recall in the demo, Charles had set it up where we have different tables in different tabs in a single sheet. Those could have easily been multiple sheets. And then I could have also established relationships between those multiple sheets. And in a similar fashion, in a SQL database environment, I would have multiple tables and then I can just do the same thing. So the answer is basically yes. Perfect. All right. See, if I choose multiple columns to form my key, will it be similar to how it is handled in a SQL database? I think we covered this earlier. You have to some degree. I mean, it's like, so in general, to just to kind of discuss the key capability in app sheet and how it kind of differs from a Sheets world. So like in Sheets, it's perfectly acceptable to have different records, different rows in your sheet to have exactly the same values, right? But in a traditional database application, that's not really doable because you can have data collision because it needs a way to identify every individual row or record. And so that's where it has this concept of a row ID or row key and such. And so app sheet does the exact same thing. It provides a key mechanism by which you can establish uniqueness among the different records, even if the data itself is identical. And so app sheet will go through define a key for you. It will pick either the leftmost column or will actually concatenate the two columns that make the most sense. It's all done to establish uniqueness. And it does this by scanning the data to establish that uniqueness. Now, you can also customize how and where you want to use a key. Like I could define my own column and just specify that I want this column to be my key. And I'm also going to generate a unique value using a function called unique ID and set that as my unique key. Now I could do that. I could also set up multiple columns to serve as a key. So I could just have a little checkbox. I say that's part of the key and that's part of the key. And it'll do that. So either I can do it manually or even app sheet does this manually. And so in your case, if you're choosing multiple columns to form a key, which is something that I just said that you could do, how similar is it handled in SQL databases? The answer is that it's exactly the same. You can use it in a similar fashion where you have both the different columns setting up as the key. And it's even the same in the database world. You could actually set up a form key relationship where you have like multiple columns establishing that relationship for you as well. But basically the answer is, yes, it's essentially the same. All right. That was a long-winded explanation for that. No, keys are important. And there's also a lot of puns I like to make in there too, but I'm going to refrain from making key puns because I think I do it too often. Okay. I think it's our last question. I am trying to build an informative app. Each column has info like name, email, phone. Do you guys suggest that each piece of info, data be split between columns? So I'm tempted to make a funny reference and say, no, just stick them all in one column. Without a doubt, you need to kind of keep, well, you totally need to keep the data separated. So like, you know, address, you know, date, all these things where they're distinctly different data types. Just as in a spreadsheet, you would want to have your columns be distinctly different defining like what an email is different from a phone number and address, yada, yada. So all that stuff needs to be split up into different columns from, and that's just a recommendation from Sheets or Database Tables and such. And so naturally, yeah, that applies in the AppSheet world as well. I actually, I want to try that now. When we're done with this, I'm actually going to try taking all of those lumps together to see what AppSheet will do. I think that would be really, yeah. Your birth date, address, text, phone, column will just be text as it will be. Crushing my dreams. It will be yes or no. No, whatever. All right. Can you define unique values in a virtual column? So technically, you could start down this path. I could say, okay, just to recap or just to remind folks, a virtual column is basically a column that's derived with an expression, right? And so a lot of times, virtual columns are created to, well, if you recall, I had this like related tasks, that was essentially set up a virtual column with an expression to derive that related task. So it just happens that if you define a virtual column with a function, like unique ID, AppSheet will then pause you right there and say, no, it's not allowed. So you actually can't do that technically speaking. You can't define a virtual column using the unique ID function to derive unique values in this case. And it's doing that to establish data consistency. So there's essentially an understanding or a method to that particular behavior, I guess. Gotcha. Okay. So that is a wrap. I want to quickly thank Christian and Charles for providing their insight and information. Today, I think we all learned a lot and were reminded of some really cool pieces in both Sheets and in AppSheet as well. So thank you, everyone, for joining us today. Greatly appreciate it. And until next time, stay safe and stay healthy. And we'll see you on the community. Thank you as well, Jennifer. It's been fun. It's been a pleasure walking through this stuff. So yeah. Absolutely. And we'll have you both back on more in the future. All right. Take care, everyone. Thanks so much. Okay. Take care.