abdur-nur-porag82 downloadsTurn markdown lists into a live spreadsheet — instant sums, budgets, checklists, and calculator-style formulas (math, conditions, sin/sqrt) with full Bangla/Bengali support.
ListSheet turns your everyday markdown lists into a live, calculating spreadsheet. Write a simple label = expression line and get instant sums, budgets, checklists, and formula results — right inside your notes, with full Bangla/Bengali support built in.
Sum, Avg, Min, Max, Count, Mid, First, Last, plus math functions (sin, cos, sqrt, LCM, GCD) and full operators (+ - * / % ^)totalCheck(), totalUnCheck(), and name lookups only count what's actually tickedIf(condition, true, false) with == != and or not, including nested conditions for grading, alerts, and status checksParentName.ChildName, no separate lookup needed"Total: " + Sum(Budget)V1.0.0 is latest release of listsheet series.
ClistCalc and ListSheet are following same syntex. Both support bulletlist,checklist,nested list. ListSheet extends for supporting number list. There is great difference between parsing. Because ListSheet use new engine for it. Previously, ClistCalc use note with regex to find out list. So, sometimes token or regex mistake like suffix,prefix are generally happend. But, ListSheet use different technique here. It reads your markdown first then every list convert in a obj with separating Suffix,prefix or others. So, when calculation you only get value from list. Also when any list item have no value it ignoring that to avoid errors as null. Below FAQ section you get more answer and work process.
So, migrate from CListCal to listsheet is easier and recommend. They both use same functions like Sum,Avg,..etc and Conditions If(condition,true,false).
[!Important] CListCalc plugin will officially disconnect after August 30,2026.
```listsheet ``` block to write formulas.Tip: Supports both English and Bengali (বাংলা) digits and labels.
ListSheet reads three list styles from your notes.
Simple bullet points. Use - or *.
- Apples = 50
- Oranges = 30
- Mangoes = 20
Nested bullet list:
- Fruits
- Apples = 50
- Oranges = 30
- Vegetables
- Carrots = 15
- Potatoes = 10
Ordered items. Use 1. 2. or Bengali ১. ২.
1. Rent = 5000
2. Food = 3000
3. Transport = 1500
Nested numbered list:
1. Income
1. Salary = 20000
2. Freelance = 8000
2. Expenses
1. Rent = 5000
2. Bills = 2000
Checkable items. Use - [ ] for unchecked and - [x] for checked.
- [x] Milk = 80
- [x] Bread = 60
- [ ] Butter = 120
Only checked items are counted in formulas (unless the parent is checked — then all children count).
Nested checkbox list:
- [x] Groceries
- [x] Milk = 80
- [ ] Eggs = 50
- [x] Bread = 60
If two or more lists share the same parent name, ListSheet follows a rule to decide what to do.
| Mode | What happens |
|---|---|
| Merge (default) | Both lists are joined into one single object, in document order |
| Unique | Each list gets its own key — the second becomes Name #2, the third Name #3, and so on |
You can change this rule in Settings → ListSheet → Duplicate section handling.
- Expenses
- Rent = 5000
- Food = 3000
- Expenses
- Transport = 1000
- Bills = 500
With Merge, both lists combine into one Expenses object:
Total = Sum(Expenses) ← sees Rent + Food + Transport + Bills = 9500
With Unique, each list stays separate:
Total1 = Sum(Expenses) ← Rent + Food = 8000
Total2 = Sum(Expenses #2) ← Transport + Bills = 1500
Tip: Use Merge when you want all items from repeated sections to count together. Use Unique when you need to treat each block independently.
This is one of the most common mistakes. Read carefully.
When you write a flat list (items without any parent item above them), ListSheet stores all those items under the section heading — not under the item names themselves.
## My Section
- Apple = 50
- Orange = 30
- Mango = 20
Here, Apple, Orange, and Mango are stored inside My Section. You cannot call them by name directly in a formula.
❌ Total = Apple + Orange ← This will NOT work
✅ Total = Sum(My Section) ← This works
✅ One = My Section.Apple ← This works (dot notation)
defaultIf your flat list has no heading above it, ListSheet saves it under the key default.
- Rent = 5000
- Food = 3000
❌ Total = Rent + Food ← Will NOT work
✅ Total = Sum(default) ← Works
✅ MyRent = default.Rent ← Works (dot notation)
Direct name access works only when an item has nested children (it becomes its own top-level key):
- Expenses ← becomes a top-level key named "Expenses"
- Rent = 5000
- Food = 3000
✅ Total = Sum(Expenses) ← Works
✅ MyRent = Expenses.Rent ← Works
Rule of thumb: If your item has children → access it by its name. If it has no children → access it via its
headingordefault.
List item values can have extra text before or after the number. These are called prefix and suffix.
- Item name = [prefix] number [suffix]
- Price = $ 250 USD
- Rent = ৳ 5000 taka
- Score = approx 87 marks
- Tax = 15 %
In each case, ListSheet separates the value from the surrounding text:
| Item | Prefix | Value | Suffix |
|---|---|---|---|
| Price | $ |
250 |
USD |
| Rent | ৳ |
5000 |
taka |
| Score | approx |
87 |
marks |
| Tax | (none) | 15 |
% |
The prefix and suffix appear as labels in the panel display, but they are not part of the calculation.
You can use text (strings) directly in your formulas using double quotes.
name = "your text"
name = "Hello " + OtherValue
name = Value + " kg"
Label = "Total Cost"
Message = "Score is " + Score
Unit = Weight + " kg"
Full = "Name: " + "Ahmed"
Suffix = "Suffix "+ 19*20
Prefix = 18*8+" Prefix"
Nested = "Suffix "+78*7+" Prefix"
You can also mix text and numbers with +. As soon as one side is text, the result becomes text too.
Note: Only
+works with text. Using-,*,/on text values will give an error.
Write formulas inside a ```listsheet ``` block. Each line follows this pattern:
name = expression
| Formula | What it does |
|---|---|
Sum(ListName) |
Adds all numeric values |
Avg(ListName) |
Average of all values |
Min(ListName) |
Smallest value |
Max(ListName) |
Largest value |
Count(ListName) |
Counts number of items |
First(ListName) |
Value of the first item |
Last(ListName) |
Value of the last item |
Mid(ListName) |
Middle value (or average of two middle items) |
| Formula | What it does |
|---|---|
totalCheck(ListName) |
Counts checked items |
totalUnCheck(ListName) |
Counts unchecked items |
checkItemName(ListName) |
Names of checked items |
unCheckItemName(ListName) |
Names of unchecked items |
| Formula | What it does |
|---|---|
sin(x) |
Sine |
cos(x) |
Cosine |
tan(x) |
Tangent |
log(x) |
Base-10 logarithm |
sqrt(x) |
Square root |
abs(x) |
Absolute value |
ceil(x) |
Round up |
floor(x) |
Round down |
round(x) |
Round to nearest |
LCM(a, b) |
Least common multiple |
GCD(a, b) |
Greatest common divisor |
| Operator | Meaning |
|---|---|
+ |
Add |
- |
Subtract |
* or x |
Multiply |
/ or ÷ |
Divide |
% |
Remainder |
^ |
Power (e.g. 2^4 = 16) |
Access a single child item directly:
result = ListName.ChildName
Example:
MyRent = Expenses.Rent
Use If() to return different values based on a condition.
name = If(condition, valueIfTrue, valueIfFalse)
| Operator | Meaning |
|---|---|
== |
Equal to |
!= |
Not equal to |
< |
Less than |
<= |
Less than or equal |
> |
Greater than |
>= |
Greater than or equal |
| Keyword | Meaning |
|---|---|
and |
Both conditions must be true |
or |
At least one must be true |
not |
Reverses true/false |
Basic If:
Result = If(Score.Marks>= 50, "Pass", "Fail")
With and:
Status = If(Example.Age >= 18 and Score >= 60, "Eligible", "Not eligible")
With or:
Alert = If(Example.Score < 30 or Example.Score > 100, "Invalid", "Valid")
With not:
Check = If(not Score == 0, "Has score", "No score")
Nested If:
Grade = If(Example.Score >= 90, "A", If(Example.Score >= 75, "B", If(Example.Score >= 60, "C", "F")))
Income
Expenses
Shopping
TotalIncome = Sum(Income)
TotalExpense = Sum(Expenses)
ShopSpent = Sum(Shopping)
Balance = TotalIncome - TotalExpense - ShopSpent
Status = If(Balance > 0, "Surplus", "Deficit")
ItemsBought = totalCheck(Shopping)
| Category | Item | Details |
|---|---|---|
| List Types | Bullet | - or * prefix |
| Numbered | 1. or ১. prefix |
|
| Checkbox | - [ ] unchecked / - [x] checked |
|
| Formula Block | Trigger | ```listsheet |
| Syntax | name = expression |
|
| Scope | Sees all lists in the same file | |
| Aggregates | Numeric | Sum, Avg, Min, Max, Mid, First, Last, Count |
| Checkbox | totalCheck, totalUnCheck | |
| Names | checkItemName, unCheckItemName | |
| Math | Basic ops | + - * / ÷ x % ^ |
| Functions | sin, cos, tan, log, sqrt, abs, ceil, floor, round | |
| Special | LCM, GCD | |
| Conditions | Function | If(cond, true, false) |
| Comparisons | == != < <= > >= |
|
| Logic | and or not |
|
| Dot Access | Syntax | ParentName.ChildName |
| Flat List Access | With heading | HeadingName.ItemName |
| No heading | default.ItemName |
|
| Direct by name | Only works if item has nested children | |
| Suffix / Prefix | Format | [prefix] number [suffix] |
| Effect on calc | None — only the number is used | |
| Text in Formulas | Literal | "your text" |
| Concatenate | "label: " + Value or Value + " kg" |
|
| Bengali | Digits | ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ (auto-converted) |
| Currency | ৳ (used as prefix) | |
| Settings | Duplicate keys | Merge (default) or Auto-unique |
| Panel | Open | Ribbon icon or command: Open ListSheet panel |
| Export | { } button copies list data as JSON |
|
| Debug | Toggle | 🐛 button in panel, or debug.true() in DevTools |
Q: Do suffix and prefix cause problems in calculations?
No. ListSheet builds a data object from your lists before doing any math. Each item is broken into separate fields: label, value, prefix, suffix, type, and more. When a formula runs, it only uses the value field — the prefix and suffix are completely ignored in calculations.
So writing ৳ 5000 taka or just 5000 makes no difference to the result.
- ItemA = $ 200 USD ← value used in calc: 200
- ItemB = 300 ← value used in calc: 300
Total = Sum(MyList) ← result: 500 (prefix/suffix ignored)
Q: Can I use a suffix or prefix in a formula result?
No. Formula results display only their computed value. If you want a unit label in the output, add it as a text string:
Result = Sum(MyList) + " USD"
Q: What if my item has no number at all?
Items without a number (labels-only) have a value of null. Aggregate functions like Sum() skip them automatically.
Go to Settings → Community Plugins → ListSheet.
| Setting | Options | Default |
|---|---|---|
| Duplicate section handling | Merge — joins same-name lists |
Merge |
Auto-unique — keeps them separate (adds #2, #3) |
| Command | Action |
|---|---|
Open ListSheet panel |
Opens the side panel |
ListSheet: Enable debug mode |
Turns on verbose console logs |
ListSheet: Disable debug mode |
Turns off console logs |