# Accessing group components in a loop

**URL:** <https://forum.inductiveautomation.com/t/accessing-group-components-in-a-loop/117375>\
**Category:** Ignition\
**Tags:** scripting, vision, ignition81\
**Created:** [October 7, 2026, 8:25pm UTC](https://forum.inductiveautomation.com/t/accessing-group-components-in-a-loop/117375 "2026-10-07T20:25:00Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![SOPerator](https://avatars.discourse-cdn.com/v4/letter/s/838e76/32.png) [@SOPerator](https://forum.inductiveautomation.com/u/SOPerator)\
**Post date:** [October 7, 2026, 8:25pm UTC](https://forum.inductiveautomation.com/t/accessing-group-components-in-a-loop/117375/1 "2026-10-07T20:25:00Z")

</div>

I have a screen in Vision that has 15 rows of 6 text fields each. I'd like to populate these text fields with preexisting data upon loading the page, so I have the below script as an internalFrameActivated script, but I'm having trouble figuring out how to actually access the components in this way. I keep getting an error about doubleValue not existing for Type: None.

Is it possible to access components in this way, or is there a better way to do it?

```python
if system.gui.getParentWindow(event).getComponentForPath('Root Container').updateFlag == True:

    existingDataset = system.tag.read('[client]QC/VeneerThicknessCheck/UpdateExisting/ExistingDataForUpdateQuery').value
    

    field_map = {
    
        "tail": "TailField",
        "center": "CenterField",
        "head": "HeadField",
        "average": "AverageField",
        "length": "LengthField",
        "width": "WidthField"
    }
    
    rows = 15
    fields_per_row = len(field_map)
        
    #Loop through all 15 rows, set all values to 0
    for row in range(rows):
        #group_component = event.source.parent.getComponent("Root Container.Group %d" % group_number)
        groupVal = row + 1
        group_component = system.gui.getParentWindow(event).getComponentForPath("Root Container.Group %d" % groupVal)
        system.gui.getParentWindow(event).getComponentForPath('Root Container.Group 1.AverageField').doubleValue
        #group = {}
        
        for field_index, field_info in enumerate(field_map):
            system.gui.messageBox("field_index: " + str(field_index) + "field_info: " + str(field_info) , "DEBUG")
            component_name = field_info
            system.gui.messageBox("component_name: " + str(component_name), "DEBUG")
            data_index = (row * fields_per_row) + field_index
            system.gui.messageBox("data_index: " + str(data_index), "DEBUG")
            value = existingDataset[data_index]
            system.gui.messageBox("group component: " + str(group_component), "DEBUG")    
            #system.gui.messageBox("group_component.getComponent(component_name): " + str(group_component.getComponent(component_name)),"DEBUG")
            system.gui.messageBox("group_component.getComponent(component_name): " + str(group_component.getComponent(component_name)),"DEBUG")
            group_component.getComponent(component_name).doubleValue = value
            system.gui.messageBox("Row: " + str(row) + ". Component Name: " + str(component_name) + ". Value = " + str(value), "DEBUG")
            

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [October 7, 2026, 10:26pm UTC](https://forum.inductiveautomation.com/t/accessing-group-components-in-a-loop/117375/2 "2026-10-07T22:26:52Z")

</div>

> [@SOPerator](#):
>
> about doubleValue not existing for Type: None.

This means one of your component resolutions is returning "None" (Python's name for `null`), meaning "there was no component by that name to find".

One of these; without the line number it's hard to say which.

> [@SOPerator](#):
>
> `system.gui.getParentWindow(event).getComponentForPath('Root Container.Group 1.AverageField').doubleValue`

> [@SOPerator](#):
>
> `group_component.getComponent(component_name).doubleValue = value`

This either means there's a typo, discrepancy in your naming convention, whatever.

* * *

With that said...

> [@SOPerator](#):
>
> 15 rows of 6 text fields each

Repetitive, formulaic data entry that fits a distinct model sounds like a job for a [Table](https://www.docs.inductiveautomation.com/docs/8.3/appendix/components/vision-components/tables/table), not a mish-mash of components in different containers that you have to be sure to name and arrange just right. Building and assembling a dataset is ~easy, especially with a database involved.

---

<div class="post-metadata">

**Author:** ![bkarabinchak.psi](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bkarabinchak.psi/32/83567_2.png) [@bkarabinchak.psi](https://forum.inductiveautomation.com/u/bkarabinchak.psi)\
**Post date:** [October 8, 2026, 12:34pm UTC](https://forum.inductiveautomation.com/t/accessing-group-components-in-a-loop/117375/3 "2026-10-08T12:34:25Z")

</div>

I second that it should probably be at able since its just a text field but if you still really want the text field or in other scenarios yo have a different non-table friendly component, go through the trouble of crafting a expression. Create a root container custom property that binds to your dataset, lets call it `initialData`.

Then under each text field make a custom property `initialValue` that is defined like

`try({Root Container.initialData}[someRowValue, 'someColumnName'], 'fallbackValue')`

Then bind your text property to this.

If it is formulaic then the row value and column name are predicatable, make a template with params that accept that a rowNumber and columnName param and use that in the expression, then use a template repeater to make your 15 rows by 6 columns.

Having said all that, if it really is _just_ a text field I would definitely lean towards a table.
