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.

PA.JPG

New Release Planning Portal (Preview)

Check out our new release planning portal, an interactive way to plan and prepare for upcoming features in Power Platform.

Top Solution Authors
Top Kudoed Authors
Users online (3,500)