Power Fx Cheat Sheet

Quick-reference formulas for Canvas App developers. Copy, paste, ship.

34 formulas across 8 categories

Format date
Text(Today(), "[$-en-US]mmmm d, yyyy")
Relative time
If(
    DateDiff(dt, Now(), TimeUnit.Minutes) < 60,
    Text(DateDiff(dt, Now(), TimeUnit.Minutes)) & " min ago",
    Text(DateDiff(dt, Now(), TimeUnit.Hours)) & " hr ago"
)
Date range filter (last 30 days)
Filter(Items, Created >= DateAdd(Today(), -30, TimeUnit.Days))
First / last day of month
// First day
Date(Year(Today()), Month(Today()), 1)

// Last day
DateAdd(Date(Year(Today()), Month(Today()) + 1, 1), -1, TimeUnit.Days)
Business days between dates
With(
    {d1: startDate, d2: endDate},
    DateDiff(d1, d2, TimeUnit.Days)
    - 2 * Int(DateDiff(d1, d2, TimeUnit.Days) / 7)
)
Currency
Text(12500, "$#,###.00")  // → "$12,500.00"
Abbreviate large numbers
If(
    v >= 1000000, Text(v / 1000000, "#.#") & "M",
    If(v >= 1000, Text(v / 1000, "#.#") & "K", Text(v))
)
Truncate with ellipsis
If(Len(txt) > 50, Left(txt, 47) & "...", txt)
Extract initials
Upper(
    Left(name, 1) &
    If(Find(" ", name) > 0, Mid(name, Find(" ", name) + 1, 1), "")
)
Proper case
Proper(Lower(text))
Add computed column
AddColumns(Items, "FullName", FirstName & " " & LastName)
Group by
GroupBy(Items, "Category", "GroupItems")
Distinct values
Distinct(Items, Category)
Sort multi-column
SortByColumns(Items, "Priority", SortOrder.Ascending, "Date", SortOrder.Descending)
Remove duplicates
ForAll(Distinct(colItems, Title), LookUp(colItems, Title = Result))
Delegation-safe search
// StartsWith is delegable — Contains is NOT
Filter(Items, StartsWith(Title, searchText))
CountRows workaround
// CountIf is delegable, CountRows is not
CountIf(Items, true)
Cache with ClearCollect
ClearCollect(colLocal, Filter(DataSource, Status = "Active"))
Concurrent loading
Concurrent(
    ClearCollect(col1, Source1),
    ClearCollect(col2, Source2),
    ClearCollect(col3, Source3)
)
Patch to SharePoint with error check
Set(varResult,
    Patch(
        YourSharePointList,
        Defaults(YourSharePointList),
        {
            Title: txtTitle.Value,
            Status: {Value: "Active"},
            AssignedTo: drpAssignee.Selected
        }
    )
);
If(
    IsError(varResult),
    Notify("Save failed: " & FirstError.Message, NotificationType.Error),
    Notify("Saved successfully", NotificationType.Success);
    Navigate(scrList, ScreenTransition.None)
)
Edit existing SharePoint item
Set(varResult,
    Patch(
        YourSharePointList,
        LookUp(YourSharePointList, ID = varSelectedId),
        {
            Title: txtTitle.Value,
            Status: {Value: drpStatus.Selected.Value}
        }
    )
);
If(IsError(varResult),
    Notify("Update failed: " & FirstError.Message, NotificationType.Error),
    Notify("Updated", NotificationType.Success)
)
IfError with fallback value
IfError(
    LookUp(Items, ID = varId),
    Notify("Not found", NotificationType.Error);
    Blank()
)
Validate before Patch
If(
    IsBlank(txtTitle.Value),
    Notify("Title is required", NotificationType.Warning),
    IsBlank(drpStatus.Selected),
    Notify("Select a status", NotificationType.Warning),
    // All valid — save
    Patch(YourSharePointList, Defaults(YourSharePointList),
        {Title: txtTitle.Value, Status: drpStatus.Selected}
    );
    Notify("Saved", NotificationType.Success)
)
Coalesce for defaults
Coalesce(varUser, "Unknown")
Breakpoints
If(App.Width < 640, "mobile", If(App.Width < 1024, "tablet", "desktop"))
Responsive padding
If(App.Width < 640, 12, 24)
Responsive columns
If(App.Width < 640, 1, If(App.Width < 1024, 2, 4))
Max-width centering
Min(Parent.Width - 48, 1200)
Color theme
nfColors = {
    pageBg:  ColorValue("#F9FAFB"),
    cardBg:  ColorValue("#FFFFFF"),
    primary: ColorValue("#2563EB"),
    danger:  ColorValue("#DC2626")
};
Responsive check
nfIsMobile = App.Width < 640;
User info
nfCurrentUser = {
    Name:     User().FullName,
    Email:    User().Email,
    Initials: Upper(Left(User().FullName, 1))
};