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
Microsoft 365 Conference – December 6-8, 2022

Microsoft 365 Conference – December 6-8, 2022

Join us in Las Vegas to experience community, incredible learning opportunities, and connections that will help grow skills, know-how, and more.

Top Solution Authors
Top Kudoed Authors
Users online (1,421)