cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
khaledhikmat
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
CarlosFigueira
Power Apps
Power Apps

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
CarlosFigueira
Power Apps
Power Apps

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.

Very helpful. Thanks. I appreciate the clear answer. 

Helpful resources

Announcements
PA Virtual Workshop Carousel 768x460.png

Register for a Free Workshop

This training provides practical hands-on experience in creating Power Apps solutions in a full-day of instructor-led App creation workshop.

Microsoft Build 768x460.png

Microsoft Build is May 24-26. Have you registered yet?

Come together to explore latest innovations in code and application development—and gain insights from experts from around the world.

May UG Leader Call Carousel 768x460.png

What difference can a User Group make for you?

At the monthly call, connect with other leaders and find out how community makes your experience even better.

Top Solution Authors
Top Kudoed Authors
Users online (2,494)