# Spreadsheet Import Tool

**URL:** <https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500>\
**Category:** Ignition Exchange\
**Tags:** scripting, ignition81\
**Created:** [July 20, 2024, 1:33pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500 "2024-07-20T13:33:38Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 22, 2025, 12:55pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/21 "2025-05-22T12:55:06Z")

</div>

Hmmm. Not within the initial `system.tag.configure`. Play with the member path/values pairs to see what you can do with its `system.tag.writeBlocking`.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [May 22, 2025, 1:19pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/22 "2025-05-22T13:19:11Z")

</div>

Reading the manual, I thought it said parameters and members use `writeBlocking` so I thought it was just a matter of getting the path correct. I tried every path I could think of and couldn't get it to work. This nested UDT is in the root. If the name is `MyUDT` I would think it would be `MyUDT/Parameters.myParam` (which is what I used in a `writeBlocking` test). I'll keep trying. If you have a chance could you give it a whirl just to confirm it will (or won't) work?

---

<div class="post-metadata">

**Author:** ![Steve\_Laubach](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/steve_laubach/32/60900_2.png) [@Steve\_Laubach](https://forum.inductiveautomation.com/u/Steve_Laubach)\
**Post date:** [May 22, 2025, 1:30pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/23 "2025-05-22T13:30:53Z")

</div>

I did a tag import from a wonderware tagdb to Ignition with the alarm configurations and trending.

I ended up writing it in a script transform and just copy/pasting the JSON into my tag db. I didn't know you could do that so I thought I'd pass that along in case it is helpful for others.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [May 29, 2025, 1:54pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/24 "2025-05-29T13:54:48Z")

</div>

Posting this in case it's useful to others. Iterators are useful but there may be times where a list of arbitrary values is needed instead. For example, instead of a range like `1-10` or `1,2,5-9`, something like a list of string values `'V1', 'B2', 'EE'`. In my example below I still create an iterator column but also add an eval column to grab a specific value at the index. I can then reference that value (for columns to the right) using `%(SCPNdx)s`.

![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/c/f/cfe03f9fe2a8ae44d4c818696e849419dc5e5e26.png)

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 29, 2025, 2:05pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/25 "2025-05-29T14:05:19Z")

</div>

> [@jlandwerlen](#):
>
> where a list of arbitrary values is needed instead

I recommend this for simple cases:

 ![NonNumericIteration](https://us1.discourse-cdn.com/inductiveautomation/original/3X/1/9/1985248dba07e22b2b7a014ed3e274348eedf2cd.png)

No eval required. The only potential gotcha is digits followed by a single letter `F` will be interpreted as float instead of a string.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [May 29, 2025, 2:10pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/26 "2025-05-29T14:10:13Z")

</div>

`1F` was a problem for me. That is a common breaker designator. I wish there was a way to escape that.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 29, 2025, 2:17pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/27 "2025-05-29T14:17:11Z")

</div>

> [@jlandwerlen](#):
>
> I wish there was a way to escape that.

You can comment out lines 202-205 in the project library script. One of my clients did that, for the same reason.

---

<div class="post-metadata">

**Author:** ![msteele](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/msteele/32/77889_2.png) [@msteele](https://forum.inductiveautomation.com/u/msteele)\
**Post date:** [May 29, 2025, 2:53pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/28 "2025-05-29T14:53:09Z")

</div>

Another recommendation for the table format, because it also allows an arbitrary number of columns for each row and reference of those values inside the row block keyword columns.

For many of the vendors whose systems we integrate with, we now have it where we can get simple CSV/Excel exports from their design artifacts and plug them right in to our site deployment template.

Sometimes, we use simple Excel helper columns to the left or right to create values needed in our keyword columns - this is useful if you need to do calculations in one row based on values in another row. Other times, we can use an Eval column to create one formula to evaluate at runtime.

For example, this allows us to easily configure 10,000 individual tracker row motors at a solar plant with unique custom properties and parameters written for each instance, with one simple config block under the keyword columns to the right of the table. And, if the configuration changes during commissioning and the vendor updates their source data, it's a simple copy/paste from their updated CSV and then we can re-run via the Spreadsheet Import Tool.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [May 29, 2025, 8:21pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/29 "2025-05-29T20:21:20Z")

</div>

When using the table format, how do you guys handle situations where you don't want to pass a value? In the simple example below, assuming an iterator to the left of 1-10, 2-9 will be 11, not blank or None. This should never happen, but I would like to know options just in case I need to handle that.

Thanks for bringing up the table format, it's quite handy now that I have run through scenarios.

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/9/c/9c42d55ab80b03ef9ea2957a08d14b848c072f51.png)

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 29, 2025, 8:25pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/30 "2025-05-29T20:25:21Z")

</div>

Create a first row with that column blank, as the first row in an iterator block is the default when a cell below it is empty. Arrange for your action item to be missing an element so it won't execute for that row.

---

<div class="post-metadata">

**Author:** ![msteele](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/msteele/32/77889_2.png) [@msteele](https://forum.inductiveautomation.com/u/msteele)\
**Post date:** [May 29, 2025, 9:22pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/31 "2025-05-29T21:22:05Z")

</div>

I was the client for development of this tool, and I'm _still_ learning about it. I've fought that behavior a few times and it's great to know a blank row will do the job.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [May 29, 2025, 9:26pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/32 "2025-05-29T21:26:30Z")

</div>

Phil I might send you a test spreadsheet to look at if you don't mind. I tried having a blank row/cell and for me it enters a 0.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 29, 2025, 9:37pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/33 "2025-05-29T21:37:00Z")

</div>

I don't mind, but it'll be tomorrow. Beer arriving shortly. 😁

---

<div class="post-metadata">

**Author:** ![kcarter8](https://avatars.discourse-cdn.com/v4/letter/k/c89c15/32.png) [@kcarter8](https://forum.inductiveautomation.com/u/kcarter8)\
**Post date:** [June 5, 2025, 5:53pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/34 "2025-06-05T17:53:08Z")

</div>

I’m not super familiar with the tool Pturmel built, but I’ve had success setting UDT custom parameters using `system.tag.configure`. Not sure how it handles nested UDTs (UDTs inside UDTs), but here’s what worked for me when defining the tag:

```python
path =Where_to_place_the_tag
tag = {
    "name": Name_of_tag_instance,         
    "typeId": Path_of_UDT_to_use,
    "tagType": "UdtInstance", 
    "parameters": {
        "NameOfParameter1": value1,
        "NameOfParameter2": value2,
        "NameOfParameter3": value3
    }
}

system.tag.configure(path,[tag],"m")

```

That approach let me configure the parameters right out of the gate during tag creation. Might not cover every edge case (like embedded UDTs), but it worked well for my use case.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [June 5, 2025, 5:56pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/35 "2025-06-05T17:56:03Z")

</div>

Thanks for the info and welcome to the forum. This topic is related to Phil's spreadsheet import tool.

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [July 25, 2025, 2:13am UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/36 "2025-07-25T02:13:24Z")

</div>

Hey Phil, when I create UDT instances I'd like to create a document custom property. I can create custom props for strings and numbers, but can't seem to figure out how to make it document. Any tips?

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [July 25, 2025, 12:19pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/37 "2025-07-25T12:19:49Z")

</div>

No can do. There is special handling for `.value` when a tag's data type is Document, but there's no way to trigger that for general tag properties.

(I think making custom tag props as anything other than strings is unwise. Consider just adding a document tag member to your UDT, and providing a value for that.)

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [July 25, 2025, 12:54pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/38 "2025-07-25T12:54:15Z")

</div>

Thanks Phil. I can't alter the UDTs I'm working with, so I'm stuck with what I have and trying to be creative. My goal is to have a means to store Top Server config data so I can quickly create Top Server channel and devices. For now I can just use a string (I know that's wrong) but if it works well enough perhaps I can talk them into adding tags to the UDTs.

---

<div class="post-metadata">

**Author:** ![Chris\_Bingham](https://avatars.discourse-cdn.com/v4/letter/c/e5b9ba/32.png) [@Chris\_Bingham](https://forum.inductiveautomation.com/u/Chris_Bingham)\
**Post date:** [July 25, 2025, 7:10pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/39 "2025-07-25T19:10:17Z")

</div>

> [@jlandwerlen](#):
>
> I can create custom props for strings and numbers, but can't seem to figure out how to make it document.

Isn't this straightforward using tag import/export functionality?

> **tags.json**
>
> ```python
> {
> "valueSource": "memory",
> "dataType": "String",
> "name": "New Tag",
> "Doc": {
> "key": "value",
> "key_1": {
> "key": "value",
> "key_1": "value"
> }
> },
> "value": "This tag has a document property named Doc",
> "tagType": "AtomicTag"
> }
> 
> ```

---

<div class="post-metadata">

**Author:** ![jlandwerlen](https://avatars.discourse-cdn.com/v4/letter/j/bc8723/32.png) [@jlandwerlen](https://forum.inductiveautomation.com/u/jlandwerlen)\
**Post date:** [July 25, 2025, 7:11pm UTC](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500/40 "2025-07-25T19:11:48Z")

</div>

This topic, and my question, is related to Phil's Spreadsheet Import Tool.

[Previous page](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500.md?page=1)

[Next page](https://forum.inductiveautomation.com/t/spreadsheet-import-tool/93500.md?page=3)
