diff --git a/content/en/sheets/_index.md b/content/en/sheets/_index.md
index d807e5d9249..39d73dc97cc 100644
--- a/content/en/sheets/_index.md
+++ b/content/en/sheets/_index.md
@@ -1,6 +1,6 @@
---
title: Sheets
-description: "Analyze Datadog data in a familiar spreadsheet interface with pivot tables, lookups, calculated columns, and complex analysis tools."
+description: "Analyze Datadog data in a familiar spreadsheet interface with tables, pivot tables, lookups, calculated columns, and flexible spreadsheets."
further_reading:
- link: "/sheets/functions_operators"
tag: "Documentation"
@@ -10,23 +10,23 @@ further_reading:
text: "Explore your data with Sheets, DDSQL Editor, and Notebooks for advanced analysis in Datadog"
---
-{{< callout url="https://www.datadoghq.com/product-preview/flexible-spreadsheets-in-datadog-sheets/">}}
-Create flexible spreadsheets: built to let you start from scratch, build models, track operations, and more.
-{{< /callout >}}
-
## Overview
Sheets is a spreadsheet tool that you can populate with Datadog data, enabling you to perform complex analysis and build reports without requiring technical expertise. It allows teams to use familiar spreadsheet functions like lookups, pivot tables, and calculations on Datadog data, so you don't have to export and use another tool with stale data.
-Sheets lets you manipulate, transform, and analyze data from logs, real user monitoring, and cloud cost monitoring in a familiar spreadsheet interface.
+Sheets lets you manipulate, transform, and analyze data from logs, real user monitoring, and cloud cost monitoring in a familiar spreadsheet interface. It can contain the following tabs:
+
+- **[Table](#table)**: Query live data from a Datadog data source and enrich it with calculated columns, lookups, and filters.
+- **[Pivot](#pivot)**: Summarize and aggregate data from a table with custom dimensions and calculations.
+- **[Sheet](#sheet-preview)** (Preview): A flexible, blank-canvas spreadsheet where you can write formulas referencing data directly from a table to build models, reports, or track operations.
-## Create a table
+## Table
-Start by creating a table of data, either by building a new query from Sheets or transferring a query from the logs explorer, RUM explorer or metrics explorer.
+Start by creating a table of data, either by building a new query from Sheets or transferring a query from explorer pages, like Logs, RUM, Metrics, or Cloud Cost.
### Add a new table in Sheets
-{{< img src="/sheets/create_table.png" alt="Modal to create to create a table from Sheets, showing a Logs query with status:error" style="width:90%;" >}}
+{{< img src="/sheets/create_table.png" alt="Modal to create a table from Sheets, showing a Logs query with status:error" style="width:90%;" >}}
1. On the [Datadog Sheets page][1], click **New Spreadsheet**.
1. Click **Add Data**.
@@ -42,7 +42,7 @@ Start by creating a table of data, either by building a new query from Sheets or
1. You can create a **New Spreadsheet** or add this table of data to an **Existing Spreadsheet**.
1. Click **Save and Open**.
-## Calculated columns
+### Calculated columns
You can use a calculated column to add a formula, parse a log message, extract regex, or add business logic to your data. Your calculated columns can be used in the pivot table you'll create later.
@@ -50,7 +50,7 @@ From the header of the far right column of your table, click the Plus icon to **
{{< img src="/sheets/calculated_columns.png" alt="Added calculated column with the Plus icon, and an example IFS function" style="width:90%;" >}}
-## Lookup
+### Lookup
Lookup enriches your existing data and adds more context to your table. Click **Add Lookup** at the top of the page to add columns from another table or data source, such as [Reference Tables][4], logs, or RUM data. Lookup is like a left join or a vlookup in Excel or Google Sheets; it matches records on a common column, and returns additional columns of data to enrich your existing Sheets table.
@@ -58,9 +58,9 @@ Lookup enriches your existing data and adds more context to your table. Click **
For example, you have a table of RUM data with user emails, and you want to know which teams these users belong to. You can add a lookup that compares the user email column in your table with the work email column in a Reference Table. Lookup pulls the team from the Reference Table and adds it as a new column to your spreadsheet.
-## Pivot table
+## Pivot
-After you add a table of data to a spreadsheet, analyze and add context to your raw data with a Pivot table. Use pivot tables to summarize and organize large amounts of data into customized tables. It helps you analyze data to find patterns and trends, and see comparisons. For example, you can have a table with a hundred rows, but with a pivot table you can break down that data into a summary table that counts your data by method or region. To create a pivot table:
+After you add a table of data to a spreadsheet, analyze and add context to your raw data with a pivot table. Use pivot tables to summarize and organize large amounts of data into customized tables. It helps you analyze data to find patterns and trends, and see comparisons. For example, you can have a table with a hundred rows, but with a pivot table you can break down that data into a summary table that counts your data by method or region. To create a pivot table:
1. From an existing spreadsheet that already has a table of data, click **Add Pivot Table**.
1. In the **Rows** and **Columns** section, select the dimensions you want to analyze, such as the status of logs.
1. In the **Calculations** section, select the dimensions you want to use in calculations, including sum, average, count, min, and max.
@@ -71,6 +71,123 @@ After you add a table of data to a spreadsheet, analyze and add context to your
After you have your pivot table, you can click **Show Graphs** and add up to six widgets to graph your data. Supported widget types include **Top List**, **Treemap**, and **Pie Chart** widgets. Hover over the widget title to delete, duplicate, expand, export, and reposition widgets. To edit a widget, click the pencil icon. Editing options allow you to select the widget type, choose which pivot calculation to graph (if there is more than one), and specify the rows, columns, and the number of groupings graphed per row or column.
+## Sheet (Preview)
+
+{{< callout url="https://www.datadoghq.com/product-preview/flexible-spreadsheets-in-datadog-sheets/">}}
+Create flexible spreadsheets: built to let you start from scratch, build models, track operations, and more.
+{{< /callout >}}
+
+A sheet is a flexible, blank-canvas spreadsheet with a full formula engine. Use it to build financial models, operational trackers, planning templates, or any freeform calculation that doesn't fit a query-based workflow.
+
+To add a sheet, click the **+** tab at the bottom of your spreadsheet and select **Add Sheet**.
+
+{{< img src="/sheets/flexible_spreadsheet.png" alt="A flexible sheet showing a 2025 cloud spend by provider model, with SUMIFS and VLOOKUP formulas referencing Cloud cost and Currency conversion table tabs" style="width:90%;" >}}
+
+### Cell references
+
+Cells are referenced using standard A1 notation, where the column is a letter and the row is a number. For example, `A1` is the first cell, `B3` is the third row of column B, and `A1:C5` is a range spanning columns A through C and rows 1 through 5.
+
+| Reference type | Syntax | Description |
+| -------------- | ------ | ----------- |
+| Relative cell | `A1` | Adjusts when the formula is copied to another cell |
+| Absolute cell | `$A$1` | Always refers to the same cell |
+| Absolute column, relative row | `$A1` | Column stays fixed; row adjusts |
+| Relative column, absolute row | `A$1` | Row stays fixed; column adjusts |
+| Range | `A1:C5` | All cells from A1 to C5 |
+
+### Cross-sheet references
+
+You can reference data from other tabs in the same spreadsheet directly in your formulas. Use the sheet name followed by an exclamation mark and the cell or range:
+
+```
+='My Table'!A1
+='Summary'!B2:B20
+```
+
+To reference a specific column from a **table** tab by name, use `#` notation:
+
+```
+='Error Logs'#"duration_ms"
+='Table 1'#"status"
+```
+
+For example, `=SUM('Error Logs'#"duration_ms")` sums every value in the `duration_ms` column of your Error Logs table.
+
+### Formulas
+
+Sheet formulas support all functions listed on the [Functions and Operators][3] page, plus additional lookup, statistical, financial, and other functions available only in sheets. See the [Sheet functions][21] section for the full list.
+
+#### Examples
+
+**Aggregate a table column in a sheet**
+
+Sum all values in the `duration_ms` column of a table tab called "Error Logs":
+```
+=SUM('Error Logs'#"duration_ms")
+```
+
+Count how many rows in that table have `status = "error"`:
+```
+=COUNTIF('Error Logs'#"status","error")
+```
+
+**Safe lookup with a fallback**
+
+Look up a user's team from a reference table, returning "unknown" if not found:
+```
+=IFNA(VLOOKUP(A2,'User Directory'!A:B,2,0),"unknown")
+```
+
+**Days since an incident**
+
+Calculate how long ago an incident was opened, given a timestamp in A2:
+```
+=DATEDIF(A2,TODAY(),"D")&" days ago"
+```
+
+**p95 latency from a table**
+
+Pull the 95th percentile of response times from a connected table:
+```
+=PERCENTILE('APM Data'#"duration",0.95)
+```
+
+**Classify a value into severity tiers**
+
+```
+=IFS(A2>500,"critical",A2>200,"warn",A2>0,"ok",TRUE,"no data")
+```
+
+**Monthly loan payment**
+
+Calculate the monthly payment on a $50,000 loan at 6% annual interest over 3 years:
+```
+=PMT(0.06/12,36,-50000)
+```
+
+### Error values
+
+| Error | Cause | How to handle |
+| -------------------- | ----- | ------------- |
+| `#DIV/0!` | Division by zero | `=IFERROR(A1/B1,0)` |
+| `#VALUE!` | Wrong argument type, for example text passed to a math function | Check input types |
+| `#NUM!` | Invalid numeric value, for example `SQRT(-1)` | Validate inputs with `IF` |
+| `#N/A` | Value not found, for example a failed `VLOOKUP` | `=IFNA(VLOOKUP(...),"not found")` |
+| `#REF!` | Reference to a cell that no longer exists | Update the formula |
+| `#NAME?` | Unrecognized function name | Check spelling |
+| `#ERROR!` | Formula could not be parsed | Check syntax |
+
+### Cell formatting
+
+Cells can be formatted as plain text, number, percentage, currency (USD or EUR), or datetime. Formatting affects how values are displayed but not the underlying value used in calculations.
+
+### Limits
+
+| Dimension | Default | Maximum |
+| --------- | ------- | ------- |
+| Rows | 1,000 | 2,000 |
+| Columns | 26 | 52 |
+
## Supported data sources
{{< callout url="https://www.datadoghq.com/product-preview/additional-advanced-querying-data-sources/" header="Advanced Data Sources">}}
@@ -145,3 +262,4 @@ You must have edit access to restore general access to a restricted spreadsheet.
[18]: https://app.datadoghq.com/apm/traces
[19]: https://www.datadoghq.com/product-preview/additional-advanced-querying-data-sources/
[20]: https://app.datadoghq.com/product-analytics/events
+[21]: /sheets/functions_operators#sheet-functions
diff --git a/content/en/sheets/functions_operators.md b/content/en/sheets/functions_operators.md
index 29d01bc56a0..14c7facb42c 100644
--- a/content/en/sheets/functions_operators.md
+++ b/content/en/sheets/functions_operators.md
@@ -1,61 +1,169 @@
---
title: Functions and Operators
-description: "Reference guide for functions and operators available in Sheets calculated columns including text, date, logical, mathematical, and regex operations."
+description: "Reference guide for functions and operators available in Sheets calculated columns and sheet formulas, including text, date, logical, math, lookup, statistical, and financial operations."
---
## Overview
-Use functions and operators in your Sheets calculated columns to add additional analysis and context to your data.
+Use functions and operators in Sheets to analyze and transform your data. Functions are available in two contexts:
+
+- **Table calculated columns**: Functions that transform or enrich individual row values in a table, applied at the column level.
+- **Sheets**: Functions entered directly in a [sheet][1] tab, allowing you to reference other sheet or table tabs (when applicable).
## Operators
-| Operator | Name |
-| ------- | --------------------- |
-| `+` | Addition |
-| `-` | Subtraction |
-| `*` | Multiplication |
-| `/` | Division |
-| `%` | Modulo |
-| `^` | Power |
-| `&` | Concatenate |
-| `=` | Equal |
-| `<>` | Not equal |
-| `>` | Greater than |
-| `<` | Less than |
-| `>=` | Greater than or equal |
-| `<=` | Less than or equal |
+| Operator | Name | Example |
+| ------- | --------------------- | ------- |
+| `+` | Addition | `=A1+B1` |
+| `-` | Subtraction | `=A1-B1` |
+| `*` | Multiplication | `=A1*B1` |
+| `/` | Division | `=A1/B1` |
+| `%` | Modulo | `=A1%B1` |
+| `^` | Power | `=2^10` |
+| `&` | Concatenate | `="Hello "&A1` |
+| `=` | Equal | `=A1=B1` |
+| `<>` | Not equal | `=A1<>0` |
+| `>` | Greater than | `=A1>100` |
+| `<` | Less than | `=A1<100` |
+| `>=` | Greater than or equal | `=A1>=100` |
+| `<=` | Less than or equal | `=A1<=100` |
## Functions
-| Label | Description | Example |
-| ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
-| REGEXMATCH(text_string, regular_expression) | Evaluates whether a text string matches a regular expression. | REGEXMATCH("ABC 123 def", "\\\\d+") => TRUE |
-| REGEXEXTRACT(text_string, regular_expression) | Extracts the first substring that matches a specified regex pattern. | REGEXEXTRACT("ABC 123 def", "\\\\d+") => "123" |
-| REGEXCOUNT(text_string, regular_expression) | Counts the number of times a regex pattern appears in a text string. | REGEXCOUNT("abc 123 def", "\\\\d+") => 2 |
-| LEN(string) | Returns the length of a string. | LEN("Hello World") |
-| LOWER(string) | Returns the string in lowercase. | LOWER("HELLO WORLD") |
-| UPPER(string) | Returns the string in uppercase. | UPPER("hello world") |
-| LEFT(string, number_of_characters) | Returns a substring from the beginning of a specified string. | LEFT("Datadog", 4) |
-| RIGHT(string, number_of_characters) | Returns a substring from the end of a specified string. | RIGHT("DATADOG", 3) |
-| CONCATENATE(string1, string2, ...) | Appends strings to one another. Equivalent to the \`&\` operator. | CONCATENATE("data", "dog") |
-| CONTAINS(string, substring) | Returns TRUE if the string contains the substring, FALSE otherwise. | CONTAINS("is the word string in this sentence?", "string") |
-| TEXTJOIN(delimiter, ignore_empty, text1, [text2, ...]) | Combines the text from multiple strings with the specified delimiter. | TEXTJOIN(" ", TRUE, "hello", "world") |
-| DATE(year, month, day) | Converts a provided year, month, and day into a date. | DATE(2021, 10, 31) |
-| DATEDIF(start_date, end_date, unit) | Calculates the number of days, months, or years between two dates. | DATEDIF("10/17/1979", "8/22/2019", "Y") will return 39 |
-| TRUE() | Returns the logical value TRUE. | TRUE() |
-| FALSE() | Returns the logical value FALSE. | FALSE() |
-| IF(logical_expression, value_if_true, value_if_false) | Returns one value if a logical expression is TRUE and another if it is FALSE. | IF(42>9, "all good", "something is wrong in the matrix") |
-| IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2], …) | Evaluates multiple conditions and returns a value that corresponds to the first true condition. | IFS(A1>90, "A", A1>80, "B") |
-| AND(logical_expression1, [logical_expression2, …]) | Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false. | AND(A1=1, A2=2) |
-| OR(logical_expression1, [logical_expression2, …]) | Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false. | OR(A1=1, A2=2) |
-| NOT(logical_expression) | Returns the opposite of a logical value. | NOT(TRUE) |
-| ADD(number1, number2) | Returns the sum of two numbers. Equivalent to the \`+\` operator. | ADD(1, 2) |
-| MINUS(number1, number2) | Returns the difference of two numbers. Equivalent to the \`-\` operator.' | MINUS(1, 2) |
-| MULTIPLY(number1, number2) | Returns the product of two numbers. Equivalent to the \`\*\` operator. | MULTIPLY(1, 2) |
-| DIVIDE(number1, number2) | Returns one number divided by another. Equivalent to the \`/\` operator. | DIVIDE(4, 2) |
-| MOD(number1, number2) | Returns the result of the modulo operator, the remainder after a division operation. | MOD(5, 2) |
-| POWER(number, power) | Returns a number raised to a power. | POWER(2, 3) |
-| ROUND(number, places) | Rounds a number to a certain number of decimal places. | ROUND(826.645, 1) |
-| FLOOR(number, factor) | Rounds a number down to the nearest integer multiple of the specified factor. | FLOOR(826.645, 10) |
-| CEILING(number, factor) | Rounds a number up to the nearest integer multiple of the specified factor. | CEILING(826.645, 10) |
-| ABS(number) | Returns the absolute value of a number. | ABS(26.34) |
+### Text
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| REGEXMATCH(text_string, regular_expression) | Evaluates whether a text string matches a regular expression. | REGEXMATCH("ABC 123 def", "\\\\d+") => TRUE | Table, Sheet |
+| REGEXEXTRACT(text_string, regular_expression) | Extracts the first substring that matches a specified regex pattern. | REGEXEXTRACT("ABC 123 def", "\\\\d+") => "123" | Table, Sheet |
+| REGEXCOUNT(text_string, regular_expression) | Counts the number of times a regex pattern appears in a text string. | REGEXCOUNT("abc 123 def", "\\\\d+") => 2 | Table, Sheet |
+| REGEXREPLACE(text_string, regular_expression, replacement) | Replaces all occurrences of a regex pattern with a specified replacement text. | REGEXREPLACE("ABC 123 hello", "\\\\d+", "XXX") => "ABC XXX hello" | Table |
+| LEN(string) | Returns the length of a string. | LEN("Hello World") | Table, Sheet |
+| LOWER(string) | Returns the string in lowercase. | LOWER("HELLO WORLD") | Table, Sheet |
+| UPPER(string) | Returns the string in uppercase. | UPPER("hello world") | Table, Sheet |
+| LEFT(string, number_of_characters) | Returns a substring from the beginning of a specified string. | LEFT("Datadog", 4) | Table, Sheet |
+| RIGHT(string, number_of_characters) | Returns a substring from the end of a specified string. | RIGHT("DATADOG", 3) | Table, Sheet |
+| MID(text, start, length) | Returns characters from the middle of text. | MID("Hello World", 7, 5) => "World" | Sheet |
+| CONCATENATE(string1, string2, ...) | Appends strings to one another. Equivalent to the `&` operator. | CONCATENATE("data", "dog") | Table, Sheet |
+| CONTAINS(string, substring) | Returns TRUE if the string contains the substring, FALSE otherwise. | CONTAINS("is the word string in this sentence?", "string") | Table, Sheet |
+| SUBSTITUTE(text, old_text, new_text, [instance_num]) | Replaces occurrences of a substring with new text. If instance_num is omitted, all occurrences are replaced. | SUBSTITUTE("Hello world! Hello!", "Hello", "Hi") | Table, Sheet |
+| TEXTJOIN(delimiter, ignore_empty, text1, [text2, ...]) | Combines the text from multiple strings with the specified delimiter. | TEXTJOIN(" ", TRUE, "hello", "world") | Table, Sheet |
+| FIND(search_for, text_to_search) | Finds the position of text within text (case-sensitive). Returns an error if not found. | FIND("World", "Hello World") => 7 | Sheet |
+| CHAR(number) | Converts a number into a character according to the Unicode character set. | CHAR(65) => "A" | Sheet |
+| CLEAN(text) | Removes non-printable characters from text. | CLEAN(A1) | Sheet |
+| TEXT(number, format) | Formats a number as text using a format pattern. Supports number, date, and time formatting. | TEXT(1234.5, "#,##0.00") => "1,234.50" | Sheet |
+| TRIM(text) | Removes leading, trailing, and extra spaces from text. | TRIM(" hello ") => "hello" | Sheet |
+| VALUE(text) | Converts text to a number. | VALUE("123") => 123 | Sheet |
+
+### Logical
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| IF(logical_expression, value_if_true, value_if_false) | Returns one value if a logical expression is TRUE and another if it is FALSE. | IF(42>9, "all good", "something is wrong in the matrix") | Table, Sheet |
+| IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2], …) | Evaluates multiple conditions and returns a value that corresponds to the first true condition. | IFS(A1>90, "A", A1>80, "B") | Table, Sheet |
+| AND(logical_expression1, [logical_expression2, …]) | Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false. | AND(A1=1, A2=2) | Table, Sheet |
+| OR(logical_expression1, [logical_expression2, …]) | Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false. | OR(A1=1, A2=2) | Table, Sheet |
+| NOT(logical_expression) | Returns the opposite of a logical value. | NOT(TRUE) | Table, Sheet |
+| TRUE() | Returns the logical value TRUE. | TRUE() | Table, Sheet |
+| FALSE() | Returns the logical value FALSE. | FALSE() | Table, Sheet |
+| IFERROR(value, value_if_error) | Returns a specified value if a formula evaluates to an error; otherwise returns the result of the formula. | IFERROR(1/0, "Division Error") | Sheet |
+| IFNA(value, value_if_na) | Returns a specified value if a formula evaluates to #N/A; otherwise returns the result of the formula. | IFNA(VLOOKUP("x", A1:B10, 2, FALSE), "Not found") | Sheet |
+| SWITCH(expression, case1, value1, ..., [default]) | Compares expression to cases and returns the corresponding value. | SWITCH(A1, 1, "One", 2, "Two", "Other") | Sheet |
+| XOR(logical_expression1, [logical_expression2, …]) | Returns TRUE if an odd number of arguments are TRUE. | XOR(TRUE, FALSE) | Sheet |
+
+### Math
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| ABS(number) | Returns the absolute value of a number. | ABS(26.34) | Table, Sheet |
+| CEILING(number, factor) | Rounds a number up to the nearest integer multiple of the specified factor. | CEILING(826.645, 10) | Table, Sheet |
+| FLOOR(number, factor) | Rounds a number down to the nearest integer multiple of the specified factor. | FLOOR(826.645, 10) | Table, Sheet |
+| MOD(number1, number2) | Returns the result of the modulo operator, the remainder after a division operation. | MOD(5, 2) | Table, Sheet |
+| POWER(number, power) | Returns a number raised to a power. | POWER(2, 3) | Table, Sheet |
+| ROUND(number, places) | Rounds a number to a certain number of decimal places. | ROUND(826.645, 1) | Table, Sheet |
+| COUNT(value1, [value2, ...]) | Counts the number of numeric values in a range. | COUNT(A1:A10) | Sheet |
+| COUNTA(value1, [value2, ...]) | Counts the number of non-empty values in a range. | COUNTA('Logs'#"service") | Sheet |
+| COUNTBLANK(range) | Counts the number of empty cells in a range. | COUNTBLANK(A1:A10) | Sheet |
+| COUNTIF(range, criteria) | Counts the number of cells in a range that meet a specified criteria. | COUNTIF('Logs'#"status", "error") | Sheet |
+| COUNTIFS(range1, criteria1, [range2, criteria2, ...]) | Counts the number of cells in a range that meet multiple criteria. | COUNTIFS('Logs'#"status", "error", 'Logs'#"env", "prod") | Sheet |
+| COUNTUNIQUE(value1, [value2, ...]) | Counts the number of unique values in a range. | COUNTUNIQUE('Logs'#"service") | Sheet |
+| MAX(value1, [value2, ...]) | Returns the largest number from a set of values. | MAX('APM'#"duration") | Sheet |
+| MAXIFS(max_range, range1, criteria1, ...) | Returns the maximum value in a range that meets multiple criteria. | MAXIFS('APM'#"duration", 'APM'#"env", "prod") | Sheet |
+| MIN(value1, [value2, ...]) | Returns the smallest number from a set of values. | MIN('APM'#"duration") | Sheet |
+| MINIFS(min_range, range1, criteria1, ...) | Returns the minimum value in a range that meets multiple criteria. | MINIFS('APM'#"duration", 'APM'#"env", "prod") | Sheet |
+| PI() | Returns the value of π to 15 digits of precision. | PI() | Sheet |
+| RAND() | Returns a random number between 0 and 1. | RAND() | Sheet |
+| SQRT(number) | Returns the positive square root of a number. | SQRT(16) => 4 | Sheet |
+| SUM(value1, [value2, ...]) | Returns the sum of a series of numbers and/or cells. | SUM('Cloud Cost'#"cost") | Sheet |
+| SUMIF(range, criteria, sum_range) | Adds the values in a range that meet criteria you specify. | SUMIF('Cloud Cost'#"service", "ec2", 'Cloud Cost'#"cost") | Sheet |
+| SUMIFS(sum_range, range1, criteria1, ...) | Adds the values in a range that meet multiple criteria. | SUMIFS('Cloud Cost'#"cost", 'Cloud Cost'#"service", "ec2", 'Cloud Cost'#"env", "prod") | Sheet |
+
+### Date and time
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| DATE(year, month, day) | Converts a provided year, month, and day into a date. | DATE(2021, 10, 31) | Table, Sheet |
+| DATEDIF(start_date, end_date, unit) | Calculates the number of days, months, or years between two dates. | DATEDIF("10/17/1979", "8/22/2019", "Y") will return 39 | Table, Sheet |
+| TODAY() | Returns the current date. | TODAY() | Sheet |
+| NOW() | Returns the current date and time. | NOW() | Sheet |
+| TIME(hour, minute, second) | Converts a provided hour, minute, and second into a time. | TIME(11, 40, 59) | Sheet |
+| YEAR(date) | Extracts the year component from a date value. | YEAR(DATE(2025, 12, 31)) | Sheet |
+| MONTH(date) | Extracts the month component from a date value. | MONTH("2023-07-15") | Sheet |
+| DAY(date) | Extracts the day component from a date value. | DAY(DATE(2023, 12, 25)) | Sheet |
+| HOUR(time) | Extracts the hour component from a time value. | HOUR("14:30:45") | Sheet |
+| MINUTE(time) | Extracts the minute component from a time value. | MINUTE("14:30:45") | Sheet |
+| SECOND(time) | Extracts the second component from a time value. | SECOND("14:30:45") | Sheet |
+| EDATE(start_date, months) | Returns the date that is the indicated number of months before or after a start date. | EDATE("2023-01-15", 6) | Sheet |
+| EOMONTH(start_date, months) | Returns the last day of a month that is a specified number of months before or after a given date. | EOMONTH(DATE(2023, 12, 12), 0) | Sheet |
+| WEEKDAY(date, [type]) | Returns the day of the week as a number. Type 1 (default) = Sun–Sat (1–7), type 2 = Mon–Sun (1–7), type 3 = Mon–Sun (0–6). | WEEKDAY(DATE(2023, 12, 12)) | Sheet |
+| WEEKNUM(date, [type]) | Returns the week number of a specific date within the year. | WEEKNUM("2023-01-15") | Sheet |
+
+### Lookup and reference
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| VLOOKUP(search_key, range, index, [is_sorted]) | Searches for a value in the first column of a range and returns a value in the same row from a specified column. | VLOOKUP("Apple", A1:C10, 2, FALSE) | Sheet |
+| HLOOKUP(search_key, range, index, [is_sorted]) | Searches for a value in the first row of a range and returns a value in the same column from a specified row. | HLOOKUP("Apple", A1:D3, 2, FALSE) | Sheet |
+| INDEX(reference, row, [column]) | Returns the value of an element in a table based on row and column numbers. | INDEX(A1:D3, 2, 3) | Sheet |
+| MATCH(search_key, range, [search_type]) | Returns the relative position of an item in an array that matches a specified value. | MATCH("Apple", A1:A4, 0) | Sheet |
+| CHOOSE(index, value1, value2, ...) | Returns a value from a list based on an index. | CHOOSE(2, "A", "B", "C") | Sheet |
+| ROW([reference]) | Returns the row number of a reference. | ROW(A5) => 5 | Sheet |
+| COLUMN([reference]) | Returns the column number of a reference. | COLUMN(C1) => 3 | Sheet |
+
+### Statistical
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| AVERAGE(value1, [value2, ...]) | Returns the numerical average value in a dataset, ignoring text. | AVERAGE('APM'#"duration") | Sheet |
+| AVERAGEIF(range, criteria, [average_range]) | Returns the average of cells that meet a specified criteria. | AVERAGEIF('APM'#"env", "prod", 'APM'#"duration") | Sheet |
+| AVERAGEIFS(average_range, range1, criteria1, ...) | Returns the average of cells that meet multiple criteria. | AVERAGEIFS('APM'#"duration", 'APM'#"env", "prod", 'APM'#"service", "web") | Sheet |
+| MEDIAN(value1, [value2, ...]) | Returns the median (middle value) of a dataset. If the dataset has an even number of values, returns the average of the two middle values. | MEDIAN('APM'#"duration") | Sheet |
+| MODE(value1, [value2, ...]) | Returns the most frequently occurring value in a dataset. | MODE('Logs'#"status_code") | Sheet |
+| PERCENTILE(data, percentile) | Returns the value at a given percentile of a dataset using linear interpolation. | PERCENTILE('APM'#"duration", 0.95) | Sheet |
+| STDEV(value1, [value2, ...]) | Calculates the standard deviation of a sample dataset. | STDEV('APM'#"duration") | Sheet |
+| VAR(value1, [value2, ...]) | Calculates the sample variance of a dataset. | VAR('APM'#"duration") | Sheet |
+| FORECAST(x, data_y, data_x) | Predicts a future value using existing values and linear regression. | FORECAST(5, {1,2,3,4}, {10,20,30,40}) | Sheet |
+| SUMPRODUCT(array1, [array2, ...]) | Multiplies corresponding elements in arrays and returns the sum of those products. | SUMPRODUCT({1,2,3}, {4,5,6}) => 32 | Sheet |
+
+### Financial
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| PMT(rate, number_of_periods, present_value, [future_value], [end_or_beginning]) | Calculates the payment for a loan based on constant payments and a constant interest rate. | PMT(0.05/12, 60, 20000) | Sheet |
+| PV(rate, number_of_periods, payment_amount, [future_value], [end_or_beginning]) | Calculates the present value of an investment. | PV(0.05/12, 60, -377.42) | Sheet |
+| FV(rate, number_of_periods, payment_amount, [present_value], [end_or_beginning]) | Calculates the future value of an investment based on periodic, constant payments and a constant interest rate. | FV(0.06/12, 240, -500) | Sheet |
+| NPV(discount, cashflow1, [cashflow2, ...]) | Calculates the net present value of an investment based on a discount rate and a series of future cash flows. | NPV(0.10, -50000, 8000, 9200, 10400) | Sheet |
+| IRR(cashflow_amounts, [rate_guess]) | Calculates the internal rate of return for a series of cash flows. | IRR({-50000, 8000, 9200, 10400, 11600, 12800}) | Sheet |
+| NPER(rate, payment_amount, present_value, [future_value], [end_or_beginning]) | Calculates the number of periods for an investment or loan. | NPER(0.05/12, -377.42, 20000) | Sheet |
+| RATE(number_of_periods, payment_amount, present_value, [future_value], [end_or_beginning], [guess]) | Calculates the interest rate per period of an annuity. | RATE(48, -200, 8000) | Sheet |
+| RRI(number_of_periods, present_value, future_value) | Calculates the equivalent interest rate for the growth of an investment. | RRI(10, 100, 200) | Sheet |
+
+### Info
+
+| Function | Description | Example | Available in |
+| ------------ | ------------ | ------------ | ------------ |
+| ISBLANK(value) | Tests whether a cell is blank. | ISBLANK(A1) | Sheet |
+| ISNUMBER(value) | Tests whether a value is a number. | ISNUMBER(123) | Sheet |
+| TYPE(value) | Returns the data type of a value as a number (1 = number, 2 = text, 4 = logical, 16 = error). | TYPE(123) => 1 | Sheet |
+
+[1]: /sheets/#sheet-preview
diff --git a/static/images/sheets/flexible_spreadsheet.png b/static/images/sheets/flexible_spreadsheet.png
new file mode 100644
index 00000000000..0888bc77418
Binary files /dev/null and b/static/images/sheets/flexible_spreadsheet.png differ