Using the app
Search RowCraft tables with JQL
Every column of every RowCraft table can be searched with JQL. Use the searches in Jira's work item search, saved filters, boards, dashboards and automation, like any other JQL.
Two functions
| Table | JQL function | First argument |
|---|---|---|
| Table field | rowcraftField() |
The field's name or ID |
| Panel table | rowcraftPanel() |
The panel table's name or ID |
issue in rowcraftField("<table field>", "<column> <operator> <value>", ...)
issue in rowcraftPanel("<panel table>", "<column> <operator> <value>", ...)
issue not in rowcraftField("<table field>", "<conditions>")
The two functions never match each other's tables, so a field table and a panel table may have the same name. Combine them with any other JQL:
project = PUR AND issue in rowcraftField("Purchase items", "Qty > 1") AND issue in rowcraftPanel("Vendor quotes", "Accepted = false")
Write conditions
Each condition is <column> <operator> <value>:
- Column: the column name as shown in the table, in any case. Names with spaces need no quotes:
Unit price > 100. Put a name in square brackets when it contains an operator character:[A > B] ~ x. - Value: numbers as numbers; text, options and dates with or without quotes; several words need no quotes (
Item ~ dell laptop); lists in parentheses:IN ("Hardware", "Software"). - Jira functions work in values:
currentUser(),membersOf("finance"),startOfMonth(),endOfWeek(),now()and relative dates such as-7d. - Checkboxes take
trueorfalse.
Combine conditions
Several arguments are combined with AND. Inside one argument you can use AND, OR, NOT and parentheses, as in JQL (NOT binds tighter than AND, and AND tighter than OR):
issue in rowcraftField("Purchase items", "Category = Hardware", "Unit price >= 1000")
issue in rowcraftField("Purchase items", "Category = Hardware AND Unit price >= 1000")
issue in rowcraftField("Purchase items", "Category = Hardware OR Unit price >= 5000")
issue in rowcraftField("Purchase items", "(Category = Hardware OR Category = Software) AND NOT Owner = currentUser()")
The first two searches are the same. Up to 10 conditions fit in one call.
Operators by column type
Each column type accepts the same operators as the Jira field it resembles.
| Column type | Operators | Example |
|---|---|---|
| Text, Long text | ~ !~ IS EMPTY IS NOT EMPTY |
Item ~ laptop, Item ~ lap* |
| Number, Formula | = != > >= < <= IN NOT IN IS EMPTY IS NOT EMPTY |
Qty >= 3, Amount IN (100, 200) |
| Select list, Multi select | = != IN NOT IN IS EMPTY IS NOT EMPTY |
Category = Hardware |
| User | = != IN NOT IN IS EMPTY IS NOT EMPTY |
Owner = currentUser() |
| Date | = != > >= < <= IN NOT IN IS EMPTY IS NOT EMPTY |
Needed by <= endOfMonth() |
| Checkbox | = != IN NOT IN IS EMPTY IS NOT EMPTY |
Paid = true |
| Work item | = != IN NOT IN IS EMPTY IS NOT EMPTY |
Order = PROC-12 |
| Row number | Not searchable |
- Text is searched by word, like Jira's text fields:
~ lapdoes not find laptop, but~ lap*does. A quoted phrase finds rows that contain all its words, in any order. - Options match exactly, including case:
= Officedoes not find Office supplies. - For people, use
currentUser(),membersOf()or account IDs; display names cannot be searched (as with Jira's own user fields).
Column statistics
Compare one number for the whole column instead of "any row":
| Statistic | Meaning | Columns |
|---|---|---|
SUM(column) |
Sum of all rows (0 when no row has a number) | Number, Formula |
AVG(column) |
Average of the rows that have a number | Number, Formula |
MIN(column), MAX(column) |
Smallest or largest value | Number, Formula |
COUNT(column) |
Rows with the cell filled in (checkbox: checked; multi select: at least one option) | Every column |
issue in rowcraftField("Purchase items", "SUM(Amount) > 10000")
issue in rowcraftField("Purchase items", "AVG(Unit price) >= 100")
issue in rowcraftField("Expense lines", "COUNT(Receipt attached) >= 3")
issue not in rowcraftField("Purchase items", "MAX(Unit price) >= 7000")
The statistic is always the one you write. It does not depend on what the column's totals row shows.
Total and RowCount
Two names stand for the whole table (English, any case):
Totalis the sum of the column chosen as Column behind Total in JQL in Table settings, the same asSUM(that column). Without such a column the search reports an error; useSUM(column)instead.RowCountis the number of rows.
issue in rowcraftField("Purchase items", "Total > 10000")
issue in rowcraftField("Purchase items", "RowCount >= 3")
Amount > 10000 means "a row above 10,000"; Total > 10000 means "the rows add up to more than 10,000". A column that is really called Total takes precedence.
not in and NOT
not in returns the exact opposite of in, including work items whose table, or that column, is empty. NOT inside the conditions does the same for one condition.
Range comparisons on a column (>, >=, <, <=) cannot be negated: because a table has many rows, "no row is 7,000 or more" is not the same as "some row is below 7,000". Write the opposite condition with in, or use a statistic, which allows ranges with not in:
issue in rowcraftField("Purchase items", "Unit price < 7000")
issue not in rowcraftField("Purchase items", "MAX(Unit price) >= 7000")
The second search finds work items without any row at 7,000 or more, including those with no table.
Name the table
| Function | Accepted first arguments |
|---|---|
rowcraftField() |
The field name (any case), customfield_10044, cf[10044] or 10044 |
rowcraftPanel() |
The panel table name (any case), or its ID such as p3 (from the address /panels/p3 on the Panel tables page) |
If two tables have the same name, use the ID.
Panel tables: rowcraftPanel()
rowcraftPanel() takes the same conditions as rowcraftField():
issue in rowcraftPanel("Onboarding tasks", "Done = false", "Owner = currentUser()")
- Rows can be found a few seconds after they are saved.
- Up to 10 panel tables can be searched on one work item.
- People columns of panel tables take
currentUser()and account IDs, but notmembersOf(): Jira does not allow it there. To search by group, use a table field.
Search properties of table fields
Table fields also have search properties that you can use directly in JQL, for example in tools that only offer field paths:
| JQL | Meaning |
|---|---|
"Purchase items".RowCount >= 2 |
Number of rows |
"Purchase items".Total > 1000 |
Sum of the Total column |
"Purchase items" ~ "laptop" |
Text anywhere in the table |
Note that the field name and property must be inside one pair of quotes. Column values are stored in numbered properties ("Purchase items.Number2", "Purchase items.Option1" …) that depend on the order in which columns were created; rowcraftField() translates column names into them for you, so prefer the function.
When a search shows an error
For every app-provided JQL function, Jira shows one general message when something is wrong: JQL is invalid. Validation of field by customJqlFunctionExpansion failed. Check:
- the table name, and that you used
rowcraftField()for a field androwcraftPanel()for a panel table; - the column names, operators (see the table above) and values (quotes around text with special characters, lists in parentheses);
- that you did not negate a range on a column;
- that you have access to the RowCraft app.
The search helper validates the search as you type and shows Jira's message under the JQL box.
When changes reach searches
- New and changed rows are found as soon as the work item is saved (panel tables: a few seconds after saving).
- After an administrator saves the column designer, renames a table field or changes its contexts, RowCraft refreshes its JQL functions immediately, so saved filters keep working.
- After a formula or the Total column changes, existing work items are recalculated in the background, usually within seconds to minutes.
- Searches always respect Jira permissions: work items you cannot browse never appear.