# How do I create a custom form?

**URL:** <https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014>\
**Category:** Community Resources\
**Created:** [April 1, 2021, 11:46am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014 "2021-04-01T11:46:14Z")\
**Posts on this page:** 20\
**Page:** 3

<div class="post-metadata">

**Author:** ![Test\_Test](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/test_test/32/30930_2.png) [@Test\_Test](https://community.glideapps.com/u/Test_Test)\
**Post date:** [December 22, 2021, 11:14am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/42 "2021-12-22T11:14:10Z")

</div>

Thanks again.  
Integromat, or any 3rd party call, will again create these lags when you have multiple concurrent requests for such a “protected counter”.  
No way of doing it inside Glide without risk of concurrency?

* * *

Edit:  
I just remembered the interval limitation…

 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/2/b/2b724ddcfa18888a544afcf33c3c6b397792fea8.png)  
As this number is used rather often (for each new lead), it’ll most definitely happen concurrently. Integromat will accept the trigger, but surely delay its response, thus creating a lag.

---

<div class="post-metadata">

**Author:** ![Darren\_Murphy](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/darren_murphy/32/47326_2.png) [@Darren\_Murphy](https://community.glideapps.com/u/Darren_Murphy)\
**Post date:** [December 22, 2021, 12:28pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/43 "2021-12-22T12:28:40Z")

</div>

I guess it depends on your use case, and how quickly you need the result. My most recent use case is as follows:

- Twice a day, I have about 200 users that the submit a result of a “test”
- They all do it within about a 1-2 hour timespan
- As each user submits, their UserID is added to a list of users that have submitted
- The end result is a single joined list of ~200 user IDs.

When I first implemented this, it was all done within Glide. Each users ID was added to the list as they submitted and a new list was written, replacing the existing list. _On the very first day_, I had several users complaining that they had submitted, but their name didn’t appear on the list. It didn’t take me long to figure out what was happening. Concurrency. If 2 users happened to submit at the same time, then the last one in would win, and the first users ID would get bumped from the list. The answer was Integromat, and I changed my flow as follows:

- Now as each user submits, a webhook is sent with their UserID and the TestID
- Integromat checks the backend sheet to find the correct TestID row, and adds their ID to the list.
- If two or more users submit at the same time, it doesn’t matter as the requests are queued.

Since I’ve implemented the above, it’s worked perfectly and there have been zero complaints. So again, it depends on your use case. If you need instant results, then no it’s not a good solution. But if you can live with a slight delay, then I think it’s the most reliable solution available at the moment.

---

<div class="post-metadata">

**Author:** ![Test\_Test](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/test_test/32/30930_2.png) [@Test\_Test](https://community.glideapps.com/u/Test_Test)\
**Post date:** [December 22, 2021, 12:41pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/44 "2021-12-22T12:41:33Z")

</div>

Thanks!  
I’ve found a nice little API which might help, but I’m again concerned about concurrency and speed.  
The API is name [Newton](https://github.com/aunyks/newton-api).  
For our super-simple use of incrementing a number:  
1.

```auto
https://newton.now.sh/api/v2/simplify/LN%2B1

```

PS - This URL is created with a template column within Glide as the Construct URL column seems like an overkill.  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/6/9/69edb5d2e5fadb510af0d53d1e4d6fb487253b63.png)

1. 

Using the API column to reach the API  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/0/b/0b68326cba79705cf668b52dacf89c08ff6b9c36.png)

1. 

The result is fine  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/1/d/1d417288c88f0b665cacba3dc7ca056893d06172.png)

Now I’m at a roadblock as to the best way to extract the number after “result”.

First, what do you think about this solution?  
Second, any suggestion as to how to extract the result?

PS - I’m finding it super hard to believe that we need 3rd parties just to avoid concurrency for such a simple task. This should be handled within Glide.

---

<div class="post-metadata">

