Skip to main content
FLO.W 思流Notion Formulas
Formula Snippets

Task and Project Formulas

Formula examples for task status, completion rate, priority, automatic summaries, project health, and related project-management scenarios.

This page organizes formulas by task and project-management scenarios. It is useful when you need snippets for task databases, project databases, reading databases, or customer databases.

Each snippet first lists the properties you need, then provides a copy-ready formula.

ScenarioMain functions used
Due statuslets(), dateBetween(), ifs()
Progress displaymin(), max(), repeat()
Project statisticsfilter(), length(), round()
Text processingsplit(), trim(), unique()

Task status: today, overdue, future

Prepare these properties:

  • Due Date: date
  • Status: select, including "Completed"
lets(  Completed, prop("Status") == "Completed",  daysLeft, dateBetween(prop("Due Date"), today(), "days"),  ifs(    Completed, style("Completed", "green"),    empty(prop("Due Date")), style("No date set", "gray"),    daysLeft < 0, style("Overdue " + format(abs(daysLeft)) + " days", "red", "b"),    daysLeft == 0, style("Due today", "yellow", "b"),    daysLeft <= 3, style("Due soon", "orange"),    style("Normal", "blue")  ))

Completion-rate progress bar

Prepare this property:

  • Completion Rate: number, from 0 to 1
lets(  ratio, min(1, max(0, prop("Completion Rate"))),  filledBlocks, round(ratio * 10),  repeat("█", filledBlocks) + repeat("░", 10 - filledBlocks) + " " + format(round(ratio * 100)) + "%")

Priority score

Prepare these properties:

  • Importance: select, Important / Normal
  • Urgency: select, Urgent / Not urgent
ifs(  prop("Importance") == "Important" and prop("Urgency") == "Urgent", "1 Handle now",  prop("Importance") == "Important" and prop("Urgency") != "Urgent", "2 Schedule for later",  prop("Importance") != "Important" and prop("Urgency") == "Urgent", "3 Delegate or handle quickly",  "4 Postpone or delete")

Automatically generate a page summary

Prepare these properties:

  • Status: select
  • Assignee: people
  • Due Date: date
lets(  assigneeText, if(empty(prop("Assignee")), "Unassigned", prop("Assignee").map(current.name()).join("、")),  dateText, if(empty(prop("Due Date")), "No due date set", formatDate(prop("Due Date"), "YYYY-MM-DD")),  "Status: " + prop("Status") + " | Assignee: " + assigneeText + " | Due: " + dateText)

Prepare these properties:

  • The project database is related to the task database, and the relation property is named Tasks
  • The task database has Status, with "Completed" as the completed status
lets(  allTasks, prop("Tasks"),  totalCount, allTasks.length(),  completedCount, allTasks.filter(current.prop("Status") == "Completed").length(),  if(totalCount == 0, 0, round(completedCount / totalCount * 100) / 100))

Display it as text progress:

lets(  allTasks, prop("Tasks"),  totalCount, allTasks.length(),  completedCount, allTasks.filter(current.prop("Status") == "Completed").length(),  ratio, if(totalCount == 0, 0, completedCount / totalCount),  format(completedCount) + "/" + format(totalCount) + "(" + format(round(ratio * 100)) + "%)")

Project health

Prepare these properties:

  • Tasks: related tasks
  • The task database has Status and Due Date
lets(  allTasks, prop("Tasks"),  totalCount, allTasks.length(),  completedCount, allTasks.filter(current.prop("Status") == "Completed").length(),  overdueCount, allTasks.filter(current.prop("Status") != "Completed" and not(empty(current.prop("Due Date"))) and current.prop("Due Date") < today()).length(),  completionRate, if(totalCount == 0, 0, completedCount / totalCount),  overdueRate, if(totalCount == 0, 0, overdueCount / totalCount),  score, round((completionRate * 0.7 + (1 - overdueRate) * 0.3) * 100),  ifs(    totalCount == 0, style("No tasks yet", "gray"),    score >= 85, style("Healthy " + format(score), "green", "b"),    score >= 60, style("Average " + format(score), "yellow", "b"),    style("Risk " + format(score), "red", "b")  ))

Estimate reading-note word count

Prepare this property:

  • Notes: text
length(replaceAll(prop("Notes"), "\\s+", ""))

Clean tags

Prepare this property:

  • Input Tags: text, separated by commas
split(prop("Input Tags"), ",").map(current.trim()).filter(not(empty(current))).unique().join("、")

Rough email-format check

if(  test(prop("Email"), "^[\\w\\.-]+@[\\w\\.-]+\\.\\w+$"),  "Format looks valid",  "Format may be invalid")

Note: this is a rough format check. It does not prove that the email address is reachable.

link(  "Search",  "https://www.google.com/search?q=" + replaceAll(prop("Keyword"), " ", "+"))

To use these formulas directly in task reminders, project progress, note heatmaps, and reports, continue with FLO.W Notion Template.

Last updated on