# How do I call a project library script from an expression binding?

**URL:** <https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013>\
**Category:** Ignition\
**Tags:** perspective\
**Created:** [December 12, 2023, 2:43am UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013 "2023-12-12T02:43:46Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![mdemaris](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mdemaris/32/54639_2.png) [@mdemaris](https://forum.inductiveautomation.com/u/mdemaris)\
**Post date:** [December 12, 2023, 2:43am UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/1 "2023-12-12T02:43:46Z")

</div>

I am attempting to use a simple project library script in an expression binding. Perspective doesn't seem to like doing so.

Is there a way to do this? I did use the `ScriptName.functionName(param)` syntax.

---

<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:** [December 12, 2023, 2:49am UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/2 "2023-12-12T02:49:28Z")

</div>

Use the `runScript()` expression function. If passing arguments, read its instructions and examples carefully.

---

<div class="post-metadata">

**Author:** ![lrose](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lrose/32/62724_2.png) [@lrose](https://forum.inductiveautomation.com/u/lrose)\
**Post date:** [December 12, 2023, 5:05am UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/3 "2023-12-12T05:05:10Z")

</div>

Note that the Expression language is its own thing and though similar is some aspects is not the same as Jython (the scripting language).

The Manual is your friend.

[https://docs.inductiveautomation.com/display/DOC81/Expression+Language+and+Syntax](https://docs.inductiveautomation.com/display/DOC81/Expression+Language+and+Syntax)

---

<div class="post-metadata">

**Author:** ![mdemaris](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mdemaris/32/54639_2.png) [@mdemaris](https://forum.inductiveautomation.com/u/mdemaris)\
**Post date:** [December 13, 2023, 2:02am UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/4 "2023-12-13T02:02:49Z")

</div>

The manual says:

`// Preferred syntax.`

`runScript(` `"textScript.myFunc"` `, ` `0` `, ` `"Hello Again"` `, ` `"See ya later"` `)`

I am attempting to use `runScript()` as getting a value from a project library script (string), by sending an integer in the parameter field for a named query:  
`runScript("CustomSwitchFunc.getZoneName", {view.params.zone})`  
I get 0 records, when 3 is expected.

` runScript(CustomSwitchFunc.getZoneName, {view.params.zone})`  
returns configuration error.

` runScript("CustomSwitchFunc.getZoneName({view.params.zone})")`  
returns an empty dataset

` runScript("CustomSwitchFunc.getZoneName(1)")`  
returns the expected dataset.

` runScript("CustomSwitchFunc.getZoneName", 1)`  
returns an empty dataset

`runScript("CustomSwitchFunc.getZoneName()", {view.params.zone})`  
empty dataset

`runScript("CustomSwitchFunc.getZoneName", "{view.params.zone}")`  
empty dataset

So... what am I missing?

Edit:  
and this `runScript("CustomSwitchFunc.getZoneName('" + {view.custom.zone_test} +"')")`  
returns an empty dataset

---

<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:** [December 13, 2023, 2:32am UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/5 "2023-12-13T02:32:03Z")

</div>

If you're using the preferred form (separate arguments) you **must** specify the poll rate parameter; that's the zero in the example you copied.

---

<div class="post-metadata">

**Author:** ![lrose](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lrose/32/62724_2.png) [@lrose](https://forum.inductiveautomation.com/u/lrose)\
**Post date:** [December 13, 2023, 3:41am UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/6 "2023-12-13T03:41:10Z")

</div>

> [@mdemaris](#):
>
> runScript("CustomSwitchFunc.getZoneName", {view.params.zone})

As @paul-griffith says.

This one returns 0 records because, the zone parameter is interpreted as the polling rate and the default value for the zone parameter in the function is assumed, probably `None` in this case. How many records would the function return for Zone `0`?

Try this instead:

```auto
runScript("CustomSwitchFunc.getZoneName",0,{view.params.zone})

```

---

<div class="post-metadata">

**Author:** ![mdemaris](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mdemaris/32/54639_2.png) [@mdemaris](https://forum.inductiveautomation.com/u/mdemaris)\
**Post date:** [December 13, 2023, 11:32pm UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/7 "2023-12-13T23:32:30Z")

</div>

Definitely a 🤦‍♂️ moment!

Phil said read it carefully, I read but didn't "see" the poll param; the brain said "Oh, it's optional, just ignore it."

Thanks, @pturmel , @lrose and @paul-griffith for your patience with people, like me, who sometimes overlook the obvious 😅

---

<div class="post-metadata">

**Author:** ![lrose](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lrose/32/62724_2.png) [@lrose](https://forum.inductiveautomation.com/u/lrose)\
**Post date:** [December 13, 2023, 11:49pm UTC](https://forum.inductiveautomation.com/t/how-do-i-call-a-project-library-script-from-an-expression-binding/83013/8 "2023-12-13T23:49:56Z")

</div>

> [@mdemaris](#):
>
> "Oh, it's optional, just ignore it."

For future reference, afaik the expression language does not support keyword arguments, so the only time that optional parameters are optional is if you are not providing any optional parameters or they are not followed by any supplied value.