**Author:** ![SantiagoPerez](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/santiagoperez/32/16807_2.png) [@SantiagoPerez](https://community.glideapps.com/u/SantiagoPerez)\
**Post date:** [December 22, 2021, 1:24pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/45 "2021-12-22T13:24:44Z")

</div>

I think you can input .result in your JQ Query to just get the result.

---

<div class="post-metadata">

**Author:** ![Test\_Test](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/test_test/32/30930_2.png) [@Test\_Test](https://community.glideapps.com/u/Test_Test)\
**Post date:** [December 22, 2021, 1:33pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/46 "2021-12-22T13:33:44Z")

</div>

> [@SantiagoPerez](#):
>
> I think you can input .result in your JQ Query to just get the result.

you’re good! 🙂  
Documentation isn’t Glide’s strong suit. So many great features but no explanation as to how to use them. Good thing we have this wonderful community.  
While I have you, any ideas on how to increment a number within glide, avoiding concurrency for a mission-critical counter?

---

<div class="post-metadata">

**Author:** ![Test\_Test](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/test_test/32/30930_2.png) [@Test\_Test](https://community.glideapps.com/u/Test_Test)\
**Post date:** [December 22, 2021, 1:40pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/47 "2021-12-22T13:40:42Z")

</div>

I just noticed something, but I might be wrong.  
Is the API column calculated every time the sheet is updated?  
If so, it’s VERY bad for a fixed number (such as client number).  
Even if we “set value” using an component action, we’re still (again) at risk of having the two or more concurrent actions happening together ☹  
Are we really forced into LockService on Google Apps Script?

---

<div class="post-metadata">

**Author:** ![Test\_Test](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/test_test/32/30930_2.png) [@Test\_Test](https://community.glideapps.com/u/Test_Test)\
**Post date:** [December 22, 2021, 3:48pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/48 "2021-12-22T15:48:05Z")

</div>

> [@Darren\_Murphy](#):
>
> What I’ll often do is open my custom form on top of a completely separate table - a table that has just a single row. Then collect all my form data in that row, before writing a new row to the destination table when the user submits. This keeps things nice and clean.

HI  
Could you please share some more information about how this is done?  
I seem to be struggling with the “parent” table instead of a single-row table as you suggest (which I already created, as a Glide Table and not Gsheet).

Perhaps possible to apply an example here?

> [@Darren\_Murphy](#):
>
> [https://snowy-fire-6109.glideapp.io/](https://snowy-fire-6109.glideapp.io/)

What you mean is that instead of adding a New Row to animals, you’ll start a new screen point to this single-row table. But, then what? Every other action will still point back to the animals table.  
 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/a/9/a9348e914ce7e94b798d3bedc61712fcbc2053ff.png)

Thanks!

---

<div class="post-metadata">

**Author:** ![Darren\_Murphy](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/darren_murphy/32/47326_2.png) [@Darren\_Murphy](https://community.glideapps.com/u/Darren_Murphy)\
**Post date:** [December 22, 2021, 4:56pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/49 "2021-12-22T16:56:03Z")

</div>

hmm, I need to update that app. I wouldn’t do that action like that now. The else there is completely un-necessary, and I probably wouldn’t have that extra Set Columns action in there.

It’s late here, but try to find some time to have a look tomorrow.

---

<div class="post-metadata">

**Author:** ![Eric\_Penn](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/eric_penn/32/73888_2.png) [@Eric\_Penn](https://community.glideapps.com/u/Eric_Penn)\
**Post date:** [December 22, 2021, 5:21pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/50 "2021-12-22T17:21:27Z")

</div>

I don’t believe the intervals apply to webhook modules with their triggers set to ‘instant’.

My experience.

---

<div class="post-metadata">

**Author:** ![ThinhDinh](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thinhdinh/32/49_2.png) [@ThinhDinh](https://community.glideapps.com/u/ThinhDinh)\
**Post date:** [December 22, 2021, 11:41pm UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/51 "2021-12-22T23:41:35Z")

</div>

> [@Test\_Test](#):
>
> Documentation isn’t Glide’s strong suit. So many great features but no explanation as to how to use them.

> **[Fetch JSON column | Glide](https://www.glideapps.com/plugins/fetch)**
>
> Fetch and optionally transform JSON

They put a video on JQ Query in the plugins page, if that’s what you need.

---

<div class="post-metadata">

**Author:** ![Test\_Test](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/test_test/32/30930_2.png) [@Test\_Test](https://community.glideapps.com/u/Test_Test)\
**Post date:** [December 23, 2021, 5:46am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/52 "2021-12-23T05:46:43Z")

</div>

> [@ThinhDinh](#):
>
> They put a video on JQ Query in the plugins page

Thanks @ThinhDinh. That’s not quite what I was aiming for but surely helpful!

BTW - Strange, but it seems the search doesn’t cover the Plugins, which is why I didn’t see this before

 ![image](https://us1.discourse-cdn.com/flex002/uploads/glideapps/original/3X/2/b/2b1a0e8792415b53c87c64f8f3eef828835a4bea.png)

---

<div class="post-metadata">

**Author:** ![Test\_Test](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/test_test/32/30930_2.png) [@Test\_Test](https://community.glideapps.com/u/Test_Test)\
**Post date:** [December 23, 2021, 5:49am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/53 "2021-12-23T05:49:54Z")

</div>

> [@Darren\_Murphy](#):
>
> I wouldn’t do that action like that now. The else there is completely un-necessary, and I probably wouldn’t have that extra Set Columns action in there.

Thanks @Darren_Murphy. Another issue that I’ve noticed (or shall I say another thing I’m doing wrong): When we use the “Show new screen” action it works only once per each app screen. If we put another button, asking for a new screen from it, we’ll get a generic Glide details page. Surely I’m doing something wrong, which is why you guys save me each time 🙂

* * *

Edit:  
My bad about the single screen issue. I simply configured the action wrong. I forgot that each new screen has to point to “this item”, which allows us to manipulate as needed. It seems like a rather strange, not to say aggressive, workaround in the sense that we need to demolish some/all connection to “this item” in order to have the freedom to create our customs forms.

---

<div class="post-metadata">

**Author:** ![ThinhDinh](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/thinhdinh/32/49_2.png) [@ThinhDinh](https://community.glideapps.com/u/ThinhDinh)\
**Post date:** [December 23, 2021, 9:16am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/54 "2021-12-23T09:16:04Z")

</div>

It works on the main Glide website ([http://glideapps.com/](http://glideapps.com/)), I assume since the documentations is on a subdomain ([https://docs.glideapps.com/](https://docs.glideapps.com/)) they do not cover those.

---

<div class="post-metadata">

**Author:** ![David\_Gabler](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/david_gabler/32/44332_2.png) [@David\_Gabler](https://community.glideapps.com/u/David_Gabler)\
**Post date:** [December 26, 2021, 3:00am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/56 "2021-12-26T03:00:30Z")

</div>

I like the concept of your template to check for duplicates. But I was able to EDIT and change Tigers to Tiger, and it didn’t catch the DUPE, then. Personally, I would not allow edit on a field that had to be NO DUPES ALLOWED and we had already checked it for that.

I’m also not following what all the empty entries in the database are for. Are they all simply temporary edit rows that got left behind? I’m impressed at the work that went into this template app.

I appreciate the implementation of calculated string columns (lower, trim, etc).

I think to fully understand all the concepts I will have to create my own template.

---

<div class="post-metadata">

**Author:** ![Darren\_Murphy](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/darren_murphy/32/47326_2.png) [@Darren\_Murphy](https://community.glideapps.com/u/Darren_Murphy)\
**Post date:** [December 26, 2021, 3:10am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/57 "2021-12-26T03:10:06Z")

</div>

> [@David\_Gabler](#):
>
> I like the concept of your template to check for duplicates. But I was able to EDIT and change Tigers to Tiger, and it didn’t catch the DUPE, then. Personally, I would not allow edit on a field that had to be NO DUPES ALLOWED and we had already checked it for that.

Preventing duplicates from being created on edit is a little tricky, but it can be done. Essentially you need to create a relation that _excludes_ the row being edited. This is something I had to do recently. If it is something you need to do, let me know and I can provide some more details about how to approach it.

---

<div class="post-metadata">

**Author:** ![David\_Gabler](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/david_gabler/32/44332_2.png) [@David\_Gabler](https://community.glideapps.com/u/David_Gabler)\
**Post date:** [December 26, 2021, 3:24am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/58 "2021-12-26T03:24:03Z")

</div>

Thanks, I’m sure someone might. But I’ve been using NO DUPE indexes on data for so long, I’m used to columns that cannot be changed once created, and I’ve very rarely seen circumstances where they had to be (in those cases we’d do a delete/insert)

---

<div class="post-metadata">

**Author:** ![Darren\_Murphy](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/darren_murphy/32/47326_2.png) [@Darren\_Murphy](https://community.glideapps.com/u/Darren_Murphy)\
**Post date:** [December 26, 2021, 4:33am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/59 "2021-12-26T04:33:22Z")

</div>

I’ve updated the original concept app to check for duplicates on edit.

> [@Darren\_Murphy](#):
>
> Update 2021-12-26: Concept app has been updated, to take advantage of some newer features and techniques. Changes include:
> 
> - A working table has been added, and is used to prevent duplicates being created on edit (this makes use of the Remove Element from Array plugin)
> - Names are trimmed to remove extra white space
> - Actions have been “modernised” to keep Save buttons disabled while all required criteria are not met.

---

<div class="post-metadata">

**Author:** ![Darren\_Murphy](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/darren_murphy/32/47326_2.png) [@Darren\_Murphy](https://community.glideapps.com/u/Darren_Murphy)\
**Post date:** [December 26, 2021, 4:34am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/60 "2021-12-26T04:34:48Z")

</div>

> [@Test\_Test](#):
>
> Could you please share some more information about how this is done?  
> I seem to be struggling with the “parent” table instead of a single-row table as you suggest (which I already created, as a Glide Table and not Gsheet).
> 
> Perhaps possible to apply an example here?

Done.

I’ve updated the app and the original post to include an example of using a working table.

---

<div class="post-metadata">

**Author:** ![David\_Gabler](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/david_gabler/32/44332_2.png) [@David\_Gabler](https://community.glideapps.com/u/David_Gabler)\
**Post date:** [December 26, 2021, 5:08am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/61 "2021-12-26T05:08:47Z")

</div>

Thanks, the updated APP works like a charm, as well as one other feature that was broken in the copy I downloaded seems to have been fixed (the “animal name taken” was not showing – it simply would not highlight the ‘save’ button).

I love the working table concept, also. This does lead me to the question, you had specified the user-specific columns with using “USC / Column Name”. I don’t seem to be able to find any documentation describing that. I always implemented user-specific columns with the check-box.

I had prior noticed a column I had named “Notes / Memories” had been implemented in a strange way, but I don’t think it was truly “user specific” because if one user changed the column, everyone else saw the changes.

---

<div class="post-metadata">

**Author:** ![Jeff\_Hager](https://sea2.discourse-cdn.com/flex002/user_avatar/community.glideapps.com/jeff_hager/32/43_2.png) [@Jeff\_Hager](https://community.glideapps.com/u/Jeff_Hager)\
**Post date:** [December 26, 2021, 5:28am UTC](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014/62 "2021-12-26T05:28:25Z")

</div>

Using a ‘/’ in a column name creates a group just for organization. When you have several columns with the same word prior to the / in the column name, it groups them all together. It does not change the function of the column in any way. It’s just to visually organize your data.

> **[Managing Columns](https://docs.glideapps.com/all/product/data-editor/managing-columns#column-grouping)**

[Previous page](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014.md?page=2)

[Next page](https://community.glideapps.com/t/how-do-i-create-a-custom-form/25014.md?page=4)
