cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Highlighted
Advocate III
Advocate III

Custom PowerApp Function?

Is there a way to write custom functions that can be called from within the formulas? 

1 ACCEPTED SOLUTION

Accepted Solutions
Highlighted
Power Apps
Power Apps

Re: Custom PowerApp Function?

Yes, but it's not a simple process today. The main process to add a custom function is to create a custom API, where the function would be executed in the server, and in your app you'd add a connection to that API.

 

Depending on your scenario, there may be an alternative to that. For example, I was working on a PoC app that contained an analog clock. To display the pointers (or in my case, circles), I needed to calculate the sine and cosine of the angle depending on the current time. Those functions (Sin/Cos) are not available yet, I created a collection in the screen's OnVisible handler with the pre-calculated values for the functions:

 

ClearCollect(Angles,
    { Angle: 0, Sin: 0.000, Cos: 1.000 },
    { Angle: 1, Sin: 0.017, Cos: 1.000 },
    { Angle: 2, Sin: 0.035, Cos: 0.999 },
    { Angle: 3, Sin: 0.052, Cos: 0.999 },
    { Angle: 4, Sin: 0.070, Cos: 0.998 },
    { Angle: 5, Sin: 0.087, Cos: 0.996 },
    { Angle: 6, Sin: 0.105, Cos: 0.995 },
    { Angle: 7, Sin: 0.122, Cos: 0.993 },
    { Angle: 8, Sin: 0.139, Cos: 0.990 },
    ...

And when you're ready to use the values, you can use the Last/FirstN combination to get the required value, like in the example below (which I used in a timer's OnTimerEnd property):

 

UpdateContext({ rx: Circle1.Width / 2, ry: Circle1.Height / 2 });
UpdateContext({ cx: Circle1.X + rx, cy: Circle1.Y + ry });
UpdateContext({ now: Now() });
UpdateContext({ h: Mod(Hour(now), 12), m: Minute(now), s: Second(now) });
UpdateContext({ sp: s * 6, mp: m * 6 + RoundDown(s / 12, 0), hp: h * 30 + RoundDown(m / 12, 0) });
UpdateContext({ sa: Last(FirstN(Angles, sp + 1)), ma: Last(FirstN(Angles, mp + 1)), ha: Last(FirstN(Angles, hp + 1)) });
UpdateContext({ sx: cx + sa.Sin * rx - 10, sy: cy - sa.Cos * ry - 10,
                mx: cx + ma.Sin * rx - 15, my: cy - ma.Cos * ry - 15,
                hx: cx + ha.Sin * rx - 15, hy: cy - ha.Cos * ry - 15 })

Again, this is a workaround for a specific scenario, which may not apply to your case. Please create a new issue in the PowerApps Ideas board (or vote up if it already exists), if you feel that this is a scenario that is important to you.

View solution in original post

2 REPLIES 2
Highlighted
Power Apps
Power Apps

Re: Custom PowerApp Function?

Yes, but it's not a simple process today. The main process to add a custom function is to create a custom API, where the function would be executed in the server, and in your app you'd add a connection to that API.

 

Depending on your scenario, there may be an alternative to that. For example, I was working on a PoC app that contained an analog clock. To display the pointers (or in my case, circles), I needed to calculate the sine and cosine of the angle depending on the current time. Those functions (Sin/Cos) are not available yet, I created a collection in the screen's OnVisible handler with the pre-calculated values for the functions:

 

ClearCollect(Angles,
    { Angle: 0, Sin: 0.000, Cos: 1.000 },
    { Angle: 1, Sin: 0.017, Cos: 1.000 },
    { Angle: 2, Sin: 0.035, Cos: 0.999 },
    { Angle: 3, Sin: 0.052, Cos: 0.999 },
    { Angle: 4, Sin: 0.070, Cos: 0.998 },
    { Angle: 5, Sin: 0.087, Cos: 0.996 },
    { Angle: 6, Sin: 0.105, Cos: 0.995 },
    { Angle: 7, Sin: 0.122, Cos: 0.993 },
    { Angle: 8, Sin: 0.139, Cos: 0.990 },
    ...

And when you're ready to use the values, you can use the Last/FirstN combination to get the required value, like in the example below (which I used in a timer's OnTimerEnd property):

 

UpdateContext({ rx: Circle1.Width / 2, ry: Circle1.Height / 2 });
UpdateContext({ cx: Circle1.X + rx, cy: Circle1.Y + ry });
UpdateContext({ now: Now() });
UpdateContext({ h: Mod(Hour(now), 12), m: Minute(now), s: Second(now) });
UpdateContext({ sp: s * 6, mp: m * 6 + RoundDown(s / 12, 0), hp: h * 30 + RoundDown(m / 12, 0) });
UpdateContext({ sa: Last(FirstN(Angles, sp + 1)), ma: Last(FirstN(Angles, mp + 1)), ha: Last(FirstN(Angles, hp + 1)) });
UpdateContext({ sx: cx + sa.Sin * rx - 10, sy: cy - sa.Cos * ry - 10,
                mx: cx + ma.Sin * rx - 15, my: cy - ma.Cos * ry - 15,
                hx: cx + ha.Sin * rx - 15, hy: cy - ha.Cos * ry - 15 })

Again, this is a workaround for a specific scenario, which may not apply to your case. Please create a new issue in the PowerApps Ideas board (or vote up if it already exists), if you feel that this is a scenario that is important to you.

View solution in original post

Highlighted
Advocate III
Advocate III

Re: Custom PowerApp Function?

Very helpful. Thanks. I appreciate the clear answer. 

Helpful resources

Announcements
Community Conference

Power Platform Community Conference

Find your favorite faces from the community presenting at the Power Platform Community Conference!

Watch Now

Experience what’s next for Power Apps

See the latest Power Apps innovations, updates, and demos from the Microsoft Business Applications Launch Event.

Power Platform ISV Studio

Power Platform ISV Studio

ISV Studio is designed to become the go-to Power Platform destination for ISV’s to monitor & manage published applications.

secondImage

Power Platform 2020 release wave 2 plan

Features releasing from October 2020 through March 2021

Top Solution Authors
Top Kudoed Authors
Users online (7,811)