Quickbase Pipeline Jinja patterns Adapt step references; snippets are independent evaluations. Failed examples are included for explanation, not reuse. Change case {{ aa.task_name | upper }} Replace every space {{ aa.task_name | upper | replace(' ', '_') }} Collapse whitespace, join, then change case {{ aa.task_name.split() | join('_') | upper }} A fallback for notes {{ aa.notes | default('No notes provided', true) }} The numeric fallback that hid zero {{ aa.estimated_hours | default('Not estimated', true) }} Inspect the value before choosing a rule Value: [{{ aa.estimated_hours }}] Defined: {{ aa.estimated_hours is defined }} None: {{ aa.estimated_hours is none }} Number: {{ aa.estimated_hours is number }} Replace None while preserving zero {% if aa.estimated_hours is none %} Not estimated {% else %} {{ aa.estimated_hours }} {% endif %} Format an assigned User, with an unassigned branch {% if aa.assigned_to is none %} UNASSIGNED {% else %} {{ aa.assigned_to.last_name | upper }}, {{ aa.assigned_to.first_name }} [{{ aa.assigned_to.id }}] {% endif %} Create a list from Text {% set tags = aa.task_tags.split(',') %} Task: {{ aa.task_name }} | Tags: {{ tags }} Create and iterate the list in the same mapping {% set tags = aa.task_tags.split(',') %} {% for tag in tags %} [{{ loop.index }}/{{ loop.index0 }}:{{ tag }}] {% endfor %} The counter that did not persist as intended {% set tags = aa.task_tags.split(',') %} {% set matches = 0 %} {% for tag in tags %} {% if tag == 'Reporting' %} {% set matches = matches + 1 %} {% endif %} {% endfor %} Reporting Matches: {{ matches }} Keep the count in a namespace {% set tags = aa.task_tags.split(',') %} {% set ns = namespace(matches=0) %} {% for tag in tags %} {% if tag == 'Reporting' %} {% set ns.matches = ns.matches + 1 %} {% endif %} {% endfor %} Reporting Matches: {{ ns.matches }} Failed experiment: do not use this as a numeric timestamp {% set elapsed_seconds = aa.date_completed.time - aa.due_date.time %} Observed working datetime subtraction {# Show the two Date/Time values exactly as the Pipeline sees them. #} Due: {{ aa.due_date }} Completed: {{ aa.date_completed }} {# Subtract the Due Date directly from Date Completed. This tests whether Jinja can perform datetime arithmetic without trying to extract a separate numeric .time property. #} Difference: {{ aa.date_completed - aa.due_date }} Compare a duration with a three-hour threshold {# Subtract Due Date from Date Completed. The result is a duration, not a plain number. #} {% set elapsed = aa.date_completed - aa.due_date %} {# Convert that duration into total seconds so we can compare it against a fixed business threshold. #} {% set seconds = elapsed.total_seconds() %} {# Three hours = 10,800 seconds. The exact 3:00 boundary still counts as within the requirement. #} {% if seconds <= 10800 %} WITHIN 3-HOUR REQUIREMENT {% else %} OVER 3-HOUR REQUIREMENT {% endif %} Classify a due time against the run-start clock {# Compare the Pipeline's run time with the Task's Due Date. The result tells us where the Task sits relative to "now." #} {% set elapsed = runtime.triggered_at - aa.due_date %} {# Convert the duration into seconds so its sign and size can be tested against our three-hour business window. #} {% set seconds = elapsed.total_seconds() %} {# A negative result means the Due Date has not arrived yet. The Task is still upcoming. #} {% if seconds < 0 %} UPCOMING {# Zero through 10,800 seconds means the Due Date has passed, but by no more than three hours. #} {% elif seconds <= 10800 %} WITHIN 3-HOUR WINDOW {# Anything greater than 10,800 seconds means more than three hours have passed since the Task was due. #} {% else %} OVER 3-HOUR WINDOW {% endif %}