# Row Zero Documentation

---

# Overview

The knowledge base for major features of Row Zero spreadsheet workbooks. Explore Row Zero documentation.

Row Zero is the modern spreadsheet for cloud data. Securely connect to your data warehouse, build connected spreadsheets that automatically update, and write back results — all without leaving your spreadsheet. Row Zero's AI Agent makes it easy for anyone to analyze large datasets with natural language prompts, and every output is fully auditable and editable in the spreadsheet. Share workbooks with your team for real-time collaboration, all backed by enterprise-grade security.

[Video: YouTube](https://www.youtube.com/watch?v=Wpo-HITR4IQ)

**Don’t have an account yet?** Create your free account [here](/new?ref=docs) or learn more at [rowzero.com](/?ref=docs).   
  
**Ready to get started?** 

- [Import data](/docs/data-import) from a cloud connection or file. 
- Analyze data with formulas or [pivot tables](/docs/pivot-tables) — or ask the [AI Agent](/docs/ai-assistant) to do it for you. 
- [Share](/docs/sharing) your workbook and collaborate in real time with colleagues. 
- Publish your query as a [data source](/docs/shared-data-sources) to give your team one-click access to live updating data.
- Try our tutorials for [query writers](/docs/query-writer-tutorial) and [spreadsheet users](/docs/datasource-spreadsheet-tutorial) for step-by-step guides.

---

# Tutorial for Query Writers

Learn how to use Row Zero to turn SQL queries into auto-updating, governed data sources that your team can analyze in a high-powered spreadsheet—no SQL required

## About this Tutorial

This tutorial is designed for SQL-proficient builders who need to bridge the gap between a cloud data warehouse and a spreadsheet.

While traditional spreadsheets break under the weight of large datasets, Row Zero enables you to work with massive datasets directly from your source of truth. By the end of this tutorial, you will be able to transform raw SQL queries into governed, auto-updating data sources that your entire team can use.

In this tutorial you will:

1. Import data from a cloud data warehouse into a workbook.
2. Publish a query as a no-code **data source**.
3. Configure **scheduled refreshes** to automatically rerun queries.
4. Implement **query variables** for dynamic filtering during import.

Prerequisites:

- SQL proficiency: You should be comfortable writing and debugging SQL queries.
- Active connection: This guide assumes a connection to a data warehouse (e.g., Snowflake, Databricks, Redshift) has already been configured in Row Zero.

> **Note:** This tutorial does not cover administration or integrations. For those topics, refer to our launch guides and documentation. This tutorial also does not cover spreadsheet features like functions, pivot tables, formatting, or charts. For those topics, refer to our [Tutorial for Spreadsheet Users](/docs/datasource-spreadsheet-tutorial).

## Overview: What Is Row Zero?

Row Zero is a high-performance spreadsheet that connects directly to your data warehouse, combining the flexibility of a spreadsheet with the scale of a database.

## Key Concepts and Navigation

To build effectively in Row Zero, it is important to understand the relationship between workbooks, connections, and data sources.

**Connections** are integrations with external data warehouses, databases, or cloud storage. Connections can be configured to allow import, writeback, or both. Connections handle authentication and permissions.

**Workbooks** are spreadsheets that contain data, formulas, and/or visualizations. Workbooks support a variety of use cases, including modeling, analysis, and dashboards. You can import data from connections into your workbooks by directly querying connections or inserting data from a data source.

**Data sources** are published queries. They are used to manage governed “source of truth” datasets or to give less technical users direct access to live data without writing SQL.

When you log into Row Zero for the first time, your home page will look something like this:

![New User Home Screen](https://cdn.sanity.io/images/2w8agf2t/production/ef52122448e672500c3f757abef129edb89dffec-3024x1624.png)

Use the menu on the left side to navigate to a new section:

- **Home:** Once you've created workbooks (or others have shared them with you) this page will give you quick access to your most recent files.
- **My drive, Shared drives, and Shared with me:** All workbooks you have created or that have been shared with you. See [Folders and organization](/docs/folders-and-organization).
- **Data sources:** The list of published data sources that you have created or that have been shared with you.
- **Connections:** Where you manage your credentials and integrations for external data warehouses.

## Create a Workbook and Import Data

In this section, you’ll create your first workbook and import data from a connection.

### Create a Workbook

To create a new workbook, click **Blank workbook** from your home page. 

Give your workbook a name by clicking **Untitled Workbook** at the top. Let’s name this workbook “Query Writer Tutorial”.

### Import Data into a Connected Table

Row Zero supports several methods for importing data, but this tutorial will focus on importing from a connection (e.g. Snowflake, Databricks, Redshift).

To insert a connected table from a connection:

1. Go to **Insert** &gt; **Connected table**, then choose **From a connection**.
2. On the **Connections** tab, select a connection.
3. Depending on what database or warehouse you use, you will need to choose a data store (e.g. Database, Schema, Catalog, etc.).
4. Build your query in the query builder or the SQL editor.
    1. Query builder: In this mode, you can select columns from a single table, view, or semantic view. To select all columns in the table with a single click, drag the table name into the “Fields” section.
    2. SQL editor: In this mode, you can write custom SQL from multiple tables, views, or semantic views.
5. Click **Run query**.

The results from your query will be imported into a **connected table**. You can navigate back to this side pane anytime by clicking the **Table details** button below the table.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/b077d75712d93e58497ef88050192eb70b83b02c.mov)

A **Connected Table** is a type of data table. Data tables sit on top of your worksheet and are stored in the upper-left cell that they cover. Connected tables include all the data from the imported dataset, and because these datasets are often millions of rows, they usually will have a scroll bar on the right side of the table. These tables are read-only, so data within the table cannot be overwritten, but you can refresh the data in your Connected Table by rerunning your query (click **Run**). More information on working with data tables can be found in the [Tutorial for Spreadsheet Users](/docs/datasource-spreadsheet-tutorial).

## Schedule an Automated Refresh

To ensure your workbook always has the latest data, schedule an automated refresh. 

Select the Schedule tab in the **Configure connected table** side pane, turn on **Query schedule**, and choose a schedule.

Your schedule will appear in the side pane header.

![Refresh](https://cdn.sanity.io/images/2w8agf2t/production/addc46bf9c51f589669a92a23bc5f66617f7754f-3024x1724.png)

Anytime the query backing your connected table is run, the table refreshes with the latest query results, and everything downstream (pivot tables, charts, formulas, etc.) updates automatically. Learn more about using pivot tables, charts, and formulas in the [Tutorial for Spreadsheet Users](/docs/datasource-spreadsheet-tutorial).

## Publish Your Data Source

In this section, you’ll publish your query as a reusable data source. [Data sources](/docs/shared-data-sources) provide an easy, no-code way to give other users access to data, ensuring everyone works from the same source of truth.

### Create a Data Source

Open the **Configure connected table** side pane for the connected table you created in the previous step. Click **Publish** in the top right corner.

> **Note:** If you have not yet run the query or if your query has changed since it was last run, you will need to run it before you are able to publish it.

A new dialog box will open, and take you through the publish workflow.

1. Select **Create new source**.
2. Review your query details and click **Continue**.
3. Give your data source a name and description, and click **Continue**.
4. Review the Connection details and click **Create data source.**

   ![Refresh](https://cdn.sanity.io/images/2w8agf2t/production/89d5fd66052a1a924a4595eb12fa923e9c4e04b5-1600x1281.png)

### Share a Data Source

Once you have created your data source, you’ll be prompted to share it with other users. You can share with individual users or groups by entering their email addresses in the **Share** dialog.

![share data source](https://cdn.sanity.io/images/2w8agf2t/production/e6d5629cc275e393bc2cbc69e2e93b4c07ddf1c1-3024x1724.png)

### Use a Data Source

The data source will be available to you (and to all users you share it with) from any workbook and from the Home screen. 

**From any workbook:** 

    1. Go to **Insert** &gt; **Connected table**.
    2. On the **Data sources** tab, scroll or search for the data source you want. Search matches names, descriptions, and column names.
    3. Select a data source to view the description and column names in the panel on the right.
    4. Click **Insert into workbook**.
    5. In the **Insert data source** dialog, set the **Destination**, optionally update query variables (if any), filters, and column selection.
    6. Click **Insert data source**.

       [Video](https://cdn.sanity.io/files/2w8agf2t/production/c64d2f3465b777f557991709f3601bc532e5ea8d.mov)

**From the Home screen:** 

You can access all of your data sources by clicking **Data sources** in the left sidebar menu. From the Data sources page, find your data source, and then click **New workbook**. From here, data source owners can also modify sharing settings, change the connection, edit the name and description, and review query details.

![Import data source from home page](https://cdn.sanity.io/images/2w8agf2t/production/e61dd9df85256c253aa44281601632b79e9cf803-3024x1724.png)

The data source will open in a new connected table. Using data sources is covered in more detail in the [Tutorial for Spreadsheet Users](/docs/datasource-spreadsheet-tutorial).

## Modify a Data Source and Add Query Variables

One benefit of using data sources is that any updates you publish automatically propagate to workbooks using that data source, ensuring everyone works from the same source of truth. In this section, we'll modify your existing data source and add query variables to enable users to filter data during import.

### Update Your Data Source

You can update your data source from any workbook. For simplicity, we’ll reuse the connected table you used to create your data source above.

1. Reopen the workbook (titled “Query Writer Tutorial”) you created above.
2. Open the **Configure connected table** side pane for your Connected Table.
3. Modify your SQL query. For this tutorial, this can be a minor update – simple tests like adding or removing columns or limiting rows are good options. Click **Run query**.
4. When your query completes, click **Publish** in the top right corner.
5. Select **Update existing source**. Choose the name of the data source you want to modify, review the changes, and click **Update data source**.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/6a27410d35fb03c6907aa6f801e642b2b1f64999.mov)

### Add Query Variables

When creating a data source, you can optionally create query variables to enable users to filter data when importing to their sheet. This is useful in cases where your datasets are very large or very wide.

To add a query variable to your existing data source, you’ll again modify the query in the Connected Table you published above.

1. Open the **Configure connected table** side pane for your connected table and click **Create variable**.
2. Name your variable, select your variable type (text, dates, numbers, or user emails), optionally assign a default value, and click **Create**.
3. Update your SQL query and assign the query variable using a `WHERE` clause and double braces `{{ }}`. For example, if your variable is named `date`, you could add this code to your query to filter to all results after the variable date:  
`WHERE FL_DATE >= '{{date}}'`.
4. Click **Run query**.
5. Publish an update to your data source by following the instructions [above](#update-your-data-source). You can test your data source by opening it in your existing workbook or a new one.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/5325a74a366213454ef528e980c063de7fb12fd1.mov)

## Next Steps

Congratulations! You have successfully completed the Row Zero tutorial for query writers. You are now equipped to:

- **Import Data**: Connect directly to your data warehouse and import massive datasets into a Row Zero workbook.
- **Govern and Share**: Publish your self-service data sources, establishing a single source of truth for your entire organization.
- **Optimize Performance**: Utilize query variables to allow end-users to filter data during import, ensuring all downstream reports and workbooks remain fast and performant.

As you continue building data sources, consider how your users will access the data and what datasets will be most useful. Selecting the right connection type ensures proper permissions and security, while following best practices keeps your data sources performant, reusable, and reliable.

### Designing Effective Data Sources

**Choosing the Right Connection:**  
Data sources can be backed by either OAuth connections or service account connections. Your end user will not be able to change the connection associated with the data source, so it’s important that you select the correct one when writing your query:

- **OAuth connections:** If you create a data source using an OAuth connection, any user you share it with will use their own credentials to run the data source. This is a good choice if your users have individual data warehouse accounts or if your organization enforces row-level security (RLS)
- **Service account connections:** If your intended data source users do _not_ have their own accounts to your data warehouse, you should use a connection backed by a service account. If you create a data source using a service account connection, the data source will always be run using the service account credentials.

**Data Source Design:** To balance flexibility with control, design your data sources around two types of use cases:

- **Core entities (unaggregated data):** Create a data source for each foundational table or entity — for example, “Orders,” “Customers,” or “Contracts.” These give non-technical users direct, governed access to granular data. Users can then join, filter, and summarize that data using standard spreadsheet operations. For very large datasets, add query filters (e.g., date range or key variables) to keep results performant.
- **Common queries or reports:** Build data sources for frequently used metrics or business reports. This establishes a consistent, auditable “source of truth” and eliminates duplicated SQL or manual extracts.

### Further Exploration

Check out the rest of our documentation site for information about specific features or learn more about spreadsheet features with our [Tutorial for Spreadsheet Users](/docs/datasource-spreadsheet-tutorial).

---

# Tutorial for Spreadsheet Users

Learn how to connect Row Zero to your data warehouse, analyze 100M+ rows with pivot tables, and share automated reports with your team.

## About This Tutorial

This tutorial is designed for business and enterprise users who will use Row Zero’s spreadsheet capabilities to analyze data and share insights. By the end of this tutorial, you will build an automatically refreshing spreadsheet with pivot tables and charts and then share it with others in your workspace.

In this tutorial, you will:

1. Import data from a shared **data source** into a workbook and configure a **scheduled refresh** to automatically refresh your data.
2. Create a **pivot table** and a **chart** to analyze your data.
3. **Share** your workbook with other users.

Prerequisites:

- Spreadsheet proficiency: You will get the most out of this tutorial if you have some familiarity with spreadsheets, including basic knowledge of functions, pivot tables, and charts.
- Shared data source: This guide assumes you have already created a data source or someone in your organization has shared one with you. If not, refer to our [Tutorial for Query Writers](/docs/query-writer-tutorial) to publish a data source first.

> Note: This tutorial does not cover administration or integrations. For those topics, refer to our launch guides and documentation. This tutorial also does not cover writing queries or publishing data sources. For those topics, refer to our [Tutorial for Query Writers](/docs/query-writer-tutorial).

## Overview: What Is Row Zero?

Row Zero is a high-performance spreadsheet built for big data. While traditional spreadsheets struggle with large files, Row Zero enables you to analyze 10 million, 100 million, or even billion row datasets. It connects directly to your data warehouse, enabling you to access real-time datasets from the familiar interface of a spreadsheet.

## Key Concepts and Navigation

To build effectively in Row Zero, it is important to understand two key concepts: workbooks and data sources.

**Workbooks** are spreadsheets that contain data, formulas, and/or visualizations. Workbooks support a variety of use cases, including modeling, analysis, and dashboards. You can import data from connections into your workbooks by directly querying connections or inserting data from a data source.

**Data sources** are published queries. They are used to manage governed “source of truth” datasets or to give less technical users direct access to live data without writing SQL.

When you log into Row Zero, your home page will look something like this:

![New User Home Screen](https://cdn.sanity.io/images/2w8agf2t/production/ef52122448e672500c3f757abef129edb89dffec-3024x1624.png)

Use the menu on the left side to navigate to a new section:

- **Home**: Once you've created workbooks or data sources (or others have shared them with you) this page will give you quick access to your most recent files.
- **My drive, Shared drives, and Shared with me:** All workbooks you have created or that have been shared with you. See [Folders and organization](/docs/folders-and-organization).
- **Data sources**: The list of published data sources that you have created or that have been shared with you.
- **Connections**: Where you manage your credentials and integrations for external data warehouses.

## Create a Workbook

In this section, you’ll create your first workbook.

1. To create a new workbook, click **Blank workbook** from your home page.
2. Give your workbook a name by clicking **Untitled Workbook** at the top. Let’s name this workbook “Spreadsheet User Tutorial”.

### Toolbar

If you’ve used a spreadsheet before, the UI should look familiar. On the toolbar, you’ll find zoom, [formatting options](/docs/formatting), as well as shortcuts to create [pivot tables](/docs/pivot-tables), [charts](/docs/charts), [filters](/docs/filter-sort), and [conditional formatting](/docs/formatting#conditional-formatting).

You can navigate back to the home page any time by clicking the Row Zero icon in the top left corner.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/c3f61af17592268811278e1a33218633bf6e2af4.mp4)

### Functions

Row Zero supports over 350 Excel and Google Sheets-compatible [functions](/docs/spreadsheet-functions). Type a function into a cell to view a detailed description of its arguments and results. Additional function documenation and examples are in our [documentation](/docs/spreadsheet-functions). You can also create custom functions using the [Python code window](/docs/code-window).

## Import Data From a Data Source

Row Zero supports several methods for importing data including uploading a file, querying a connection (e.g. Snowflake, Databricks, etc.), and inserting a data source. In this tutorial, you’ll import data from a data source published by your team.

[Data sources](/docs/shared-data-sources) are reusable, published queries. They are an easy way for your data team to give other users no-code access to live data.

> **Note:** If your data team has not yet created or shared data sources, you can direct them to our [Tutorial for Query Writers](/docs/query-writer-tutorial).

### Import Data

To insert a data source into your workbook:

1. Go to **Insert** &gt; **Connected table**.
2. On the **Data sources** tab, scroll or search for the data source you want. Search matches names, descriptions, and column names.
3. Select a data source to view the description and column names in the panel on the right.
4. Click **Insert into workbook**.
5. In the **Insert data source** dialog, set the **Destination**, optionally update query variables (if any), filters, and column selection. These options are useful when the full data set is very large and you only need a subset.
6. Click **Insert data source**. The data source will import in a new connected table.
7. Select the **Settings** tab in the **Configure connected table** side pane. Select **Data table** as the **Table mode**.

Row Zero imports the data source into a **connected table**. This tutorial uses a connected table in **Data table** mode, which floats on top of the sheet grid. To learn about Standard mode, see [Choosing a table mode](/docs/data-import#choosing-a-table-mode).

Connected tables include all the data from the imported dataset and are rooted in their top left cell. In data table mode, they have a fixed height and a scroll bar on the right side of the table to view data. 

You can navigate back to this side pane anytime by clicking **Table details** below the table, or by right clicking the connected table and selecting **Edit connected table**.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/c64d2f3465b777f557991709f3601bc532e5ea8d.mov)

### Refresh Data

You can refresh the data in your table any time or schedule an automated refresh to ensure your workbook is always current.

**Manual Refresh:** import the latest data immediately

1. Open the **Configure connected table** side pane by double clicking your connected table.
2. Click **Run query**.

**Scheduled Refresh:** for recurring reports or analyses where you want to automatically refresh your data at the same time each day

1. Open the **Configure connected table** side pane by double clicking your connected table.
2. Select the **Schedule** tab.
3. Turn on **Query schedule** and select a schedule.

Your schedule will appear in the side pane header.

![schedule refresh for connected table](https://cdn.sanity.io/images/2w8agf2t/production/2f658d65678a91a02303bdedff4edaa6884c9873-3024x1724.png)

From here, you can [add calculated columns](/docs/data-tables#add-new-columns-or-computed-columns) to your table, and build [pivot tables](/docs/pivot-tables) or [charts](/docs/charts) to summarize your data. Whenever the query backing your connected table is run, the table refreshes with the latest query results and everything downstream of the connected table (pivot tables, charts, formulas, etc.) updates automatically.

## Transform and interact with connected tables

Next, we will practice the most common data table operations.

### Scroll, move, and resize data tables

1. **Scroll:** Click inside a data table to scroll with your mouse, arrow keys, or the scroll bar on the right side of the table. Use Ctrl + arrow up to navigate to the top and Ctrl + arrow down to navigate to the bottom of the data table.
2. **Click and drag:** Data tables can be moved within a sheet by clicking on the left, right, and top borders of the table and dragging to a new location. The hand icon will display when the mouse is hovering over a border that can be moved.
3. **Resize:** Data tables default to 15 rows and can be expanded or contracted by dragging the bottom border of the data table to the desired size.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/c675ed4a8fd939a970dc641583a5142c15c2c6ab.mp4)

### Hide and reorder columns

1. Right-click on the data table and select **Manage columns**.
2. Click and drag column names to reorder columns.
3. Select or deselect column names to show or hide columns.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/d4558c0a9075ac04697b7feb522c980a0e837ab5.mp4)

### Add computed columns

Next, we'll add a computed column to the connected table. Computed columns are columns whose values are calculated using a formula rather than coming directly from the data source. These columns automatically recalculate when your data source is refreshed.

Common use cases for computed columns include:

- Deriving metrics (For example, in the case below we derive a metric `{DELAY}` from the formula `{ACTUAL_DEPARTURE} - {SCHEDULED_ARRIVAL}`.)
- Normalizing or transforming raw data
- Combining data from multiple sources into a single table (For example, you could use an `XLOOKUP` to add a column from one data source to another.)

To add a computed column:

1. Select any cell in the column immediately to the right of your connected table.
2. Enter a formula. Reference columns in your formula using the `{}` header notation (e.g., `=SUM({Header1}, {Header 2})`).
3. Press Enter. Row Zero will instantly fill the formula to the bottom of the connected table.
4. Rename the column by editing the header cell.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/a39fc09e131a7ee37cdc4e1e6bda014731c6adf6.mp4)

### Perform calculations on full columns

In some cases, you may want to perform calculations on full columns in a connected table, rather than just a single row like you did with [computed columns](#add-computed-columns). To operate on a full column -- for example, in the case of a `SUM`, `SUMIF`, or `COUNTA`  you'll use full column notation.

To execute a function on a full column, type your function in the desired cell and select the column of interest in the connected table by clicking on it or arrowing over to select it. You will see the name of the column autofill in your function using the `[]` notation (e.g. `=COUNTA(A1["Header 1"])`). Here, the cell reference (`A1`) indicates where the cpmmected table is stored, and the text inside the square brackets, `[""]` indicates the column.

> **Note:** Row Zero cell and table references **ignore** filters. If you'd like your formula to respect filters in your connected table, you should use the `~` notation. In the example above, if you _only_ wanted to count visible values in the connected table, the correct formula would be `=COUNTA(~A1["Header 1"])`.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/f8cbd32375d744003f96e7517750346dab6622d7.mp4)

### Explode table

The data inside a connected table cannot be edited. It can be transformed by creating calculated columns or using filter and sort features, as described above. If you want to edit the data, you will need to “Explode” your table to cells where you can fully edit and delete data. The data table will be pasted into the underlying cells of the spreadsheet.

To explode a table:

1. Right click on the connected table.
2. Select **Explode table**.
3. **Important:** For this tutorial, we want to keep your connected table intact. To un-explode your data, undo your last action by hitting **Ctrl+Z** /   **⌘+Z** or selecting **Undo** from the **Edit** menu.

> **⚠️ Warning:** When you explode a table, your data source connection will break and your exploded data will not refresh. We recommend only exploding tables when you're doing a one-time analysis or when you need to overwrite imported data.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/83c34f761a75df551a0663a3a7175169f04aa4c2.mp4)

## Pivots and Charts

In this section, you’ll analyze your data using pivot tables and charts. _If you haven’t already, undo your explode table action to restore your_ connected _table._

### Insert a Pivot Table

Pivot tables make it easy to summarize, analyze, and explore large datasets.

To insert a pivot table:

1. Right-click on a cell in your connected table and select **Pivot**.
2. Select your pivot table destination. You can insert into a new sheet or a specific cell on an existing sheet.
3. An empty pivot table will be created. Drag fields to Rows, Columns, Values, and Filters.
4. To edit a pivot table, double-click on the pivot table to re-open the **Configure pivot table** window.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/6e7324ae217c49121a6ff6879bd73224a6c8113d.mp4)

Notes on Pivot Tables:

- Row Zero pivot tables are dynamic. They automatically update any time you edit, refresh, or filter source data.
- Pivot tables also have a data table mode. In data table mode, you can add computed columns, just like you did with your connected table [above](#add-computed-columns).

Learn more about specific pivot table features [here](/docs/pivot-tables).

### Insert a Chart

In Row Zero, you can build charts from cell ranges, connected tables, and pivot tables. Follow the instructions below to create a chart from the pivot table you created above.

To create a chart:

1. Select any cell in your pivot table and then click the chart button in the header or select **Chart** from the **Insert** menu at the top of your screen.
2. Select your chart **Type**.
3. Select your **X-axis** and **series**.

If desired, you can also chart values on multiple axes, change formatting, add labels, and more. Read more [here](/docs/charts).

[Video](https://cdn.sanity.io/files/2w8agf2t/production/3893488c053341c469ab776130337c710864a156.mp4)

## Sharing

Row Zero supports 3 different sharing roles (Owners, Editors and Viewers), which can be assigned to any user when a workbook is shared with them. You can read more about our roles [here](/docs/sharing).

To share your workbook:

1. Click **Share** at the top right.
2. Enter the email addresses for the users or groups you’d like to share your workbook with and select the role you’d like to assign them (viewer or editor).
3. Click **Confirm**.

You can also set advanced sharing options by clicking the gear icon in the Share window.

1. **Who can share:** By default, only Owners can share or change permissions. Owners can delegate sharing to editors, if desired.
2. **Who can create copies:** By default, all users can create copies of workbooks. Owners can restrict copies to just editors or just the owner, if desired.

## Next Steps

Congratulations! You have successfully completed the Row Zero tutorial for spreadsheet users. You are now equipped to:

- **Import Data**: Access live datasets from published data sources and bring them into your workbook.
- **Automate Reporting**: Configure scheduled refreshes to ensure your connected tables, pivot tables, and charts always reflect the latest information.
- **Analyze and Visualize**: Use pivot tables, charts, and calculated columns to explore and summarize your data.
- **Collaborate**: Securely share your workbook with others, assigning appropriate roles to enable viewing or editing.

### Designing Effective Workbooks

As you continue building in Row Zero, consider how to structure your workbooks to maintain performance and clarity. Here are some tips to get you started:

- **Organize with Tabs**: For larger projects, use a clear sheet structure. A common best practice is to have one tab for raw data, one tab for calculations or pivots, and a final tab for your dashboard or charts. This keeps your presentation clean and prevents accidental changes to your data connection.
- **Combine Multiple Data Sources:** A single workbook can include multiple data sources. Your data team may publish separate data sources for core entities (e.g. “Customers” or “Contracts”). You can combine these by referencing one connected table from another—for example, by using calculated columns with lookup functions. This is an easy way to join related data without writing SQL. Watch a demo [here](https://youtu.be/MUMwue9oZIc?si=Vdj7cRd0fBfDc2_6). 
- **Keep Connected Tables Intact**: Avoid exploding tables unless you need to manually edit data, as exploding breaks the connection and disables refresh.
- **Use Slicers for Centralized Control**: If you have multiple charts or pivot tables based on the same data, use [slicers](/docs/slicers) instead of standard filters. Slicers are portable buttons that allow you to filter all your visualizations at once, making your workbook much easier for others to navigate.

### Further Exploration

Check out the rest of our documentation site for information about additional spreadsheet features such as [data validation](/docs/data-validation), [conditional formatting](/docs/formatting#conditional-formatting), and [slicers](/docs/slicers).

If you’d like to learn how to query your data warehouse directly or build your own data sources, try our [Tutorial for Query Writers](/docs/query-writer-tutorial).

---

# AI Agent

Use Row Zero's AI Agent to build spreadsheets and analyze data.

Row Zero’s AI agent can read and analyze your data, create formulas and pivot tables, generate visualizations, and perform complex calculations, all within your workbook. AI-produced analysis is fully auditable and editable, so you can easily investigate the underlying data and tweak the analysis. Additionally, if you use Databricks or Snowflake, Row Zero can connect to Genie and Cortex Analyst to generate a query. 

## Before you start

Enterprise accounts use a “bring-your-own-key” approach, which allows your organization to retain control over access to the inference provider. The AI runs in your already-vetted cloud services. To use AI in Row Zero, Enterprise customers must configure their AI provider first. See [AI](/docs/ai) admin documentation to learn how.

All other tiers use the Row Zero AI provider. 

## Spreadsheet tools

[Video](https://cdn.sanity.io/files/2w8agf2t/production/b80d8ae7f367458346e4de86b15a47823fe01043.mp4)

To start using Row Zero’s AI agent, click the **AI Agent** button on the right side of your tool bar.  

If your organization has enabled multiple models, you can choose your desired model in the AI Agent window. This option is only available to enterprise customers.

Next, write your first prompt. Row Zero’s AI agent can import data sources, write formulas, create pivot tables and charts, and summarize results. For example, try: 

- "Import my data source.”
- "Summarize the trends in this dataset"
- "Create a chart showing sales by month"
- "Add a column that calculates profit margin"

Because Row Zero’s AI agent works with tools in the Row Zero workbook, auditing or revising outputs is simple. You can continue to prompt the AI to take actions in your workbook or pick up where it left off or both. 

## Threads

AI Agent conversations are saved as threads that you can leave and come back to.

- Each workbook can have multiple threads, so separate requests stay separate.
- Threads are saved with the workbook, so you can leave and continue a conversation later. Copy a link to any thread to jump back to it.
- Long threads are compacted automatically to stay within the model's context limit.
- The AI Agent keeps working after you close the workbook, so long runs finish without you.

  ![AI agent in a Row Zero workbook](https://cdn.sanity.io/images/2w8agf2t/production/ab008ff5579eb535f6cf3f4b7e8a16f4f105884b-1126x1570.png)

## AI-generated queries

AI-generated queries let Row Zero users ask questions about connected warehouse data in plain language and turn those questions into SQL. Row Zero uses the semantic layer configured in your data platform to generate the query, then brings the result back into Row Zero as a connected table that users can refresh, audit, edit, and build on with formulas, pivot tables, charts, and other spreadsheet workflows.

This is useful when business users know the question they want to answer but do not know the exact schema, join paths, metric definitions, or SQL syntax. Instead of starting from a blank query editor, users can ask a question like "What were total bookings by region last quarter?" and use the generated SQL as a starting point for analysis.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/ecfc35858a0c6944e320908137a6b51e2e5a787d.mp4)

### Available Providers

| Provider | Connection Type | Semantic Context |
| --- | --- | --- |
| Databricks Genie | Databricks | Databricks Genie Spaces |
| Snowflake Cortex Analyst | Snowflake | Snowflake Semantic Views |

**Databricks Genie** is available for Databricks connections and uses Databricks Genie Spaces to understand the data, instructions, and examples for a business domain. Learn how to configure Databricks Genie for Row Zero [here](/docs/databricks#enable-databricks-genie).

**Snowflake Cortex Analyst** is available for Snowflake connections and uses Snowflake semantic views to understand business concepts, metrics, and relationships. Learn how to configure Snowflake Cortex Analyst for Row Zero [here](/docs/snowflake#enable-cortex-analyst). 

> **Note**: Enterprise customers must [configure a Row Zero AI Agent provider](/docs/ai), in addition to the warehouse setup linked above.

---

# Charts and graphs in Row Zero

Row Zero makes it easy to chart big data sets, build dynamic charts, and create pivot charts from pivot tables. Graph big data fast in a spreadsheet.

Row Zero makes it easy to chart big data sets in a spreadsheet. Charts dynamically update as source data changes. You can build charts from cell ranges and connected tables, and also create pivot charts from pivot tables. The documentation below shows how to create and work with various chart types in Row Zero.

## Creating a chart

Select the data you wish to chart and click on the chart button in the toolbar or select **Chart** in the **Insert** menu.

![create chart in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/7eac84e156422fe6eb9b43f987e52300dba7823c-1911x476.png)

A chart is automatically created based on the range selected. You can configure your chart in the window on the right.

![create chart from big data set](https://cdn.sanity.io/images/2w8agf2t/production/cda9559378817dd25ae2e14387e819e6a401a527-1909x846.png)

## Configuring your chart

Use the chart window to configure your chart with the following options:

- **Type**: Chart types include bar, line, scatter, and histogram
- **Data**: Set the X-axis and add, remove, or [configure series](#configuring-a-series)
- **Labels**: Set labels for Title, X-axis, and Y-axis
- **Vertical Axis**: Set min and max values or select logarithmic.
- **Legend**: Toggle legend on/off and change its position

## Configuring a series

To configure a series, click the 3 dots in the series to open the series window.

![edit series in chart in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/b729a05de8cc52871cd1cdfbafc756e2f9697147-767x265.png)

For bar, line, and scatter plots, each series in a chart can be configured with the following options:

- Axis side (left or right)
- Series type
    - Bar
    - Line, with options for line style, line width, marker size, and marker shape
    - Scatter, with options for marker size and shape

      ![configure series in chart in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/ba249226b236eed31090c4cb9c3b2b13fdeb1e47-507x617.png)

You can also create a mixed chart that has different series types in the same chart. For example, you can have a bar and line series on the same chart. You can also put a series on the left axis and a series on the right axis in the same chart. This is useful when your series have very different scales but you want to represent them in the same view.

![example mixed chart in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/dc489aa800323ace88418884bcb31f4d4bd33b2e-1187x610.png)

### Edit series color

Each series is given a color by default. To manually change the color of a series, click on the color square next to it.

![change color of chart series in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/0d33ee4f48220ae979b800e4045350708bb325bc-661x386.png)

Set the color palette across all series in the chart by clicking the 'Colors' icon below all series. This includes color-blind friendly chart options.

![change chart color palette in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/e816197883359f3c24e7ce8a4abe51e245148b03-577x648.png)

## Creating a histogram

When you choose the Histogram chart type, you can set the strategy to bucket size, bucket count, or custom.

- **Bucket Size**: Set the size of each bucket and the data will be grouped into as many buckets of that size that are needed to include all values.
- **Bucket count**: Set the number of buckets to include and the data will be grouped into that many buckets of the same size so that all values are included in a bucket.
- **Custom**: Manually set the upper bounds of each bucket using a range in your sheet. This makes it possible to create a histogram with buckets of different sizes.

Histograms display the upper bounds of each bucket on the x-axis and the count in each bucket on the y-axis.

![histogram of big data set in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/5da51d0191b3f076c0f2b33f72280917d42ddef0-1913x718.png)

## Connected charts

Create connected charts that automatically update with new data as your source data updates. Row Zero has built-in connections to [Snowflake](/docs/snowflake), [Databricks](/docs/databricks), [Redshift](/docs/redshift), [BigQuery](/docs/bigquery), and [Postgres](/docs/postgres). When you connect to a data source, queried data is imported to a [connected table](/docs/data-tables#connected-tables), which you can use as source data for your charts. When you re-run your query or schedule auto-refresh, your charts update in sync with your connected table.

![connected chart that auto-updates](https://cdn.sanity.io/images/2w8agf2t/production/1d3aad2a1d63f211bb9ec0e4737f81a4ff55a4c1-1910x937.png)

  
Learn more about [how to create connected spreadsheets](/blog/how-to-build-a-connected-spreadsheet-that-auto-updates).

## Pivot charts

Create a chart from [pivot table](/docs/pivot-tables) data to make a pivot chart. Simply select a cell in each of the pivot table columns you want to include in your chart and select **Chart** from the **Insert** menu. Note that charts created from pivot tables in data table mode use entire columns as source data. Pivot charts dynamically update with your pivot table as you edit, filter, and sort your pivot table and as your pivot table's source data is updated.

You can add calculated columns to your pivot table and include them as series in your pivot chart. You can also [group dates in pivot tables](/blog/pivot-table-group-by-date) to make it easy to chart by month, week, day, etc.

![example pivot chart in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/520a0a4939b0349f217826bd1cb733201d5d74c5-1908x929.png)

  
Learn more about [how to create dynamic pivot charts](/blog/create-dynamic-pivot-charts-from-pivot-tables).

## Chart rows as series

When charting data from a range, you can chart rows as series by selecting this option in the chart editor.

![chart rows as series in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/c1a04b5451faefdfd185cf6de3e453d44ee835ea-1909x864.png)

This is useful for charting data that is organized with dates in columns and series in rows and is used to switch rows and columns in the chart configuration. 

## Chart columns as series

When charting data in a data table (pivot tables, connected tables, etc.), you have the option to select 'Chart columns as series'.

![chart columns as series automatically in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/6b5632383ee14340d0268055d4f2fb161d0f179b-614x254.png)

When selected, this automatically charts every column in the table as a series and automatically includes any new columns that are added as your data updates. By default, the first column is set as the X-axis, but you can change the X-axis to be any column in the table. Note that the "Chart columns as series" feature requires every column to be included as a series (or chosen as the X-axis). If you remove a series manually, the "Chart columns as series" option is unselected and new columns will not dynamically be added.

## Tips for working with charts in Row Zero

1. Charts dynamically update with their source data. You can filter, sort, and format source data to easily filter and re-arrange your chart. As source data is refreshed with new data, connected charts will automaticallly update with the new data as well.
2. You generally want to organize your series in columns instead of rows. For example, to chart data over time, have a column for your date/time groupings (e.g. months), with rows for each date/time grouping and columns for each series.

   ![series in columns in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/27387014445e4ef114d10d5cda14644c3e4039c3-895x280.png)

3. If you need to switch data from rows to columns, you can transpose your data by selecting and copying it, and then right-clicking, 'Paste special', 'Paste values (transposed)'.  

   ![switch rows to columns with paste transpose](https://cdn.sanity.io/images/2w8agf2t/production/1e2f84a4acb57ec01fa33948363a0292bf952568-1452x390.png)

4. Series configuration gives you a lot of options for visualizing data. In addition to changing colors, each series can be a different chart type and you can set series to either the left or right axis. This can be helpful when working with series that have very different scales that you want to display in the same chart.
5. Creating a chart on pivot table data is a powerful way to quickly analyze and manipulate your data visually. Pivot charts dynamically update in sync with your pivot table as you edit, filter, and sort your pivot table.
6. If your pivot table or connected table will add columns as data changes, select [Chart columns as series](#chart-columns-as-series) to dynamically include these new columns in your chart.

## Video tutorial

Here's a video tutorial of how to create a dynamic pivot chart from pivot table data in Row Zero:

[Video: YouTube](https://www.youtube.com/watch?v=n9xccYNzuqo)

## Editing charts

To edit a chart, double-click on the chart to re-open the chart window. You can also right-click and select 'Edit chart'. As you make changes in the chart window, the chart dynamically updates to reflect the changes.

## Cut, copy, paste, and move charts

You can cut, copy, and paste charts with both keyboard shortcuts and by right-clicking on the chart and selecting the action. Use Ctrl+C for copy, Ctrl+X for cut, and Ctrl+P for paste. You can move a chart by clicking and dragging around the screen.

## Download charts as SVG or PNG

Download your chart as an SVG or PNG by right-clicking on the chart and selecting the file type. SVG charts are recommended for high quality displays, scalability, and ease of editing. PNG charts are better for simpler use cases and are more universally compatible with other platforms.

![download SVG chart from spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/9cac496b8a3036779db7de18f3220305d947bee1-1090x551.png)

---

# Data Import

How to import data into Row Zero spreadsheets via file import, S3, or data connectors.

Row Zero imports data two ways. 

1. A [file import](#file-import) loads a file into your workbook. 
2. A [connected table](#connected-tables) runs a live query against a warehouse that you have connected. Connected tables can be backed by a pre-built [data source](/docs/data-import#insert-a-connected-table-from-a-data-source) or a query created by you or with help of the [AI Agent](https://rowzero.com/docs/ai-assistant#ai-generated-queries).

## File import

Row Zero has three options to import files into your workbooks: 

- **[Import file](#import-files)**: upload from your computer
- [**Import from URL**](#import-from-url): import from a link
- [**Import from Amazon S3**](#import-from-amazon-s3): import from an S3 bucket

Row Zero supports multiple file types including CSV, TSV, TXT, Parquet, JSONL, XLSX, and GZ. 

Free, Pro, and Business users can import files up to 5 GB. Enterprise users have access to larger workbooks to support larger imports. 

### Import from your computer

To upload a file from your computer:

1. In the **Data** menu, click **Import files**.
2. Choose the file to upload.
3. Click **Import**.

### Import from URL

To import a file hosted at a public link:

1. In the **Data** menu, click **Import from URL**.
2. Enter the file URL.
3. Click **Import**.

#### Google Drive

Google Drive share links point at a preview page rather than the file itself, so Row Zero cannot read them directly. To import a file stored in Google Drive, convert the link to a direct download URL first, using this URL structure: `https://drive.google.com/uc?export=download&id=INSERT_FILE_ID_HERE `

Replace `<file_id>` with the ID from the Drive share link, then import that URL. See [Open files from Google Drive and Sheets](/docs/open-files-from-google-drive-and-sheets) for more tips.

### Import from Amazon S3

To import a file from an S3 bucket you have connected:

1. In the **Data** menu, click **Import from Amazon S3**.
2. Select the connection, then the bucket and file.
3. Click **Import**.

> Note: See [Connect Amazon S3 to Row Zero](/docs/s3) to set up bucket access.

### Update an imported file

A file import does not refresh on its own. To bring in a newer version of the same file, import it again to the same location. Formulas, charts, and pivot tables built on that data [automatically recalculate](/blog/how-to-update-a-spreadsheet-with-a-new-file) against the new values.

This video tutorial covers updating imported files using data tables:

[Video: YouTube](https://www.youtube.com/watch?v=xTEBHAxB_iw)

### Troubleshooting data imports

There are a number of reasons files fail to import. See [Troubleshooting data imports](/docs/troubleshooting-data-import) for tips. 

## Connected tables

A connected table runs a query against a connection and imports the results into your workbook. The query can be refreshed any time, and business and enterprise users can also schedule it to refresh automatically. 

Connected tables can be backed by a data source or custom SQL query. Custom SQL can be written yourself, built with the point-and-click query builder, or written with the help of the [AI Agent](/docs/ai-assistant#ai-generated-queries). 

### Before you start

To create a connected table, first create a connection. Row Zero connects to  [Athena](/docs/athena), [BigQuery](/docs/bigquery), [Databricks](/docs/databricks), [Oracle](/docs/oracle), [Postgres](/docs/postgres), [Redshift](/docs/redshift), [S3](/docs/s3), [Snowflake](/docs/snowflake), [SQL Server](/docs/sqlserver), and [Teradata](/docs/teradata). See connection documentation to create a new connection.

### Insert a connected table from a connection

There are three ways to write a custom SQL query from a connection: users can use the point-and-click query builder, they can write custom SQL using the SQL editor, or they can use the AI Agent.  

#### Custom queries using SQL editor and query builder

To insert a connected table from a connection:

1. Go to **Insert** &gt; **Connected table**, then choose **From a connection**.
2. On the **Connections** tab, select a connection.
3. Depending on what database or warehouse you use, you will need to choose a data store (e.g. Database, Schema, Catalog, etc.). 
4. Build your query in the query builder or the SQL editor. 
    1. Query builder: Select columns from a single table, view, or semantic view. To select all columns in the table with a single click, drag the table name into the “Fields” section. 
    2. SQL editor: Write custom SQL from multiple tables, views, or semantic views. 
5. Click **Run query**. 

Row Zero imports the results into a connected table. You can update the selected columns, refresh the query on demand, or set a refresh schedule from the **Configure connected table** side pane any time.

> **Note:** You can switch between query builder and SQL editor by clicking  **Switch to SQL editor** or **Switch to query builder** above the query area. Once you edit the SQL, you cannot return to the query builder version of that query.

#### AI-generated queries

Users with AI enabled can also use the AI Agent to write queries using natural language prompts. Row Zero uses the semantic layer configured in your data warehouse to generate the query, then brings the result back into Row Zero as a connected table. See [AI Agent](/docs/ai-assistant#ai-generated-queries) for more information. 

### Insert a connected table from a data source

A data source is a published, reusable query. Inserting one requires no SQL, because the query is already written. This is an easy way to give users one-click access to live updating data from governed datasets.

To insert a data source:

1. Go to **Insert** &gt; **Connected table**.
2. On the **Data sources** tab, scroll or search for the data source you want. Search matches names, descriptions, and column names.
3. Select a data source to view the description and column names in the panel on the right.
4. Click **Insert into workbook**.
5. In the **Insert data source** dialog, set the **Destination**, update query variables (if any), and then use **Pick columns** to choose which columns to import.
6. Click **Insert data source**.

Row Zero imports the results into a connected table. You can update the selected columns, refresh the query on demand, or set a refresh schedule from the **Configure connected table** side pane any time.

To publish a query for your team to use this way, see [Shared data sources](/docs/shared-data-sources).

### Working with connected tables

Row Zero imports query results into a connected table. Column headers and data types come from the query. When you click in a connected table, you can see when it was last updated in the bottom right of the workbook, along with the number of rows in the table. 

![Last updated data for connected table](https://cdn.sanity.io/images/2w8agf2t/production/7757f530a2cf5fb396c46eca8902b406d0266a7d-960x470.png)

#### Choosing a table mode

Connected tables have two modes: 

1. Standard mode: results spill into the sheet's cells, starting at the anchor cell. Each value occupies its own cell.
2. Data table: results display in a [data table](/docs/data-tables) on top of the sheet grid. The data table takes up the same space no matter how many rows the query returns. 

New connected tables use the mode you chose most recently. You can switch a connected table between modes at any time.

To change the mode of a connected table:

1. Click **Table details** to open the **Configure connected table** side pane.
2. Select the **Settings** tab.
3. Under **Table mode**, select **Standard** or **Data table**.

   ![](https://cdn.sanity.io/images/2w8agf2t/production/4a014be7223c4500dda023a02557c7e6e8861e1b-938x434.png)

#### Referencing connected tables in formulas

Formulas can reference connected tables using column references in both data table and standard mode, and cell references in standard mode. 

**Column references** name a column by its header name. See [Data Tables](/data-tables) for more detail. 

- Full column references include both the anchor cell and the header name. The cell before the brackets is the connected table's root cell. For a connected table rooted at `A1`, this formula sums the `ORDER_TOTAL` column: `=SUM(A1["ORDER_TOTAL"])`.
- Sibling column references return a columns value in the corresponding row. Use them in a column next to the connected table to calculate a value for every row. For example, `={ORDER_TOTAL} * 0.08` returns 8 percent of each order total.

**Cell references** point at the cells the results spill into, like any other range. They work only in **Standard** mode. For example, if `ORDER_TOTAL` spills into column D, `=SUM(D:D)` returns the same total, assuming there is no other data in column D.

> **Tip:** Use column references in formulas that need to survive a change to the query. A column reference follows its column by name. A cell reference such as `D:D` points at whatever column lands in D.

### Refresh connected tables

Users can refresh queries on demand or on a schedule. Any time the query is refreshed, the data in the connected table is updated with the latest query results. Everything downstream of the connected table (pivot tables, charts, formulas, etc.) also automatically updates.

To rerun your query: 

1. Click **Table details** to open the **Configure connected table** side pane. 
2. Click **Run query** to refresh a connected table on demand. 

To refresh on a schedule:

1. Click **Table details** to open the **Configure connected table** side pane. 
2. Select the **Schedule** tab. 
3. Turn on the **Query schedule** and choose your schedule. 

Your query schedule will appear in the header. 

Scheduled refresh is available to Business and Enterprise customers.

![Scheduled refresh for connected tables](https://cdn.sanity.io/images/2w8agf2t/production/ff9b7800e16ae57575d3f7ebe1ef05dead783c75-477x497.png)

## Related

- [Data tables](/docs/data-tables)
- [Troubleshooting data imports](/docs/troubleshooting-data-import)
- [AI-generated queries](/docs/ai-assistant#ai-generated-queries)

---

# Data Export

How to get data out of Row Zero

Row Zero supports a number of different methods for exporting data from a [Row Zero spreadsheet](/new?ref=data-export): 

- [CSV Export](#csv-export)
- [Sync to Google Slides](#sync-to-google-slides)
- [Write-back to Data Warehouse](#write-back-to-data-warehouse)

## CSV Export

Once you've analyzed or transformed your data in Row Zero, you can export it to a CSV.

**To Export a CSV:**

1. Select a range of data or data table
2. Right-click
3. Select 'Export To CSV'

   ![Export range to CSV](https://cdn.sanity.io/images/2w8agf2t/production/8448a361286fe631f2cc0af1a6453d25d1d93a2e-460x642.png)

- You can export to CSV with a data table by right-clicking a data table and selecting **Export to CSV**.

  ![Export datatable to CSV](https://cdn.sanity.io/images/2w8agf2t/production/22d2386302c4b347025c97cd9c82219edfff79d3-1113x491.png)

### Details of export to CSV

- Export to CSV is not available in free accounts. If you are on a free account and want to share your dataset, you can use the 'Share' button in the upper right-hand corner. Export CSV is available on Pro, Business, and Enterprise accounts.
- Export to CSV can also be accessed by going to File &gt; Download to CSV for any sheet in a workbook that does not contain a data table.
- Exporting a range that includes both cells and data tables will not work. Data tables must be exported to their own CSV because they are independent datasets
- As a security feature, the ability to export data to a CSV can be disabled for enterprise customers, which more securely keeps data in the cloud and off of people's laptops.

## Sync to Google Slides

With the [Row Zero Add-On](https://workspace.google.com/marketplace/app/row_zero/250195188323), you can insert Row Zero charts and tables directly into your Google Slides presentations and sync them with your Row Zero workbooks with a single click.

When your data changes, refresh an individual chart or table, or update all linked objects in your presentation at once. No re-exporting, no copying and pasting screenshots, and no wondering which slide has the latest numbers.

### Install the Add-On

Start by installing the [Row Zero Add-on](https://workspace.google.com/marketplace/app/row_zero/250195188323) from the Google Workspace Marketplace. You can install the add-on for yourself individually, or, if you are an admin of your Google workspace, you can install the add-on for everyone in your Google workspace.

![Row Zero Add-on install options](https://cdn.sanity.io/images/2w8agf2t/production/79bd64bf0ececffb7ad57c68f1dce84a3ade244a-1584x476.png)

### Add Row Zero charts and tables to a Google Slides presentation

Open a presentation in [Google Slides](https://docs.google.com/presentation). The first time you open a presentation you may need to allow the add-on to access the file.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/0a8cfd4c159817f89aa9567237399f33fcb88db0.mp4)

There are two ways you can add content to a presentation:

1. **Copy and paste charts:** Copy a chart or table from Row Zero and paste it into your slide.
2. **Import charts or tables from the add-on:** You can also select the chart(s) you would like to import from the Add-On directly. Open the add-on, select your workbook, and then select the desired charts.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/c551996e17763fb6377c86e5c5442002a9d54acf.mp4)

### Sync Row Zero charts and tables in Google Slides

To sync the slides in your presentation, open the Row Zero Add-on and choose the charts or tables you’d like to sync, or select “Sync all”. 

[Video](https://cdn.sanity.io/files/2w8agf2t/production/0787b36d9fdff90eb7bb957cdab65f35a6e2a311.mp4)

## Write-back to Data Warehouse

Row Zero can write data from the spreadsheet into a data warehouse. To use the write-back feature, a workbook must already have a connection to a data warehouse. To connect a data warehouse, follow instructions for your specific data warehouse on our [Data Import](/docs/data-import) page. Once a data warehouse is connected follow these steps to write spreadsheet data into the data warehouse.

**Write back to data warehouse:**

1. Select a range of data or data table
2. Right-click
3. Select 'Export To `<data warehouse>`'

   ![Spreadsheet range save to database](https://cdn.sanity.io/images/2w8agf2t/production/a153833e214e33395150781a6dd15c0fa5d2b4f3-904x986.png)

4. Choose your database and schema.

   ![Enter table database and scheme for export to data warehouse](https://cdn.sanity.io/images/2w8agf2t/production/a6f949f97f0889fb93fd72900b2844d59d7a7f70-1243x934.png)

5. Name your table. Row Zero will create a new table with the data in your range or data table. All exported table names must be prefaced with "rz_" to prevent overwriting a core table that wasn't meant to be overwritten.

   ![Enter table name for export to data warehouse](https://cdn.sanity.io/images/2w8agf2t/production/3384597d4486327f6aa1f1a512f039b27a2eb6ab-562x339.png)

### Details of Write-back to Data Warehouse

- Write-back to a data warehouse must be preceded by connecting a data connection. Instructions for connecting data sources can be found in [Data-Import](/docs/data-import).
- An individual user must have 'Write' access to the conncted Data Warehouse in order to use the 'write-back to data warehouse' feature.
- Write-back to data warehouse is available to [Business Tier](/pricing) customers.
- Each time data is saved to the data warehouse Row Zero will create a new table with the selected dataset. The new table will overwrite any table with the same name. Under the hood we're issuing a CREATE OR REPLACE table statement.

### Best practices for data teams

- It's common to create a separate schema where users put their exported rz_ tables. This ensures these tables are segregated from the pristine fact tables managed by the data team.
- This schema functions similarly to a shared drive that teams use to share files. You can have multiple such schemas if you need more granular control over permissions (even one per user).
- If you find one of these rz_ tables is becoming heavily depended on, consider lifting it into your ETL pipeline. But until this happens, your users aren't blocked and can participate in your data lake in self-service fashion.

---

# Data Tables

Data tables make it easy to work with large datasets in your spreadsheet and can connect directly to your data source to build dynamic spreadsheets.

A data table is one of the ways Row Zero displays data in a sheet. It sits on top of the spreadsheet grid, is rooted in its upper-left cell, and displays a full dataset without writing that data into cells. The data can come from a query, a pivot table, a file, or a formula.

Data tables are a convenient way to work with large datasets for two reasons:

1. **Fixed footprint**: A data table takes up the same space in the sheet no matter how much data it displays. It does not expand and push your other content around when the dataset grows. Scroll inside its borders to move through the data, or drag the bottom border to show more or fewer rows.
2. **Column transformations**: Data tables support column transformations via computed columns. Computed columns are useful for adding derived, row-level logic to large datasets. For example, deriving new metrics, categorizing data, or trimming and cleaning values in other columns.

## Types of data tables

Data tables are a rendering mode for connected tables, pivot tables, file import, and formula outputs. 

| Type | Description |
| --- | --- |
| Connected table | The results of a query against a connection. |
| File import | A file imported from your computer, a URL, or a cloud source (e.g. S3). |
| Pivot table | A summary or analysis table. |
| Formula output | The value returned from a function (e.g. DATATABLE). |

This page covers what a data table is and how to work with one. For how to get data into a workbook in the first place, refer to the following: 

- [Data import](/docs/data-import): creating connected tables and file imports 
- [Pivot tables](/docs/pivot-tables): creating pivot tables
- [DATATABLE](/docs/spreadsheet-functions#DATATABLE): creating a data table using the DATATABLE function

Whatever produced it, a data table behaves the same way. Everything below applies equally to a pivot table, a connected table, an imported file, and a formula result. 

## Work with data tables

### Scroll and navigate

Click into a data table to scroll with your mouse, arrow keys, or the scroll bar on the right side of the table. Use **Ctrl + arrow up** (**Cmd + arrow up** on Mac) to navigate to the top and **Ctrl + arrow down** (**Cmd + arrow down** on Mac) to navigate to the bottom of the data table.

### Move and resize

Drag the left, right, or top border to move a data table within a sheet. The hand icon will display when the mouse is hovering over a border that can be moved.

Drag the bottom border to make it taller or shorter. Data tables default to 15 rows. Resizing changes how many rows are visible. It does not change the underlying dataset.

### Manage columns

Right-click on the data table and select **Manage columns** to hide or reorder columns. Hiding a column removes it from view without removing it from the underlying data. Note that source data table columns cannot be deleted but calculated columns can be deleted by clicking in the column and hitting delete.

![Manage data table columns](https://cdn.sanity.io/images/2w8agf2t/production/f975b5117e5bf566b17fa8a0f21eab5ad35ff510-1753x739.png)

### Filter and sort

Filter and sort data tables just like any other filtered range in a spreadsheet. You can filter and sort by clicking the toggle in the column header or by right-clicking in the data table and selecting **Sort** or **Filter column**. You can easily add multiple filters and sorts. 

![Filter data table in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/3137a2ca5684ce214a7e45611855f4e7c40b3916-1902x746.png)

### Format

Select a column and use the standard spreadsheet formatting controls. Data tables also support [conditional formatting](/docs/formatting). Note that formatting is applied to the entire column.

### Explode table

To transform a data table into spreadsheet cells, right-click on the data table and select **Explode table**. The data table will be pasted into the underlying spreadsheet cells, filling all the rows populated by the data. This is similar to a copy/paste values.

Explode table is useful when you need to edit values directly. 

> Important: When you explode a data table, you break the connection to your source data, so exploded data will not update with source data (query, pivot source, or formula input).

![Explode data table](https://cdn.sanity.io/images/2w8agf2t/production/c7a7acac1b286c8ac601cc12395fcb695f93a29a-1912x808.png)

### Cut, copy, and paste

Right-click to cut and copy data tables and paste with **Ctrl** + **v**. This is an easy way to duplicate data tables to quickly make new iterations.

## Transformations

Add a **computed column** by typing a formula in the column directly adjacent to the data table. To reference another column in the table, then click the column in the data table or arrow across to select it. When you evaluate the formula, Row Zero automatically adds a new column to the table with that formula. 

![Write a computed column](https://cdn.sanity.io/images/2w8agf2t/production/dad289291958589c91732669461ae9a6d2f49b30-1451x707.png)

Rename the column by editing the header cell. 

![Rename a computed column](https://cdn.sanity.io/images/2w8agf2t/production/236b734d758400cc8b5c1bf8c1e539d04780f7fb-1148x713.png)

Computed columns can be hidden or reordered using **Manage columns**. To delete a computed column, delete any cell in the column. 

> Note: The data inside a data table cannot be edited. It can be manipulated on a column level by creating new columns or using filter and sort features. If you want to edit the data, you can right-click and select [Explode table](#explode-table) to paste values to cells where you can fully edit and delete data.

## Build on top of a data table

Pivot tables, charts, and formulas can all use a data table as their source. When a data table updates with new data, everything downstream updates, too. For example, when your connected table updates with new data, everything referencing it updates as well. 

### Formulas

You can reference a data table column in any function that takes a range as an argument. To reference a data table column in your function, use arrow keys or mouse to toggle to the column. The column will autofill in your function. 

> Note: When formulas are entered in the first column to the right of the data table, they are added to the data table as [computed columns](#transformations).

![spreadsheet formula referencing data table](https://cdn.sanity.io/images/2w8agf2t/production/0a044f5ff7bd9ee2ac7e4b43f4138bdba1703945-1912x824.png)

By default, functions in Row Zero ignore filters on a range. Use the tilde (`~`) operator immediately before a data table reference if you wish to only operate on the filtered values. See [Filter and sort](/docs/filter-sort) to learn more about the tilde (`~`) operator.

![dynamically filter formulas when filtering source data in the spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/929afe3838768610dc21edd394e8b19ec6cac284-1913x740.png)

### Pivot

Right-click on a data table and select **Pivot** to create a [pivot table](/docs/pivot-tables) from your data table. Keep in mind that pivot tables can also be data tables, so you can pivot a pivot table.

### Chart

Select cells in the data table, then go to **Insert** &gt; **Chart**.

Charts built from a data table use whole columns as their source. To chart part of a column, explode the table first.

When charting data in a data table (pivot tables, connected tables, etc.), you have the option to select **Chart columns as series**. When selected, this automatically charts every column in the table as a series and automatically includes any new columns that are added as your data updates. See [Charts](/docs/charts) to learn more.

### Export

To export your data table, **right-click** and use the export options to download the table as a CSV or write back to a data connection. See [Data export](/docs/data-export) to learn more.

## Related

- [Data import](/docs/data-import)
- [Pivot tables](/docs/pivot-tables)
- [Data export](/docs/data-export)

---

# Data Cleaning in Row Zero

See how to clean data in a spreadsheet with advanced features like remove duplicates, python, pivot tables, conditional formatting, and formulas to find outliers.

Row Zero generally [works like Excel and Google Sheets](/features/excel-compatible) and supports all of the typical data cleaning and editing options you would expect in a spreadsheet like deleting, adding, editing, formatting, sorting, and filtering cells, columns, and rows. Row Zero also has advanced data cleaning features like remove duplicates, data validation, conditional formatting, formulas for finding outliers, and a native python window for writing custom functions and importing python packages.

## Remove Duplicates

Row Zero makes it easy to [remove duplicate values](/docs/remove-duplicates) in a sheet or range. Here's how to remove duplicates:

1. Select the range of cells you would like to remove duplicates from. If you don't select a range of cells, the feature will select the entire sheet by default, which is generally recommended.
2. There are two ways to access the feature:
    - In the header menu, go to **Data**, **Remove duplicates**
    - Click the remove duplicates icon in the formatting menu in the header. **Note**: Depending on your screen size and zoom level, you may need to click the 3 dots to expand the menu to access remove duplicates.  

      ![remove duplicates in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/616f4cd9bbe7d7a7a62bc15a3c2af60f3198f1dd-1587x180.png)

3. Select the column(s) that you want to remove duplicates from. If you select mutliple columns, it will only remove duplicate rows that have duplicate values in each of the columns selected. Note that all columns are selected by default, but in many instances you may want to select just one or two columns.  

   ![remove duplicates in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/584927dd6d2c5ef53d3acd76a8e0d8c6d22626e3-1905x842.png)

4. Click **Apply** and all matching duplicate rows will be deleted from the sheet

Read more about [finding dupicates and unique values](/blog/remove-duplicates-and-count-unique-values) in your sheet.

## Data validation and dropdowns

[Data validation](/docs/data-validation) lets you control data input by enforcing specific rules or criteria. This helps improve data accuracy, consistency, and integrity when collaborating with multiple users.

![dropdown example in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/cfded3811c5b5c18b01417257685482f520bac66-1914x847.png)

## Find and Replace

The [find and replace](/docs/find-and-replace) feature makes it easy to find and replace specific values in your sheet or within a specific selection. Just hit the **Ctrl+H** keyboard shortcut to open the find and replace feature.  

![clean data with find and replace](https://cdn.sanity.io/images/2w8agf2t/production/1f0a51fe9add4586d4182166b8534ff276a4151d-1522x698.png)

  
You can also use the [Ctrl+F](/docs/ctrl-f) shortcut to open the find window to easily search for values in the sheet.

## Conditional Formatting

The [conditional formatting](/docs/formatting#conditional-formatting) feature makes it easy to find and highlight data that meets certain conditions. You can find particular values, outliers, empty cells, duplicate cells, etc.  

![conditional formatting in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/468eaa9537e837d6aa1758a7756d84c2403de3cd-1417x661.png)

## Finding outliers

In addition to conditional formatting, Row Zero offers several ways for finding outliers in your data:

### Sort and Filter

[Sorting and filtering](/docs/filter-sort) works just like traditional spreadsheets. You can sort ascending or descending and filter by condition or category.

### Formulas

Row Zero offers a large library of built-in [spreadsheet functions](/docs/spreadsheet-functions) and formulas that are Excel-compatible as well as some formulas unique to Row Zero. Several functions are useful for finding outliers including MAX, MAXIFS, MIN, and MINIFS. Other -if formulas like IFS, SUMIFS, COUNTIFS, AVERAGEIFS, IFNA, and IFERROR can be useful for cleaning and analyzing data. [View all spreadsheet functions](/docs/spreadsheet-functions).

### Pivot tables

[Pivot tables](/docs/pivot-tables) are an easy way to summarize data and either find or ignore outliers. Row Zero pivot tables support the typical value calculations like Max, Min, Median, Standard Deviation, etc. as well as some new calculations like [Count Unique](/blog/count-unique-pivot-table) and [Percentiles](/blog/pivot-table-percentiles) that can be useful for summarizing dirty data or accounting for outliers.  

![pivot table percentiles](https://cdn.sanity.io/images/2w8agf2t/production/fbe22bfbd3fe204c266d1741292e2679f7e41ac8-1499x861.png)

## Python functions and packages

The [native python window](/docs/code-window) can be used to [create custom spreadsheet functions](/blog/create-custom-spreadsheet-functions-with-python-and-chatgpt) and import python packages to help clean, transform, and analyze data. Here's an example python function to extract the domain portion of an email in your spreadsheet:

```python
def extract_domain(email: str) -> str:
    if "@" in email:
        return email.split("@")[1]
    else:
        return "Invalid email"

# For this example, type '=extract_domain(A1)' in a spreadsheet cell and it will extract the domain portion of an email in cell A1 . 
```

![python extract domain function in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/9dcae4185a33a2d75ee0ad7df0ab7979ad66334c-1771x742.png)

## Splitting text to columns

The [Split text to columns](/docs/split-text-to-columns) feature make it easy to split values in one column into multiple columns based on a separator. This can be used to parse unparsed CSV data and can be also be very useful for cleaning data. For example, you can split full names to first and last names or split date times into separate date and time columns. To use the feature, simply select your column and go to **Data**, **Split text to columns**.  

![split text to columns in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/2cfa54d7be5a6f791c48e6d816bbec35bd1c44eb-1911x848.png)

## Cleaning and editing big files

Row Zero's [big data power](/features/performance) makes it easy to open, clean, and [edit big CSV files](/blog/edit-big-csv) and other file formats like [txt](/blog/open-large-txt-file), [parquet](/blog/open-parquet-file-online), [JSONL](/blog/open-jsonl-file-format), [.gz](/blog/open-gz-file-online), and [XLSX](/blog/open-big-excel-file). If you're on a paid plan, you can download your workbooks as a CSV at any time or import directly into your database (e.g. [Postgres](/blog/import-csv-to-postgres)) or data warehouse (e.g. [Snowflake](/docs/snowflake)). This can be a convenient way to preview and clean data before importing to your ecosystem.

Read more about [data cleaning techniques](/blog/big-data-cleaning-in-spreadsheets) and [troubleshooting common CSV errors](/blog/common-csv-errors).

---

# Filter and Sort

Filter and sort large datasets in a spreadsheet in Row Zero, a next-gen spreadsheet build for big data.

You can easily filter and sort large, dynamic datasets in Row Zero. You can apply multiple filters and sorts at the same time. You can also create slicers, which are portable filters that can be moved anywhere in the workbook. Filtering and sorting in Row Zero is similar to Excel, Google Sheets, and other spreadsheets.

## Filter

To apply filters a range, select the cells you'd like to filter and go to **Data** in the header menu and select **Filter**.

![apply filters in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/6d5e032ef12d0b38b197049adc813bd85bd6bb83-1911x778.png)

Click the toggle in a column header to sort or filter that column.

![sort filtered range in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/dc2290f04f352a51a726f7234ee0a8f7c3a022cd-1910x935.png)

You can filter and sort [data tables](/docs/data-tables) that same way you filter and sort cell ranges. Data tables are always ready to be filtered, so you don’t need to apply. Just click the toggle in the header column to filter or sort. You can also right-click in the data table and select **Sort** or **Filter**.

### Filter options

You can apply filters using an evaluation (e.g. greater than 5) or selecting specific values with categorical filtering.

![filter greater than in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/a3473bb3687035aa077b4e4c72fecffea9b65df0-1858x749.png)

Here are the available filtering options:

- Filter text columns by:
    - is one of
    - contains
    - does not contain
    - starts with
    - ends with
    - is
    - is not
- Filter number columns by:
    - is one of
    - equal to
    - not equal to
    - greater than
    - greater than or equal to
    - less than
    - less than or equal to
- Filter date columns by:
    - is exactly
    - is after
    - is on or after
    - is before

With categorical filtering, you can search for specific values and select one or many values to filter on.

![categorical filtering in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/8db99172b5ae64207ab046a720063a3a028a0cce-1371x718.png)

### Applying multiple filters

You can apply multiple filters to the same column and also apply filters to multiple columns at the same time. To apply multiple filters to the same column, click the filter icon in the column header and then click **+ Add filter** in the bottom right of the filter dialog to add multiple filters.

![apply multiple filters in column in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/4bf1d9f5e6dc066d33aa689f11eabba889b1fa84-1861x745.png)

To apply filters to multiple columns, simply navigate to each column and apply filters. Multiple filters are treated as **"and"** logic, so the sheet will filter to only rows that match all filters.

### Convert filter to a conditional format

You can easily make a conditional format from a filter by clicking **Make Conditional Format** in the filter dialog.

![convert filter to conditional format in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/cae480bd4830ea3e27ff52331402e2b2f4a8f82e-482x298.png)

  
This will open the [conditional formatting](/docs/formatting) window with the filter pre-set. Apply formatting and then optionally go back and clear the filter to see the unfiltered data with the previous filter now a conditional format.

### Clearing and removing filters

To clear filters, click on the filter icon in the column header and click **Clear filters** in the bottom left of the filter dialog.

![clear filters in column in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/d8c3c608f665476dadb71b96b8e7eb5a99abe789-482x364.png)

To remove all filters from a range, go to **Data** in the header menu and select **Remove filtered range**.

Note that you can only apply filters to one cell range at a time in a sheet. If you want to have multiple filtered datasets on one sheet, use [data tables](/docs/data-tables).

## Filtering downstream formulas and pivot tables

### Using ~ in formulas

Filtering a cell range or data table does not filter formulas by default. Use the tilde (`~`) operator immediately before a data table or cell reference if you wish to only operate on the filtered values. 

![filter downstream formulas, pivot tables, and charts](https://cdn.sanity.io/images/2w8agf2t/production/61de315a53a22bbc8beb7142114418882a985c46-1872x622.png)

### Pivots

Pivot tables can either use all rows or filtered rows as their source. In the **Options** tab of the **Configure pivot table** side pane, select **Filtered rows** if you would like filters on source data to also filter downstream pivots. 

![](https://cdn.sanity.io/images/2w8agf2t/production/0db9b1045739f3f8035ad2875dac95124e363dcc-1210x714.png)

## Slicers

[Slicers](/docs/slicers) are filters that can be moved anywhere in the workbook. Slicers make it easy to create filters that filter multiple pivot tables and charts at once. 

![filter dashboards with slicers](https://cdn.sanity.io/images/2w8agf2t/production/83663652f283ed51fc4f55e319752bd5f4e00c9a-1899x1005.png)

In the example above, pivots were configured to use “Filtered rows” as the source rows, and then slicers were applied to the source data. The slicers were then next to the charts and pivot tables on the “Flights Dashboard” tab to make it easy to filter underlying data on another sheet.

To create a slicer, select your data and go to **Insert** in the header navigation and select **Slicer**.

![add slicer in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/ae2776f45567c4e9f7b78c34aacd95751591f08d-1915x480.png)

## Sort

There are two ways to sort cell ranges in Row Zero: 

1. Using the **Filter** dialog: See [Filter](/docs/filter-sort#filter) above.
2. Using the **Sort** dialog: Go to **Data** in the header menu and select **Sort**. This menu an also be accessed or by right-clicking on selected data and selecting **Sort range**.

If needed, you can sort multiple columns.

![sort multiple columns in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/126f031876268ab86943c3413bc36e5fa3cf4cb0-1911x839.png)

## Sort by color

You can sort by color via the filter dialog. Sort by color lets you pull rows with the same color to the top of the workbook for review. This is particularly powerful when combined with conditional formatting that automatically color-codes your data.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/6db61095be7ee8529d113cd38af13b2cdce7f690.mp4)

---

# Folders and organization

Use drives, folders, and search to organize and find your work in Row Zero

Row Zero organizes content into four locations, depending on who owns it and who it's shared with. This page covers those locations, how to create and share drives and folders, and how to search across your workspaces.

| Location | Contents |
| --- | --- |
| My drive | Content you own |
| Shared drives | Content owned and maintained by a team |
| Shared with me | Content shared directly with you by members of your workspace |
| External | Content shared with you from workspaces that you're not a member of |

Each workbook, template, or folder exists in exactly one location.

## My drive

[**My drive**](/my-drive) contains content that you own. Use it for workbooks, templates, and folders that you want to retain sole ownership of. 

You can share individual workbooks, templates, and folders with other users without moving them into a Shared drive. See [Sharing and collaboration](/docs/sharing).

## Shared drives

[**Shared drives**](/drives) are shared locations for content that is owned and maintained by a team. Any user with an enterprise or business account can create one.

Use a shared drive when a team needs access to a set of workbooks or templates, and no single person should be the owner that content.

## Folders

Folders organize content in My drive and shared drives. A folder can contain workbooks, templates, and other folders.

## Drive and folder permissions

### Roles

Shared drives and folders use the same three roles. 

| Role | Permissions |
| --- | --- |
| Owner | Manage sharing, and add or remove content from the drive or folder |
| Editor | Add content, but cannot remove existing content from the drive or folder |
| Viewer | View contents of the drive or folder |

Note: Folder owners are always inherited from the parent drive (My drive or a shared drive). New owners can only be added to shared drives. 

### How roles are inherited

Content (folders, workbooks, or templates) inherits the roles of the drive or folder that contains it. For example, users with Owner access to a Shared drive automatically have Owner access to every workbook stored in that drive, meaning they can share, modify, or delete those workbooks.

Access can only be expanded, it cannot be narrowed. That is, a folder, workbook, or template stored in a shared drive can be shared with a user who does not have access to the parent shared drive, but access cannot be taken away from shared drive members. 

If content was shared directly with users before it was moved into a Shared drive, those users retain their existing access after the move. 

## Organize content in drives and folders

### Create a drive or folder

To create a new folder or drive: 

1. In the top left, click **New**.
2. Choose what to create, **Folder** or **Shared drive**.
3. Enter a name.
4. Click **Create**.

   ![To add a new folder or drive, click New and then select the entity type](https://cdn.sanity.io/images/2w8agf2t/production/4190726a58c6698890e00cb3f2f04531713d60fd-1022x894.png)

### Share a drive or folder

To share a folder or drive:

1. Open the drive or folder.
2. Next to its name, click the three dots.
3. Choose **Manage sharing**.
4. Add the users or groups you want to share with, and choose their role.
5. Click **Confirm**.

   ![Share folders or drives in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/b0653473ee367b723306a6da7ae9aa6ddd2a2fa6-1666x830.png)

### Move content

Select the workbooks, templates, or folders you want to move, then either drag them onto the destination or click **Move** and choose the destination.

To select more than one item, use the checkboxes, or hold `Ctrl` (`Cmd` on Mac) and click each item.

![Select one or more workbook, template, or folder to move them to a new destination](https://cdn.sanity.io/images/2w8agf2t/production/8c654c07bb4b089bc2e21e939df1017f965d1d79-3024x1720.png)

### Delete a drive or folder

To delete a drive or folder:

1. Open the drive or folder.
2. Next to the drive or folder's name, click the three dots.
3. Choose **Move to trash**.

> **Warning:** Moving a drive or folder to the trash also moves its contents (workbooks, templates, and nested folders) into the trash. You can restore contents in [Trash](/trash) for a limited period.

## Shared with me

The [**Shared with me**](/shared) section contains workbooks, templates, and folders that have been shared directly with you by members of your selected workspace.

## External

The [**External**](/external) section contains workbooks and folders shared with you from workspaces that you are not a member of.

## Search

Use the search bar to find content within the currently selected workspace. Search results are ranked by relevance. Use the **Type** filter to narrow results.

Note that search matches names and descriptions (where applicable), not the data inside a workbook. 

## Workspaces

Workspaces are containers for content within Row Zero. Each one has its own membership, security settings, and data connections that are isolated from other workspaces in an organization. Every workbook belongs to a single workspace.

Most users belong to a single workspace. Enterprise customers can belong to multiple workspaces and switch between them using the workspace selector at the top of the page.

Switching workspaces changes the contents of **My drive**, **Shared drives**, and **Shared with me**. 

![Enterprise customers can belong to multiple workspaces and switch between them using the workspace selector at the top of the page.​​​​‌﻿‍﻿​‍​‍‌‍﻿﻿‌﻿​‍‌‍‍‌‌‍‌﻿‌‍‍‌‌‍﻿‍​‍​‍​﻿‍‍​‍​‍‌﻿​﻿‌‍​‌‌‍﻿‍‌‍‍‌‌﻿‌​‌﻿‍‌​‍﻿‍‌‍‍‌‌‍﻿﻿​‍​‍​‍﻿​​‍​‍‌‍‍​‌﻿​‍‌‍‌‌‌‍‌‍​‍​‍​﻿‍‍​‍​‍‌‍‍​‌﻿‌​‌﻿‌​‌﻿​​‌﻿​﻿​﻿‍‍​‍﻿﻿​‍﻿﻿‌﻿​‍‌‍﻿﻿‌﻿‌﻿‌﻿‍‍‌‍‌‌‌﻿​‍‌‍﻿﻿​‍﻿‍‌﻿​﻿‌‍​‌‌‍﻿‍‌‍‍‌‌﻿‌​‌﻿‍‌​‍﻿‍‌﻿​﻿‌﻿‌​‌﻿‌‌‌‍‌​‌‍‍‌‌‍﻿﻿​‍﻿﻿‌‍‍‌‌‍﻿‍‌﻿‌​‌‍‌‌‌‍﻿‍‌﻿‌​​‍﻿﻿‌‍‌‌‌‍‌​‌‍‍‌‌﻿‌​​‍﻿﻿‌‍﻿‌‌‍﻿﻿‌‍‌​‌‍‌‌​﻿﻿‌‌﻿​​‌﻿​‍‌‍‌‌‌﻿​﻿‌‍‌‌‌‍﻿‍‌﻿‌​‌‍​‌‌﻿‌​‌‍‍‌‌‍﻿﻿‌‍﻿‍​﻿‍﻿‌‍‍‌‌‍‌​​﻿﻿‌​﻿‌‌​﻿‌​​﻿‌﻿​﻿​‍​﻿​‍​﻿‍‌​﻿‌‍​﻿‍‌​‍﻿‌​﻿‌‌‌‍‌‍​﻿​‍‌‍​‌​‍﻿‌​﻿‌​‌‍‌‌‌‍​‍​﻿‌‌​‍﻿‌‌‍​‍‌‍‌‌​﻿‍​​﻿​‍​‍﻿‌​﻿‌​​﻿‍​​﻿​‍​﻿​‌​﻿​‍​﻿‌​​﻿‌​​﻿​​​﻿‌﻿​﻿‌​‌‍‌​‌‍‌​​﻿‍﻿‌﻿‌​‌﻿‍‌‌﻿​​‌‍‌‌​﻿﻿‌‌‍‌​‌‍﻿﻿‌‍​﻿‌﻿​﻿‌‌​​‌‍​‌‌‍‌﻿‌‍‌‌​﻿‍﻿‌﻿​​‌‍​‌‌﻿‌​‌‍‍​​﻿﻿‌‌﻿​‍‌‍‍‌‌‍​﻿‌‍‍​‌​​‍‌‍﻿﻿‌‍‌​‌﻿‍‌​‍‌‌​﻿‌‌‌​​‍‌‌﻿﻿‌‍‍﻿‌‍‌‌‌﻿‍‌​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​‍​﻿​‍​﻿​‍‌‍​‌​﻿‍‌‌‍‌​‌‍‌‌​﻿‌​‌‍‌‌​﻿‍‌​﻿‌﻿​﻿​﻿​﻿‌‍​﻿‌​​‍‌‌​﻿​‍​﻿​‍​‍‌‌​﻿‌‌‌​‌​​‍﻿‍‌‍​﻿‌‍‍​‌‍‍‌‌‍﻿​‌‍‌​‌﻿​‍‌‍‌‌‌‍﻿‍​‍‌‌​﻿‌‌‌​​‍‌‌﻿﻿‌‍‍﻿‌‍‌‌‌﻿‍‌​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​‍​﻿​‍​﻿‍‌​﻿​​‌‍​‌​﻿​‍‌‍​‍‌‍​‌‌‍‌​‌‍‌‍‌‍​‍‌‍‌‍‌‍​‌​﻿​﻿​‍‌‌​﻿​‍​﻿​‍​‍‌‌​﻿‌‌‌​‌​​‍﻿‍‌﻿‌​‌‍‌‌‌﻿‍​‌﻿‌​​﻿﻿﻿‌‍​‍‌‍​‌‌﻿​﻿‌‍‌‌‌‌‌‌‌﻿​‍‌‍﻿​​﻿﻿‌‌‍‍​‌﻿‌​‌﻿‌​‌﻿​​‌﻿​﻿​‍‌‌​﻿​﻿‌​​‌​‍‌‌​﻿​‍‌​‌‍​‍‌‌​﻿​‍‌​‌‍‌﻿​‍‌‍﻿﻿‌﻿‌﻿‌﻿‍‍‌‍‌‌‌﻿​‍‌‍﻿﻿​‍﻿‍‌﻿​﻿‌‍​‌‌‍﻿‍‌‍‍‌‌﻿‌​‌﻿‍‌​‍﻿‍‌﻿​﻿‌﻿‌​‌﻿‌‌‌‍‌​‌‍‍‌‌‍﻿﻿​‍‌‍‌‍‍‌‌‍‌​​﻿﻿‌​﻿‌‌​﻿‌​​﻿‌﻿​﻿​‍​﻿​‍​﻿‍‌​﻿‌‍​﻿‍‌​‍﻿‌​﻿‌‌‌‍‌‍​﻿​‍‌‍​‌​‍﻿‌​﻿‌​‌‍‌‌‌‍​‍​﻿‌‌​‍﻿‌‌‍​‍‌‍‌‌​﻿‍​​﻿​‍​‍﻿‌​﻿‌​​﻿‍​​﻿​‍​﻿​‌​﻿​‍​﻿‌​​﻿‌​​﻿​​​﻿‌﻿​﻿‌​‌‍‌​‌‍‌​​‍‌‍‌﻿‌​‌﻿‍‌‌﻿​​‌‍‌‌​﻿﻿‌‌‍‌​‌‍﻿﻿‌‍​﻿‌﻿​﻿‌‌​​‌‍​‌‌‍‌﻿‌‍‌‌​‍‌‍‌﻿​​‌‍​‌‌﻿‌​‌‍‍​​﻿﻿‌‌﻿​‍‌‍‍‌‌‍​﻿‌‍‍​‌​​‍‌‍﻿﻿‌‍‌​‌﻿‍‌​‍‌‌​﻿‌‌‌​​‍‌‌﻿﻿‌‍‍﻿‌‍‌‌‌﻿‍‌​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​‍​﻿​‍​﻿​‍‌‍​‌​﻿‍‌‌‍‌​‌‍‌‌​﻿‌​‌‍‌‌​﻿‍‌​﻿‌﻿​﻿​﻿​﻿‌‍​﻿‌​​‍‌‌​﻿​‍​﻿​‍​‍‌‌​﻿‌‌‌​‌​​‍﻿‍‌‍​﻿‌‍‍​‌‍‍‌‌‍﻿​‌‍‌​‌﻿​‍‌‍‌‌‌‍﻿‍​‍‌‌​﻿‌‌‌​​‍‌‌﻿﻿‌‍‍﻿‌‍‌‌‌﻿‍‌​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​﻿‌​‌​​‍‌‌​﻿​‍​﻿​‍​﻿‍‌​﻿​​‌‍​‌​﻿​‍‌‍​‍‌‍​‌‌‍‌​‌‍‌‍‌‍​‍‌‍‌‍‌‍​‌​﻿​﻿​‍‌‌​﻿​‍​﻿​‍​‍‌‌​﻿‌‌‌​‌​​‍﻿‍‌﻿‌​‌‍‌‌‌﻿‍​‌﻿‌​​‍​‍‌﻿﻿‌](https://cdn.sanity.io/images/2w8agf2t/production/1503f0fa860c47a8c117e3c2aeb981ef8ffbebcb-1094x996.png)

See [Workspaces](https://rowzero.com/docs/workspaces) for membership and security settings.

---

# Formatting data in Row Zero

Row Zero spreadsheets support the typical formatting options found in spreadsheets, including conditional formatting and keyboard shortcuts.

## Typical spreadsheet formatting

Row Zero supports all of the typical formatting options you would expect in a spreadsheet. Row Zero generally [works like Excel and Google Sheets](/features/excel-compatible) and incorporates typical keyboard shortcuts for formatting (e.g. **Ctrl + B for bold**).  

![spreadsheet formatting options in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/144475836df7d7d87c0d1baf8e25ffb05803ba6f-1899x346.png)

  
**NOTE**: Depending on your screen size and zoom level, you may need to expand the formatting menu by clicking on the 3 dots to the right to expand the full menu.

## Conditional Formatting

![conditional formatting spreadsheets in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/468eaa9537e837d6aa1758a7756d84c2403de3cd-1417x661.png)

  
Conditional formatting can be applied to cell ranges or columns in data tables by clicking the conditional formatting icon in the menu. Note, if you are zoomed in or working on a small screen, you may need to click the three dots to expand the menu to reveal all options.

### Steps to apply conditional formatting:

1. Select the cell range you would like to apply formatting to
2. Click the conditional formatting icon in the menu (see screenshot above) and choose your option:
    - **By Color Scale**:  Click on a color scale to automatically apply the color scale to the selection. Conditional formatting by color scale automatically formats the scale based on the min and max of the specified range. Click **Advanced Options** to customize the min, mid, and maxpoint to adjust the scale.  

      ![apply new conditional formatting rule](https://cdn.sanity.io/images/2w8agf2t/production/3a0cc56cd43c94dcd8258dc0a3fb3a0642d88564-1187x812.png)

    - **By Value**: Click **New rule** to apply a new conditional formatting rule by value  

      ![apply new conditional formatting rule](https://cdn.sanity.io/images/2w8agf2t/production/a6d85c373bfcb8ec5c38ae7c5c6d16b53a95d794-1547x774.png)

3. If applying a new rule **by Value**, you have several options for setting the **Condition** for applying the formatting:
    - Empty
    - Not Empty
    - Greater than
    - Greater than or equal to
    - Less than
    - Less than or equal to
    - Equal to
    - Not equal to
    - Between
    - Not Between
    - Text contains
    - Text does not contain
    - Text starts with
    - Text ends with
    - Text equals
    - Date equals
    - Date before
    - Date after
    - Date between
    - Unique
    - Duplicate
    - Custom Formula
4. Once you've set your condition, you can select the format to apply when cell values meet your condition and you are given a **Preview** of this format.  

   ![apply new conditional formatting rule](https://cdn.sanity.io/images/2w8agf2t/production/ac87a3a66cc23038c980c4bcfebaf42d339b1542-1414x839.png)

5.   
The formatting is automatically applied to the selection as you select the formatting.
6. When done, click **Back to Formats** to manage formatting rules and/or apply new rules, or click the **X** in the top right to close the window.

### Managing conditional formatting rules

You can manage conditional formatting rules by clicking the conditional formatting icon and selecting **Manage rules**. You are also taken to the formatting manager when you click **Back to Formats** when applying a new formatting rule.  

![manage conditional formatting rules](https://cdn.sanity.io/images/2w8agf2t/production/6c9e6c00951e09427045923879ce2f7b4ce75a3f-1412x702.png)

  
Within this window, you can add new rules, click on a rule to edit it, delete rules, and also change the hierarchy of rules by selecting the 6 dot icon to the left of the rule and moving it up or down.

### Removing conditional formatting

To clear conditional formatting, click the conditional formatting icon, select **Clear rules** and choose to either **Clear rules in selection** or **Clear all rules on sheet**. You can also delete specific rules by clicking the trash can icon next to the rule in the **Manage rules** window.  

![conditional formatting spreadsheets in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/ce170654a5d9149f26a76fc3d4522b9d5e162083-1884x810.png)

### Conditional formatting with formulas

Conditional formatting using formulas gives you a wide range of options to format your data. You can easily apply conditional formatting based on another cell, column, or row and use functions in conditional formatting formulas.  

![conditional formatting using formulas](https://cdn.sanity.io/images/2w8agf2t/production/8ee30610a3824e70540c4dfbdc08edd65321a853-1878x789.png)

  
Conditional format formulas start in the top-left cell of the format range and drag down and to the right across the format range by default, but you can use "$" to set absolute references, so formatting is based on a specific cell or range.  
Learn more about [conditional formatting with formulas and view examples here](/blog/conditional-formatting-formulas).

## Format painter

Format painter makes it easy to replicate formats in your workbook. Simply select the formatted cells you’d like to replicate, click the format painter icon, and then click on the cell where you’d like this formatting to be applied (formatting starts from the top-left cell).

[Video](https://cdn.sanity.io/files/2w8agf2t/production/49ccd1df81da24e8626ac4bbe9e029dddb135a94.mp4)

Your selected formatting will be applied to the new area. Format painter works with all types of formatting, including conditional formatting.

If you double-click on the format painter icon, you can repeatedly apply the selected formatting to multiple destination ranges. You can also select a specific range for applying a format, instead of a starting cell. If the destination range is larger than the original, the format will repeat across the range.

## Custom formatting with the TEXT function

The [TEXT function](/docs/spreadsheet-functions#TEXT) lets you apply custom formatting to numbers, dates, and time values and uses custom format codes to give precise control over how data is displayed and presented.  

![custom format numbers and dates with text function](https://cdn.sanity.io/images/2w8agf2t/production/82eac655c770e129425dc7fd8fdd6d5448609f68-1554x532.png)

View our post, [How to format with the TEXT function](/blog/how-to-use-text-function-to-custom-format-numbers-and-dates), for the list of custom format codes and several examples.

## Formatting Data Tables

[Data Tables](/docs/data-tables) are a convenient way to view and manage large data sets and maintain dynamic data connections in Row Zero. When you import data from a data connection (e.g [Snowflake](/docs/snowflake)) or create a [pivot table](/docs/pivot-tables), the data is stored in a data table by default. You can also choose to import a file as a data table or use the DATATABLE function to convert cells into a data table.

Cells within a data table are read-only and cannot be edited or deleted. Data tables support column level transformations, so you can format columns in a data table (and apply formulas referencing columns in a data table) but cannot format individual cells in a data table, with one exception - cells in the data table header row can be formatted individually. You can apply any type of formatting to columns in a data table. Data tables dynamically update as source data updates and all data table formatting is preserved.

**NOTE**: at any time you can right-click and "**Explode**" the data table to normal cells where you can edit and format cells individually. The primary drawback of doing this is that it breaks the connection to the underlying data so the data will not update as source data changes. It is recommended that you right-click &gt; copy &gt; paste the table and explore the copied table so that your original data table remains dynamic and auto-updates.

When you right-click on a data table you'll see a number of options for working with the data.  

![format data tables in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/964cd42b7f91000ff78425aae178a1e39259d8bd-1876x973.png)

In addition to exploding into cells and copying the table, you can manage and hide columns, sort, filter, pivot, and export to CSV or connected data source.

You can also increase the size of a data table by dragging the bottom of the window down.

## Formatting CSV files

CSV files inherently do not have any formatting. CSVs are plain text files where data is separated by commas (comma separated values). When you import a CSV to Row Zero, Row Zero will automatically infer dates and numbers as such, but will not apply any formatting. Once imported, you can format CSV data just like any other Row Zero workbook. If at any point you download your Row Zero workbook as a CSV, you will lose all formatting and any formulas will be converted to values. This is the same behavior in any application including Excel and Google Sheets. When you convert to CSV, data is converted to plain text values. Therefore if you downloaded data from another application like Google Sheets as a CSV and then import into Row Zero, you'll only be importing plain text values.

---

# Functions

Browse all spreadsheet functions available in Row Zero, compatible with Excel and Google Sheets.

---

# Keyboard Shortcuts

Browse all keyboard shortcuts available in Row Zero, including standard and chord-based shortcuts for Mac and Windows.

---

# Pivot Tables in Row Zero

See how to create pivot tables from large datasets and use pivot tables as source data for charts, pivot tables, etc. Explore dynamic pivot tables in Row Zero.

Pivot tables make it easy to summarize, analyze, and explore large datasets. Row Zero pivot tables are dynamic and automatically update as source data changes. There are three pivot modes:

- **Compact**: Best for final presentation of data. Supports nesting fields, collapsible groupings, and subtotals.
- **Tabular**: Best for detailed tables. Shows row fields in separate columns, repeated labels, and bottom subtotals.
- **Data table**: Best for transforming data and creating charts. Supports computed columns, filtering, and sorting.

The documentation below shows how to create and work with pivot tables in Row Zero.

## Configure pivot tables

### Create a pivot table

You can create pivot tables from both cell ranges and [data tables](/docs/data-tables). Here's how:

1. Select the data you want to create a pivot table from, go to **Insert** &gt; **Pivot table**. You can also right-click on a cell in a data table or a selected cell range and select **Pivot**, or use a [keyboard shortcut](/docs/keyboard-shortcuts) to insert a pivot table (Alt, N, V on Windows or Option, N, V on Mac).

   ![insert pivot table](https://cdn.sanity.io/images/2w8agf2t/production/6bc6d00e7033cc6ede2ccaf048a8033e3a88e277-2559x660.png)

2. Select your pivot table location. You can insert to a new sheet or a specific cell on an existing sheet.

   ![set pivot table location](https://cdn.sanity.io/images/2w8agf2t/production/e9d4c562fe198cf3d70dc3fc49a69c2fcf33529a-1305x809.png)

3. An empty pivot table will be created. 
4. Click **Options** to choose your pivot type (Compact, Tabular, or Data Table),  whether source data includes filtered or all rows, and subtotal options. 

   ![empty pivot table](https://cdn.sanity.io/images/2w8agf2t/production/69734a159a6f9021d185139cde8ed540e6d907da-3024x1196.png)

5. Click **Fields** to configure your **Rows**, **Columns**, **Values**, and **Filters** in your pivot table. 
    - **Rows and Columns**: Think of these as "a row for each" or "a column for each" of whatever field you choose. Rows and columns are optional, but it is more common to use Rows. If you select multiple fields, they’ll be nested in groupings.
    - **Values**: Values are the fields you want to calculate. See options for [Value calculations](#value-calculations) below.
    - **Filters**: Filters the source data used in the pivot table. Pivot table filters support the full suite of [filter options](/docs/filter-sort#filter).

Here's an example pivot table that summarizes a dataset of 25 million U.S. flights with Rows grouped by Origin and Destination, Columns grouped by year, and Values for Count of flights (by year). Filters are also added to limit to flights in and out of DEN, LAX, ORD, SEA, SFO.

![example pivot table](https://cdn.sanity.io/images/2w8agf2t/production/c29fb8e1005676e1363db754c9d866bb838c6658-3024x1724.png)

### Value calculations

You can set Values as Columns or Rows. Values have the following built-in calculations:

- **Average** - Average across values for each row/column grouping
- **Count** - Counts the number of values for each row/column grouping
- **Count unique**- Counts the number of unique values for each row/column grouping
- **First** - First instance of a value for each row/column grouping
- **Last** - Last instance of a value for each row/column grouping
- **Max** - Maximum value for each row/column grouping
- **Median** - Median value for each row/column grouping
- **Min** - Minimum value for each row/column grouping
- **Percentiles** - Lets you specify a percentile value to return for each row/column grouping. Percentile options include 10, 25, 50, 75, 90, 95, 99, 99.9.
- **Std dev** - Standard deviation of values for each row/column grouping
- **Sum** - Sum of all values for each row/column grouping
- **Variance** - Variance of values for each row/column grouping

### Group date fields in rows or columns

Pivot tables have built-in date grouping. You can group date fields in rows or columns as seconds, minutes, hours, days, weeks, months, quarters, or years. Below, we update the date grouping from year to month in our pivot table above.

![group pivot table by month](https://cdn.sanity.io/images/2w8agf2t/production/f500c90d54f73b2f144e708f83b1fac1fafa7a49-3024x1722.png)

### Edit and update pivot tables

Pivot tables dynamically update as source data changes. If you edit, add, or delete source data, your pivot table updates automatically.

To edit a pivot table, **right-click** on the table and select **Edit pivot table**. Pivot tables dynamically change as you make edits.

### Move, copy, and delete pivot tables

You can drag pivot tables around a sheet or cut/copy and paste to another sheet. To cut/copy a pivot table, right-click on the top-left cell in a pivot table and select 'Cut' or 'Copy' and then use 'Ctrl + V' to paste. To delete a pivot table, click in the top-left cell of the pivot table and use your delete key.

### Slicers

[Slicers](/docs/slicers) are filters that can be moved anywhere in the workbook. If you have selected **Filtered rows** as your **Source rows**, you can use slicers on your source data to filter your pivot table. To use slicers to filter a pivot:

1. In the **Configure pivot table** window, select **Filtered rows** in the **Source rows** dropdown menu. 

   ![Select filtered rows from the Source rows dropdown](https://cdn.sanity.io/images/2w8agf2t/production/0db9b1045739f3f8035ad2875dac95124e363dcc-1210x714.png)

2. Click a cell in your pivot table's source data and go to **Insert** &gt; **Slicer**. Select the slicer columns and click **Apply**.

   ![create multiple pivot slicers in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/be7097c5a15529e050b9dcd397e4d14c85cd4eff-2556x1185.png)

3. A slicer is created for each column selected, which you can move or cut/paste around your workbook. 
4. Click the slicer dropdown to open the filter. You can select from the list of values, search for a value, or filter by one or more conditions (e.g. &gt;=5). Click **Apply** and the source data will filter accordingly. The pivot table dynamically updates to reflect the filters applied to the source data. See [Slicers](/docs/slicers) to learn more.

   ![pivot table slicers](https://cdn.sanity.io/images/2w8agf2t/production/a7f8a5ff96a7f3ec36716bbaa1ac06f8d1995c9d-1393x822.png)

## Compact and Tabular mode

### Sort

Sort a compact or tabular pivot table on any row or column field, in ascending or descending order. You can sort on labels, values, and totals. 

To sort a pivot table in tabular or compact mode: 

1. In the pivot table, right-click the label, value, or total you want to sort on.
2. Select **Sort**, then choose a sort order.

If the pivot uses [aliases](/docs/pivot-tables#add-aliases-for-column-or-row-labels), sort will operate on the aliases rather than the original value. 

Sorting on a nested field sorts within its grouping. In the example below, sorting on a region would sort the regions within each year. The year order would stay the same.  

![Sort in tabular or compact mode](https://cdn.sanity.io/images/2w8agf2t/production/fde2b5086b834def061431ac26d0eaaf620e70ed-698x461.png)

### Reference pivot table data in formulas

Compact and Tabular mode support cell references, so you can easily reference any cell in a pivot table in downstream formulas.

![reference pivot table data](https://cdn.sanity.io/images/2w8agf2t/production/89f10dca709dfb4f7753fbfa1596d8f40993b0b4-1746x821.png)

### Formats in Compact and Tabular mode

Compact and Tabular mode pivot tables also allow you to format specific cells in the table. Select the cell(s) you would like to format, and then select the desired formatting options in the tool bar.

![format pivot table cells](https://cdn.sanity.io/images/2w8agf2t/production/0c240f5b7a6e8aa16e0422326719ba522b4ce666-1390x889.png)

### Add aliases for column or row labels

You can also add aliases for pivot table row and column labels in standard mode. To add an alias, click on the cell and type the alias. To clear aliases, right click and select **Reset pivot labels**.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/457f19ea79aea9c9f767b4a8eae8fbadeb5af4fc.mp4)

## Data table mode

**Data table** mode offers advanced features for transforming data. You filter, sort, chart, and add computed columns to the pivot table. 

You can switch to data table mode by selecting **Data table** as your Pivot mode.

![select pivot mode](https://cdn.sanity.io/images/2w8agf2t/production/83da849229cfc30d62758c7669d9bd97867320dc-1210x574.png)

> **Note**: Data table mode does not support nested groupings, subtotals, or cell references. You’ll need to switch to **Compact** or **Tabular** mode for those features.

### Filter and sort

Pivot tables in **Data table** mode have built-in filtering and sorting. Click the down arrow in a column header to sort or filter your pivot table.

![filter and sort pivot table](https://cdn.sanity.io/images/2w8agf2t/production/129c00ecabd3590f071389a0acff5fbd675fc582-1396x953.png)

### Create charts from data table pivots

To create a chart from a pivot table in **Data table** mode, select a cell in each pivot table column to include in your chart and go to **Insert** &gt; **Chart** in the header navigation. Charts built from pivot tables update dynamically in sync with the pivot table, as the pivot table changes or is updated with new data. See [Charts](/docs/charts) to learn more.

![create chart from pivot table](https://cdn.sanity.io/images/2w8agf2t/production/c71829cbf1974b7864bb9db66e8f2a8eb695aad7-2125x834.png)

### Add computed columns to data table pivots

To add a computed column to your pivot table, write a formula in the first column to the right of the pivot table and reference a pivot table column in the formula. The formula dynamically fills in every row in the column with the formula applied. See [Data tables](/docs/data-tables) for more information about computed columns.

![add calculated column to pivot table](https://cdn.sanity.io/images/2w8agf2t/production/9780e21856b6671f59c22cc6d0ece033982b7618-2555x1198.png)

### Formats in data table mode

In **Data table** mode, you can reference pivot table columns in formulas using the cell location of the top-left corner of the pivot table and the column name. In the example below, the pivot table starts in cell A1 and has a column named "2024". To use this in a formula, use A1["2024"], which you can see in the example below.

![reference pivot table column in formula](https://cdn.sanity.io/images/2w8agf2t/production/20f06cf91368729dfa9dc8a3da92658b32fae308-2374x588.png)

You can also apply any formatting to your pivot table but formatting is applied to the entire column when in **Data table** mode.

![format pivot table column](https://cdn.sanity.io/images/2w8agf2t/production/b4552e2e1866611667f8b16302f0ffd2e6861c14-2556x890.png)

To hide pivot table columns in **Data table** mode, right-click on the pivot table and select 'Manage columns' and unselect whatever columns you'd like to hide.

---

# Built-in Python Code Window

See how to use native python in spreadsheets with Row Zero. Build custom spreadsheet functions and import python packages into your spreadsheet.

The code window on the right side of all Row Zero workbooks is a Python development environment. It works like a code cell in a Jupyter notebook.

[Video: YouTube](https://www.youtube.com/watch?v=uc96gBK-QFY)

The window enables writing custom Python functions that are referenced in the spreadsheet and importing popular Python libraries. Code written in the code window cannot reference or modify data in the spreadsheet. You can create helper functions that perform complex computations or pull data through python libraries, which can all be used and referenced in the spreadsheet. The code window can be executed by clicking the 'RUN' button or hitting shift+enter.

## Custom functions

Custom Python functions can be defined in the code window. Once defined, they can be used in the spreadsheet by calling the function after an '=.'

```py
# Define a custom function
def foo(x):
    return "Hello " + str(x)

# Type '=foo(x)' in a spreadsheet cell and pass in an argument, like A1.
```

## Import Python Packages

Popular Python packages, like scipy, pandas, and others can be imported into the workbook with the normal python syntax of 'import pandas as pd.' If an attempt to import a module returns a 'modulenotfound' error, the module is not yet supported. See supported Python packages below. Requests for additional Python module/package support can be sent to [support@rowzero.io](mailto:support@rowzero.io).

```python
# Example import Python packages
import pandas as pd
import scipy as sp
```

## Supported Python Packages

- [duckdb](https://pypi.org/project/duckdb/)
- [pandas](https://pypi.org/project/pandas/)
- [polars](https://pypi.org/project/polars/)
- [pyarrow](https://pypi.org/project/pyarrow/)
- [tldextract](https://pypi.org/project/tldextract/)

## Python to Spreadsheet Data Mapping

Spreadsheet types are converted (marshalled) to/from Python as follows:

```
Spreadsheet Type      Python Type

text                  str
number                float
date                  datetime.date
datetime              datetime.datetime
struct                dict
Data Table            polars.dataframe.frame.DataFrame
```

Spreadsheet text variables support Python's string index/slicing syntax (e.g. ="my*string"[0:3] returns "my*")

Marshalling is bidirectional. For example, you can define a Python function that returns a pandas DataFrame and this will be represented in the spreadsheet as a [Data Table](/docs/data-tables), which offers sorting and filtering capabilities.

Range references (e.g. A1:A100) are converted to Python iterables. So if you want to sum the values in a range, define your python function like this:

```python
def foo(range_ref):
     sum = 0
     for x in range_ref:
          sum += x
     return sum

# For this example, type '=foo(A1:A100)' in a spreadsheet cell and it will sum A1:A100 .
```

## Important Notes

- Functions defined in Python are available as formulas in the spreadsheet. Note that these Python functions do not autocomplete as you start to type them.
- Spreadsheet data cannot be referenced in the code window and you cannot modify the spreadsheet from Python.

## Python Examples

Here are a few posts that walk through examples of using Python in Row Zero:

- [Run ARIMA in a spreadheet](/blog/run-arima-model-in-a-spreadsheet)
- [Sensitivity analysis using Python](/blog/sensitivity-analysis)

---

# Sharing and Collaboration

Row Zero supports real-time collaboration, sharing, and access controls for your spreadsheet.

## Workbook Roles

Row Zero supports three different workbook roles: Owner, Editor, and Viewer. Use the 'Share' button in the upper right corner of a workbook to assign a role to a user.  

![Share window](https://cdn.sanity.io/images/2w8agf2t/production/7b4ea55d86c786cc446cf24af2747ccb7ba58450-721x593.png)

### Owner

The owner is the user who created the workbook. The owner has full permissions for the workbook, including adding and removing access to the workbook. In addition, the owner can use the advanced sharing options to set policies on who can create copies of the workbook and who can share the workbook with others.

### Editor

An editor can modify any part of a workbook. If the workbook contains a connected table, the Editor must also have access to the data source or connection backing the table in order to modify or re-run the query.

If the owner has delegated sharing to editors, editors can share with other users but cannot remove an owner from a workbook.

### Viewer

A viewer can view but not modify the workbook.

## Sharing Mechanics

Workbooks can be shared to specific [email addresses](#named-sharing) or with a [link](#link-sharing).

### Named Sharing

![named sharing in row zero](https://cdn.sanity.io/images/2w8agf2t/production/2a8f5a0481ce2888451da603648ebd48bb5d1b51-721x593.png)

  
To share with individuals, enter their email addresses into the sharing modal and click 'Invite.' You can also choose to notify these users via email. Users will be prompted to log in or create a new account in order to open the workbook.

If your organization syncs groups with SCIM, you can also enter group aliases to share the workbook with all Row Zero users in that group. Learn more about SCIM [here](/docs/scim).

[Enterprise](/pricing) customers can also restrict sharing to only users in the workspace or prohibit sharing completely. Learn more about workspace policies [here](/docs/workspaces).

### Link Sharing

![Link sharing in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/b6ef057cfc4166283ec4e2de69a4c186fd93e544-721x593.png)

  
Another option is to use link sharing. When this option is turned on, allowed users can access your workbook via the link, even if they are not explicitly named.

For individual [Free](/pricing) and [Pro](/pricing) customers, link sharing creates public links that are accessible to anyone, with no login required. For [Business](/pricing) customers, link sharing will default to links accessible to only users in your workspace.

[Enterprise](/pricing) customers can restrict link sharing to the workspace or disable it completely. Learn more about workspace policies [here](/docs/workspaces).

### Share a dynamic copy of a workbook

Users can [create a dynamic link](/docs/share-a-template-copy) that will create a copy of the current version of their workbook whenever it is accessed. This can be helpful for sharing dynamic datasets, publishing large datasets, or sharing templates so the sharee can have their own editable copy without impacting the original version.

Here's how to create dynamic copy links for Row Zero workbooks:

1. In the workbook you want to share, click the **Share** button in the top right. At the bottom of the Share window, select **Anyone with link can view** and then click **Copy link**  

   ![share public spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/0db5e428c07012ae4dbac1652c0b53f1831c44a3-1618x898.png)

2. When sharing or publishing the link, add **?copy** to the end of the URL.
3. When anyone visits the link, it will create their own copy of the workbook that they can edit.

**Example**: In our [ZIP Code to State](/blog/zip-code-to-state-county-metro) blog post, we share a public copy of our workbook using the **?copy** URL parameter ([https://rowzero.com/workbook/0F41E1613F44E71C8CB338A4/49?copy](https://rowzero.com/workbook/0F41E1613F44E71C8CB338A4/49?copy)) so that anyone can click the link and open their own editable version of the workbook.

## Create "Open in Row Zero" links

Users can create dynamic [Open in Row Zero](/docs/open-in-row-zero-links) links that will open the latest version of a linked file (e.g. CSV, parquet, etc.) in a new Row Zero workbook. You can create dynamic links to open a file by using the following URL structure: [https://rowzero.com/new?link=INSERT_YOUR_LINK_HERE](https://rowzero.com/new?link=INSERT_YOUR_LINK_HERE) and replace INSERT_YOUR_LINK_HERE with the URL of your file.

## Follow Feature

When reviewing a workbook with another user, you can follow their interactions by clicking their user icon in the upper right-hand corner of the screen adjacent to the 'share' button. Once clicked, your screen will follow their interactions as they move throughout the workbook.  

![Follow feature in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/6b559f4066e7ed6419e333bcd7ff25c3dc498b65-1339x745.png)

## Comments

Right-click to add comments to cells, charts, and tables.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/868cf843d5127031e17c6d6c7f3a00a4a3bd225d.mp4)

You can @ mention specific users, who will be alerted to new comments via the notifications bell in the top right corner.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/26a1369a9d581b6ef976d7d96a671b921443e7c3.mp4)

You can also view all comments in a workbook by going to **View** &gt; **Comments** in the navigation.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/e97fa7330fc0f133ca6d25a8f9463bb32c90d083.mp4)

Charts show a yellow dot in context where the comment was added. Cells with comments have a yellow triangle in the top right corner. Both show the comment on hover.

Resolving a comment hides it in the sheet but it will still show under “Resolved” when you view all comments so that you can track completed work.

## Locking cells and sheets

Workbook editors can now lock cells and sheets in a workbook. To lock cells, select your cells and go to **Data** &gt; **Lock cells** &gt; **Lock selection**.

[Video](https://cdn.sanity.io/files/2w8agf2t/production/d4fb84b677f56ca5de4ae13260dcf350d5579000.mp4)

You can lock and unlock specific cells, specific sheets, or all sheets in the workbook.

Note: You can also lock and unlock cells and sheets from the right-click context menu.

## Version history and snapshots

When collaborating on a spreadsheet, it can be helpful to access [Version History](/docs/version-history) to go back to a past revision if someone made a mistake and/or you want to snapshot a report at month end or snapshot a dashboard for a weekly business review.  

![wbr snapshot in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/89d09d0430bc2685300942dd158f56cff835f11a-1907x826.png)

---

# Shared Data Sources

Row Zero lets data teams share queries as dynamic data sources in your spreadsheet that can be refreshed or scheduled to update automatically.

The **Data Sources** feature lets data teams share queries with teammates as dynamic data sources that can be refreshed or scheduled to update automatically. This is an easy way to give less technical users one-click access to live updating data and makes it easy to get teams using governed "source of truth" datasets. Data sources support both OAuth connections and service accounts:

- If using OAuth, shared data sources run the query as the end user with their connection. Row level security is enforced from the data warehouse and the query can only run if the user has database access.
- If using a service account, the query will always run on the same connection used to create the data source and anyone you share the data source with in your organization can run the query.

## Creating data sources

**Before you start:** Create a data connection. Row Zero has native connectors to [Postgres](/docs/postgres), [Snowflake](/docs/snowflake), [Databricks](/docs/databricks), [BigQuery](/docs/bigquery), [Redshift](/docs/redshift), and more.

To create a data source: 

1. Import data into a connected table. See [Data import](/docs/data-import) for details on querying data connections.
2. When ready to publish your query as a data source, open the **Configure connected table** side pane and click **Publish**. 
3. Select **Create new source** and click **Continue** to set up your data source.

   ![connect spreadsheet to snowflake](https://cdn.sanity.io/images/2w8agf2t/production/05deed2b2900bcd88f892d0b47563c906c159ef5-1907x937.png)

4. Review the query details and click **Continue**.

   ![connect spreadsheet to snowflake](https://cdn.sanity.io/images/2w8agf2t/production/66ded5ecca3321583dca868f17f17f558dc5df25-1910x938.png)

5. Give your data source a name and description.

   ![connect spreadsheet to snowflake](https://cdn.sanity.io/images/2w8agf2t/production/8e8ef9a529be30db9ee7890d21dc53701080a503-1904x935.png)

6. Review the connection details. These will differ depending on whether you are using OAuth or a service account:
    - If using OAuth, shared data sources will run the query as the end user with their connection. Row level security is enforced from the data warehouse and the query can only run if the user has database access.
    - If using a service account, the query will always run on the same connection used to create the data source and anyone you share the data source with in your organization can run the query.
7. After reviewing, click **Continue** to create your data source
8. Click **Share data source** and enter the email addresses you'd like to share with.
9. The data source will now be accessible to both you as the owner and to all users you share it with. Data sources can be accessed in two places:
    - **From any workbook,** select **Connected table** in the **Insert** menu. On the **Data sources** tab, scroll or search for the data source you want and click **Insert into workbook**. Users can optionally update query variables, select columns, and add filters. 

      [Video](https://cdn.sanity.io/files/2w8agf2t/production/c64d2f3465b777f557991709f3601bc532e5ea8d.mov)

    - **From the Home page**, select **Data sources** in the left sidebar. Select your data source and click **New workbook**. The data source will import into a new workbook. 
10. The data source will import into a connected table in the workbook. See [Data Import](/docs/data-import) for more information on working with connected tables, including scheduling refreshes. 

## Using query variables in data sources

When creating a data source, you can optionally create query variables to make it easier to filter data before importing to your sheet. Here's how:

1. When creating your data source, click **Create variable**. Name your variable, select your variable type, optionally assign a default value, and click **Create**. Variables can be text, dates, numbers, or user emails.

   ![create query variable for data sources in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/4e3f7604298e136d284359bde45c9b814cb0bd7d-2182x1350.png)

2. Write your SQL query and assign the query variable to the name of the column you want to query using a `WHERE` clause and double braces (see screenshot below). Click **Run query**.

   ![create query variable for data sources in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/2c34b1918a26c3c3be7e3f94fb5b6bcf6df9877c-2192x1568.png)

3. After the query runs successfully, click **Publish** in the top right corner.
4. When inserting this data source into a workbook, the user is prompted to input a value for the query variable.

   ![create spreadsheet from data source with query variable](https://cdn.sanity.io/images/2w8agf2t/production/dd82622d6e019437adf7a9c7d722bb07e3c1f74e-2352x1594.png)

5. A new workbook will be created from the data source, filtered based on the query variable.
6. At any time, you can change the value for the query variable and **Run query** to filter your dataset to the updated query variable value.

   ![edit spreadsheet by changing query variable](https://cdn.sanity.io/images/2w8agf2t/production/569f85c4e473c1fa5f7b0987b527077adf9c84c2-1990x1718.png)

## Related

- [Data import](/docs/data-import)
- [Data tables](/docs/data-tables)
- [Tutorial for query writers](/docs/query-writer-tutorial)
- [Troubleshooting data imports](/docs/troubleshooting-data-import)

---

# Slicers in Row Zero

Add slicers to pivot tables, charts, and dashboards in Row Zero. Slicers are full-featured, portable filters that can control multiple charts and pivot tables.

A slicer is an interactive filter that can be moved anywhere in the workbook and makes it easy to quickly filter multiple pivot tables and charts at once. Slicers filter the underlying source data, which dynamically filters everything that references the source data. You can place the slicer next to your charts and pivot tables to make it easy to filter underlying data on another sheet. The documentation below shows how to create and work with slicers in Row Zero.

## How to create a slicer

You can add slicers to pivot tables, charts, data tables, and cell ranges. To add a slicer, select your data and go to 'Insert' in the header navigation and select 'Slicer'.  

![add slicer in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/ae2776f45567c4e9f7b78c34aacd95751591f08d-1915x480.png)

## How to add pivot table slicers

You can add a slicer to pivot table source data and then place the slicer next to the pivot table to make it easy to slice the pivot table data further. Here's how:

1. Create a [pivot table](/docs/pivot-tables) from a data table or a cell range with filters applied.  

   ![insert pivot table in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/c13dc7b273d21733275491693e76f59be34256f4-2540x1295.png)

2. Navigate to your source data, click on a cell and go to 'Insert', 'Slicer', and select the columns you'd like to create a slicer for. Click 'Apply'.  

   ![create multiple slicers in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/83c6ed7d21ac4eb048ab99f7b5575e67eac5fb16-2553x1296.png)

3. A slicer is created for each column selected. Click the slicer dropdown to open the filter. You can select from the list of values, search for a value, or filter by one or more conditions (e.g. &gt;=5). Click 'Apply' and the source data will filter accordingly. The pivot table dynamically updates to reflect the filters applied to the source data.  

   ![filter slicer in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/88a0ce0b28716f6a5fb91f8270477ab31694182c-1548x830.png)

4. You can further configure your slicer by double clicking on it. You can rename the slicer and also click on the source icon next to the sliced column to go back to the source range.  

   ![configure slicer in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/541b3a15d4e26494ef5a9332bebcfbccbfe42498-2554x1296.png)

Note: You can also add slicers to the pivot table results to make it easy to filter pivot table results from another location.

## Moving and deleting slicers

You can move your slicer anywhere in the workbook. You can drag it around the sheet and right-click to open a context menu where you can configure your slicer, delete your slicer, or cut and paste your slicer to another sheet.  

![cut and paste slicer in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/3cd7d49a4073aca1003bd28fff84bf618fe4f47d-738x432.png)

  
Typically slicers are moved to dashboard sheets or next to charts and pivot tables where summary data is presented.

## How to add chart slicers

Adding slicers to a chart is just as simple. If you've already added a slicer to your pivot table, the slicer will also control any charts you create from the pivot table data.  

![pivot chart slicer in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/d95bed29593a7192f8477e43908142c04199b246-1729x658.png)

  
If you haven't yet created a slicer, you can add a chart slicer by adding a slicer to the source data for the chart. If your source data is a cell range, just be sure to first add filters to the range.

## How to connect slicers to multiple pivot tables and charts

You can connect slicers to multiple pivot tables and charts if they have the same source data. Simply add a slicer to the source data and it will control everything that references the source data. You can use this to build a dashboard sheet that controls multiple pivot tables and charts at once.  

![spreadsheet dashboard slicers](https://cdn.sanity.io/images/2w8agf2t/production/83663652f283ed51fc4f55e319752bd5f4e00c9a-1899x1005.png)

If your source data is a [connected table](/docs/data-tables#connected-tables), then any slicers added to the connected table will work in sync as your source data updates. You can manually re-run connected tables or schedule auto-refresh to automate updates with slicers applied.

Note, slicers can only control multiple pivot tables when each of those pivot tables use the same source data.

## Filtering formulas with slicers

By default, slicers do not filter formula functions. However, you can use the tilde operator "**~**" in formulas that reference data with slicers applied to also have formulas filter in sync with slicers (see screenshot below). The **~** is added right before the cell reference in the formula.  

![filter formulas with slicers](https://cdn.sanity.io/images/2w8agf2t/production/40e0d94b7af67891d5a1d5b39ffd37fb4314592d-1726x811.png)

## Slicers vs filters

Slicers are full-featured, portable [filters](/docs/filter-sort#filter). Slicers are connected to their underlying filters and actively change the filters applied to the data.  

![slicers control filters in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/51089dae39bc9ed9e67d96e1575d4874096e9862-1549x694.png)

As a result, slicers can do everything filters can do. You easily filter on one or more conditions (e.g. &gt;=0), search values, select all, unselect all, and filter datetime groupings like day, week, month, etc.  

![slicers control filters in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/80c5cb1ca5f10a3e4b8810a31c7590060b061445-1874x749.png)

The only difference between slicers and filters is slicers can be moved anywhere in the workbook. As a result, slicers are typically placed on dashboards or next to pivot tables and charts to provide an easy way to control the filters of source data elsewhere in the workbook.

Note, because slicers are connected to their source filters, if you go to the source data and attempt to adjust the filter, you'll see a message that says "This column's filters are controlled by a slicer".  

![filter controlled by slicer in spreadsheet ](https://cdn.sanity.io/images/2w8agf2t/production/e4efa9ea43c52ba81db9feff64973ef51f6e138e-1536x718.png)

  
You'll need to delete the slicer to use the filter again at its source.

## Replacing deleted slicer columns

If you remove the underlying column your slicer relies on, your slicer will show an error state. Double-click on the slicer to pick a different column.  

![slicer error - no column select](https://cdn.sanity.io/images/2w8agf2t/production/9a942fdaf26fb221752017a1f1293a67d82ad895-1500x616.png)

## Slicers video tutorial

Here's a tutorial of how to create slicers connected to multiple pivot tables and charts that share the same source data:

[Video: YouTube](https://www.youtube.com/watch?v=CEg-Y4gkHRo)

---

# Templates

Publish workbooks as templates to share a workbook without sharing stored query data.

Templates are published workbooks. When you open a template, you create your own temporary copy in a new workbook.

Templates do not store query data. When a user opens a template, any included queries automatically run with the user’s credentials. This is especially useful in cases where RLS rules prevent users from directly sharing workbooks.

Because each user creates their own copy when opening a template, they can also filter or modify the sheet without impacting other users. Any changes they make to their copy will not change the original template and vice versa.

> **Note:** Templates are currently in beta and available to select Enterprise customers.

## Publishing templates

You can create a template from any workbook. Here’s how:

1. Create your workbook.
2. When you’re ready to publish, select **Publish as template** from the **File** menu.
3. Select **Create new template**, review the template contents, create a Name and Description (these will be visible to anyone who you share it with), and then click **Create template**. 

   ![Publish workbook as template](https://cdn.sanity.io/images/2w8agf2t/production/fa7adb2fd40bd1d2c153b42d28d7f8e04dc3a411-1761x1114.png)

## Sharing templates

To share a template with other users:

1. Find your template in your [Templates list](/templates) and click the three dots next to the template name.
2. Select **Details**. This will open the template details page.  

   ![Open template details page](https://cdn.sanity.io/images/2w8agf2t/production/27f6b3713e582bfa5b220aa3d393dc4c79ae07ff-3022x759.png)

3. Select **Share**. Add users or groups, check the box next to **Email invited users** to notify them via email, then click **Close**.
4. If you’d like to share a direct link to the template with other users, you can either give them a link to the Templates detail page by copying the details page URL or give them a link that opens a new copy by clicking **Copy link to open**.  

   ![Open template details page](https://cdn.sanity.io/images/2w8agf2t/production/d10d4be70056b7afe4bff53b62eff3636816fd37-3022x927.png)

> **Note:** If your template contains a connected table, your users will also need access to the connection(s) and/or data source(s) embedded in that template. Learn how to share data sources [here](/docs/shared-data-sources#how-to-share-queries-as-data-sources).

## Using templates

You can access any templates that you created or that have been shared with you from your [Templates list](/templates).

To open the template, click on the template name. A temporary copy of the workbook will open.

This copy will not automatically save to your workbooks. If you’d like to save your copy, click **Save to my workbooks** in the top right corner. If you do not save your copy, it will be deleted.

![Save template to workbooks list](https://cdn.sanity.io/images/2w8agf2t/production/be0dea0ce49af235c92cbcb8ea600dcf21d18bb5-1982x1164.png)

> **Note:** If you’re using a template as a dashboard, there’s no need to save your copy. Opening a new, temporary copy each time you access the workbook ensures you always have the most current version.

---

# Connect Athena to Row Zero

Use the built-in Athena connector to import millions of rows and build Athena connected spreadsheets.

Row Zero makes it easy to connect Amazon Athena to your spreadsheets with our built-in Athena connector. Follow the instructions below to connect to Athena, share your connection with others, and import data to a spreadsheet.

## Create your Athena connection

Follow the instructions below to connect to Amazon Athena.

### Step 1: Create an AWS bucket for Athena to write results which Row Zero will read.

You need to create a bucket in the same account and region that your Athena is running in. We recommend a name like **s3://YOURCOMPANY-ROWZERO-ATHENA-RESULTS/**.

![create aws bucket for athena](https://cdn.sanity.io/images/2w8agf2t/production/7c6e540f814fdf2babc2df5058f3bd8b426407f0-548x818.png)

Only temporary data goes into this bucket, so we recommend creating a lifecycle policy to delete all data from this bucket after 1 day.

![create bucket lifecycle rule](https://cdn.sanity.io/images/2w8agf2t/production/f1f5dc7b9cb7d08cdc58b7ed44c0ee3ba6701e40-835x848.png)

![bucket deletion](https://cdn.sanity.io/images/2w8agf2t/production/825ee30fa343d3eea1525457d628b0e280f6ea60-816x422.png)

### Step 2: Create an AWS role that can execute queries against Athena tables (and write results to the bucket above).

Create a role that Row Zero will use to execute Athena queries on your behalf and read the results. The role must have a trust policy that allows the Row Zero account (732940336628) to use the role, using the connection-specific External ID that is provided when you go to create an Athena connection ([see Step 3 below](#step-3-create-the-connection-in-row-zero-that-will-use-the-role-created-above)).

![aws role trust relationship](https://cdn.sanity.io/images/2w8agf2t/production/9795dedcc1b4889d50f32ac9817c588d4d2817cf-1035x523.png)

This role must have permissions to use Athena and permissions to read the results. You can choose to use predefined permissions to Athena/S3 or attach inline policies.

Here's an example inline policy for reading results:

```sql
{
   "Version": "2012-10-17",
   "Statement": [{
       "Effect": "Allow",
       "Action": [
           "s3:Get*",
           "s3:List*",
           "s3:Describe*",
           "s3:PutLifecycleConfiguration",
           "s3:PutBucketVersioning"
       ],
       "Resource": [
           "arn:aws:s3:::{YOUR_RZ_ATHENA_RESULT_STAGING_BUCKET}"
       ],
       "Condition": {
           "StringEquals": {
               "aws:ResourceAccount": "{YOUR_AWS_ACCOUNT_ID}"
           }
       }
   },
   {
       "Effect": "Allow",
       "Action": [
           "s3:Get*",
           "s3:List*",
           "s3:Describe*",
           "s3:AbortMultipartUpload",
           "s3:PutObject",
           "s3:DeleteObject"
       ],
       "Resource": [
           "arn:aws:s3:::{YOUR_RZ_ATHENA_RESULT_STAGING_BUCKET}/*"
       ],
       "Condition": {
           "StringEquals": {
               "aws:ResourceAccount": "{YOUR-AWS-ACCOUNT-ID}"
           }
       }
   }]
}
```

Here is a starting point for an Athena access policy, but it needs be updated to ensure it has access to run queries against your datasets. You should narrow the permissions in the example as appropriate.

```sql
{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Sid": "BaseAthenaPermissions",
           "Effect": "Allow",
           "Action": [
               "athena:*"
           ],
           "Resource": [
               "*"
           ],
           "Condition": {
               "StringEquals": {
                   "aws:ResourceAccount": "{YOUR-AWS-ACCOUNT-ID}"
               }
           }
       },
       {
           "Sid": "BaseGluePermissions",
           "Effect": "Allow",
           "Action": [
               "glue:GetCatalog",
               "glue:GetCatalogs",
               "glue:GetDatabase",
               "glue:GetDatabases",
               "glue:GetTable",
               "glue:GetTables",
               "glue:GetPartition",
               "glue:GetPartitions",
               "glue:BatchGetPartition",
               "glue:StartColumnStatisticsTaskRun",
               "glue:GetColumnStatisticsTaskRun",
               "glue:GetColumnStatisticsTaskRuns",
               "glue:GetCatalogImportStatus"
           ],
           "Resource": [
               "*"
           ]
       }
   ]
}
```

### Step 3. Create the connection in Row Zero that will use the role created above.

From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

Select Athena as your connection type and fill in the connection details corresponding to the steps above. Note that the External ID you see here is what you should use in [Step 2 above](#step-2-create-an-aws-role-that-can-execute-queries-against-athena-tables-and-write-results-to-the-bucket-above).

![athena connector in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/a3091392679997c6271399d921b4010b5922f74a-522x681.png)

Once all the information is entered, click 'Test connection' to ensure the information is correct. If the test returns green, you're good to go and can click 'Create connection.'

### Step 4: If needed, share your connection

If you would like other users to be able to use this role to query Athena from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:

1. Navigate to your [Connections](/connections) page.
2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
3. Enter the emails of the users or groups that should have access to this connection.

## Write a query to import data from Athena

Now that you have created an Athena connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect BigQuery to Row Zero

Use the built-in BigQuery connector to import millions of rows and build BigQuery connected spreadsheets.

Row Zero makes it easy to connect BigQuery to your spreadsheets using OAuth. The BigQuery connector is available for [Enterprise](/pricing?ref=BQ) customers. If you're already a customer, please [contact us](/contact?ref=BQ) to set up BigQuery OAuth. If you're not yet a customer, [schedule a demo](/schedule-demo?ref=BQ) to learn more.

## Create your BigQuery connection

Row Zero supports connecting to BigQuery via BigQuery OAuth. If your organization has not yet set up BigQuery OAuth in Row Zero, please [contact us](/contact?ref=BQ) to get set up. If your organization is already connected, follow the instructions below to create your connection:

1. From any Row Zero workbook, click on the 'Data' icon in the upper right-hand corner and then click the button to '+ Add connection.' 

   ![connect spreadsheet to bigquery](https://cdn.sanity.io/images/2w8agf2t/production/70912f455379154ebfd5c42e6cbbacde051a0909-1905x534.png)

2. If your organization has set up BigQuery OAuth in Row Zero, you'll see it as an option under 'Connection type'. Click 'Connect to BigQuery' and you'll be prompted to sign in. 

   ![bigquery connector](https://cdn.sanity.io/images/2w8agf2t/production/57248c7d5bfdf1e1e7a195e544a0427be22ff200-837x818.png)

3. After signing in, you'll get a message 'Succeeded. You can close this window'. Your Username will automatically fill in under Connection details  
and you can click 'Create connection' to finish connecting. 

   ![Add BigQuery connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/7a62d9dfd9e8b69d392a51ea72b50e9f4a366eb1-842x819.png)

## Write a query to import BigQuery data

Now that you have created a BigQuery connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect Databricks to Row Zero

Use the built-in Databricks connector to import millions of rows and build Databricks connected spreadsheets. Connect Databricks via OAuth and personal access token.

Row Zero's built-in Databricks connector makes it easy to connect your spreadsheets to Databricks using a personal access token or Databricks OAuth. Row Zero supports all cloud platforms (AWS, Azure, and GCP).

## Choosing the right authentication method

**Personal Access Token** authentication is appropriate for individual Row Zero accounts or for connecting service accounts in larger organizations. For the second use case, we recommend creating a dedicated user in Databricks for this purpose, then connecting Row Zero using personal access token. Once the connection is created in Row Zero, you can securely share it with the appropriate people in your organization.

**OAuth** is the best authentication method for organizations where users have their own Databricks credentials. Any queries using OAuth connections respect the database permissions of the person who runs the query, including RLS and RBAC.

## Connect using Personal Access Token

Follow the instructions below to connect to Databricks using a Personal Access Token.

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose Databricks. The Databricks connector requires a few pieces of information, defined below.

   ![Databricks connector in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/8fd3caab2fc7de41a6b5308e8c3c5bd9a6c59688-847x841.png)

    - **Connection name:** This field can be anything that helps identify the data source being connected (e.g. "Production Data" or "Product Metrics"). It will be visible to all users who have access to this connection.
    - **Server hostname:** This is the Databricks warehouse name, which can be found in your Databricks portal under the SQL Warehouses menu. In SQL Warehouses, click on the warehouse you wish to connect to. Your server hostname is listed under 'Connection details' and is the long string of letters and numbers under "server hostname" at the top of the screen (e.g. `cbd-9hfliu9u-83jd.cloud.databricks.com`).

      ![Databricks server hostname](https://cdn.sanity.io/images/2w8agf2t/production/11a842d1cd3014383fffa82e62eb3c0cfd43415c-1919x1024.png)

    - **Access Token:** Your access token can be generated by going to your account icon in the upper right-hand corner of the Databricks portal, selecting 'Settings' and then 'Developer.' Click the blue button to generate your access token. If you do not see a blue button, contact your Databricks account admin.

      ![Databricks access token screen](https://cdn.sanity.io/images/2w8agf2t/production/a607c70f4f062b09faf537c900e9ce90297905b7-1919x998.png)

      ![Databricks generate access token](https://cdn.sanity.io/images/2w8agf2t/production/2cc71e403aa318cc5b2af283f5640a2b051ac1d9-1919x360.png)

3. Once all the information is entered, hit 'Test connection' to ensure the information is correct.
4. Once the connection turns green, you can select which of your Databricks SQL Warehouses you want to use for Row Zero queries and click '+ Add source'.

   ![Databricks choose warehouse](https://cdn.sanity.io/images/2w8agf2t/production/d0d9e3f55ea1bf366e9b4f3c1b8972d6c2b0b3a0-2574x768.png)

5. If you would like other users to be able to use this personal access token to query Databricks from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:
    1. Navigate to your [Connections](/connections) page.
    2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
    3. Enter the emails of the users or groups that should have access to this connection.

## Connect using Databricks OAuth

With OAuth, each person logs in with their own Databricks account, so queries respect their permissions, including row-level security and role-based access control.

### Step 1: Create a Row Zero app connection in Databricks (Databricks account admin)

Follow the Databricks documentation [here](https://docs.databricks.com/aws/en/integrations/enable-disable-oauth) to add an app connection with:

- **Application name**: Row Zero
- **Redirect URL**: https://oauth.rowzero.com/oauth/authorization-code/1
- **Access scopes**: **_sql_** and _**offline_access**_ (required). Add _**genie**_ and _**ai-gateway**_ too if you want to use Databricks Genie and models served through Unity AI Gateway.
- **Client secret**: generate a client secret

Copy the client ID and client secret. Databricks shows the secret only once. Share them with whoever will create the connection in Row Zero, using a secure channel.

### Step 2: Create the connection in Row Zero

1. Open Create connection, choose Databricks, and name the connection.

![](https://cdn.sanity.io/images/2w8agf2t/production/7ec12e929baa0592e0688cc0b95e4fee68975e26-1418x1148.png)

2. Select **OAuth** and enter the following:

    - Enter the Server hostname without https://, e.g. _**dbc-xxxxxxxx-xxxx.cloud.databricks.com**_ or _**adb-xxxxxxxxxxxxxxxx.x.azuredatabricks.net**_.
    - Enter the **Client ID** and **Client secret** from step 1.
    - Under Permissions, check **Genie** and **Unity AI Gateway** only if the app connection includes the genie and ai-gateway scopes. Otherwise logging in will fail.
    - Optional: check **Share with everyone in your organization** so everyone in your domain can use the connection. Each person still logs in with their own Databricks account.
    - Click **Continue**, log in to Databricks in the window that opens, choose a SQL warehouse, and click Save.

      ![](https://cdn.sanity.io/images/2w8agf2t/production/3b4433a85a15dc12e1a48b4e7c562c16f7159e78-792x386.png)

3. Click **Log in to Databricks**

![](https://cdn.sanity.io/images/2w8agf2t/production/1ebad751715c7f5b4ebc4c2f32c937a670c13c9a-1042x822.png)

4. Enter your Databricks account email and grant access to Row Zero

![](https://cdn.sanity.io/images/2w8agf2t/production/bee09027d1421e7e6d9a23a5c4431b3c726ff9c3-986x772.png)

5. Once authenticated, on the Row Zero tab select the appropriate **warehouse** for the connection.

The connection only appears in Row Zero once you've logged in and saved. Colleagues using a shared connection are asked to log in the first time they use it.

## Enable Databricks Genie

[Databricks Genie](https://docs.databricks.com/en/genie/index.html) lets users ask natural language questions against Databricks data. Row Zero discovers the Genie Spaces that are available to a Databricks connection and can use a selected space to generate SQL.

**Prerequisites to enable Databricks Genie in Row Zero:**

- Admin access to the Databricks account and workspace.
- At least one Genie Space
- Genie enabled in Databricks. See [Databricks Genie documentation](https://docs.databricks.com/aws/en/genie/set-up#technical-requirements-and-limits) for requirements.
- At least one Genie Space for the data users should query.
- A Row Zero Databricks connection in the workspace where users will use AI generated queries.
- Enterprise customers must also [configure an AI provider](/docs/ai) in Row Zero. 

### Enable Genie in Databricks

To access Genie in Row Zero, you’ll first need to enable Genie in Databricks. 

1. Genie Spaces use Databricks partner-powered AI features, so an account admin should confirm that partner-powered AI features are enabled at the account level and not disabled for the workspace. See [Databricks' Partner-powered AI features documentation](https://docs.databricks.com/aws/en/databricks-ai/partner-powered).
2. Confirm the required workspace entitlements and permissions. 
    - Space authors need the Databricks SQL workspace entitlement, `CAN USE` on a pro or serverless SQL warehouse, `SELECT` privileges on the Unity Catalog data used in the space, and `CAN EDIT` or `CAN MANAGE` on the Genie Space.
    - Space users need Consumer access or Databricks SQL access, `SELECT` privileges on the underlying Unity Catalog objects, and `CAN VIEW` or `CAN RUN` on the Genie Space.

For more detail, see [Databricks' Genie Space setup guide](https://docs.databricks.com/aws/en/genie/set-up).

### Create and share a Genie Space

Next, create a Genie Space in Databricks for the business domain you want Row Zero users to query. See Databricks' guide to [creating and managing a Genie Space](https://docs.databricks.com/aws/en/genie/set-up).

1. Add the Unity Catalog tables or views that should be available for questions.
2. Choose a pro or serverless SQL warehouse for the space.
3. Add descriptions, instructions, example SQL queries, and common questions that match your organization's terminology.
4. Test the Genie Space in Databricks with questions similar to what Row Zero users will ask.
5. Share the Genie Space with the users, groups, or service account used by the Row Zero connection.

The Databricks identity used by the Row Zero connection must be able to list and use the Genie Space. If Row Zero users connect with OAuth, each user needs access to the Genie Space. If Row Zero uses a personal access token for a service account, the service account needs access.

### Enable Genie in your Row Zero connection

Finally, you need to add the `genie` scope.

- If you’re a PAT to authenticate, enable the `genie` permission when creating the PAT. Row Zero will use the token to discover accessible Genie Spaces. If you have an existing Databricks Connection that does not have the `genie` scope, create a new PAT with the `genie` scope and then update your connection on the [connections](/connections) page. 
- If you’re using an OAuth Connection, you need to add the `genie` OAuth scope to the Row Zero Databricks app connection. If you have an existing connection without the `genie` scope, contact support@rowzero.io after adding it to complete the integration. 

### Genie troubleshooting

- **No Genie spaces are accessible:** Create a Genie Space, share it with the Row Zero connection identity, and confirm the identity has the required Databricks SQL entitlement and data permissions. For PAT connections, confirm the PAT was created with the Genie permission enabled.
- **OAuth connection cannot use Genie:** Confirm the Row Zero Databricks app connection includes the genie scope and that Row Zero support has completed the Row Zero-side OAuth update.
- **Permission denied:** Review Genie Space ACLs, Unity Catalog SELECT privileges, workspace entitlements, and whether the user or service account can access the selected SQL warehouse.

## Write a query to import Databricks data

Now that you have created a Databricks connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect Oracle to Row Zero

Use the built-in Oracle connector to import millions of rows and build Oracle connected spreadsheets.

Row Zero's built-in Oracle connector makes it easy to connect your spreadsheets to Oracle. Follow the instructions below to connect to Oracle, share your connection with others, and import data.

## Create your Oracle connection

To create a new connection:

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose Oracle. The Oracle connector requires a few pieces of information defined below. 

   ![oracle connector](https://cdn.sanity.io/images/2w8agf2t/production/9929840ee7e1a4dd3bb9d5ebbcdf046474c6d7e9-859x879.png)

    - **Connection name** - This field can be anything that helps identify the data source being connected (e.g. "Production Data" or "Product Metrics"). It will be visible to all users who have access to this connection.
    - **Host** - This is the Oracle address that typically takes the form of a string like 'database.mydomain.com'.
    - **Port** - This is often 1521.
    - **User** - This is the username for your Oracle database.
    - **Password** - The password used to log into your Oracle Database.
    - **Database** - The name of the Oracle database being connected to.
3. Once all the information is entered, hit 'Test connection' to ensure the information is correct. If the test connection icon turns green and says 'Connected', proceed by clicking on 'Create Connection.'

> **Note:** If your database is behind a VPN or firewall, you'll need to allow the Row Zero IP addresses: 18.217.97.112 and 18.224.119.220.

## Share your connection with other users

If you would like other users to be able to use this user/password to query Oracle from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:

    1. Navigate to your [Connections](/connections) page.
    2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
    3. Enter the emails of the users or groups that should have access to this connection.

## Write a query to import Oracle data

Now that you have created an Oracle connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect Postgres to Row Zero

Use the built-in Postgres connector to import millions of rows and build Postgres connected spreadsheets.

Row Zero makes it easy to connect to Postgres with a built-in Postgres connector. Follow the instructions below to connect to Postgres, share your connection with others, and import data to a spreadsheet.

## Create your Postgres connection

Row Zero supports two ways to authenticate to PostgreSQL. Use whichever fits your security posture:

- **Password-based Authentication**
- **AWS IAM Role-based Authentication** (via AWS IAM / RDS IAM DB auth)

To create a new connection:

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose Postgres. The Postgres connector requires a few pieces of information defined below. 

   ![postgres connector](https://cdn.sanity.io/images/2w8agf2t/production/1ffdb13bc2fa7c5c97981aaa608346fe0b5d1bb7-707x872.png)

    - **Connection name** - This field can be anything that helps identify the data source being connected (e.g. "Production Data" or "Product Metrics"). It will be visible to all users who have access to this connection.
    - **Host** - This is the PostgreSQL address that typically takes the form of a string like 'database.mydomain.com'.
    - **Port** - This is often 5432.
    - **Database** - The name of the PostgreSQL database being connected to.
    - **User** - This is the username for your PostgreSQL database.

### Password-based Authentication

For password-based authentication, populate the following:

- **Authentication method** — Password
- **Password** — The password used to log into your PostgreSQL Database.

Once all the information is entered, hit 'Test connection' to ensure the information is correct. If the test connection icon turns green and says 'Connected', proceed by clicking on 'Create connection'.

![Add PostgreSQL as source screen in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3cd222f3742936c2af9a5a7dd8f86fdf7dcbddc2-721x471.png)

> **Note** - If your database is behind a VPN or firewall, you'll need to allow the Row Zero IP addresses: 18.217.97.112 and 18.224.119.220.

### AWS IAM Role-based Authentication (AWS IAM / RDS)

For AWS IAM-based authentication, populate the following:

- **Authentication method** — AWS IAM
- **Role ARN** — the ARN of the role to connect to RDS PostgreSQL that can connect to RDS and assume a role (see below for instructions to setup).
- **AWS Region** — The AWS region your RDS Postgres instance is located in.
- **External ID** - This is a value will be populated by the Row Zero application and must be included in your AWS IAM role trust policy (see below for instructions to setup).

Once all the information is entered, hit 'Test connection' to ensure the information is correct. If the test connection icon turns green and says 'Connected', proceed by clicking on 'Create connection'

![Add PostgreSQL as source screen in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3cd222f3742936c2af9a5a7dd8f86fdf7dcbddc2-721x471.png)

> **Note** - If your database is behind a VPN or firewall, you'll need to allow the Row Zero IP addresses: 18.217.97.112 and 18.224.119.220.

**AWS IAM Role-based Authentication Setup Instructions**

Create an AWS IAM Role for Postgres Access that will be assumed by Row Zero via STS in order to connect to your database.

- Create a new IAM Role in the same account as your PostgreSQL / RDS instance.
- Attach a trust policy that allows Row Zero's IAM principal (or account) to assume this role, with an External ID condition.
- Attach permission policies allowing it to call `rds-db:connect` to your target DB user.
- Configure the RDS / PostgreSQL instance to have IAM authentication enabled.
- Create a PostgreSQL database user that your IAM role will connect as and grant the _**rds_iam**_ role to that user (`GRANT rds_iam TO <username>;`). This enables the user to authenticate using AWS IAM tokens.

**Sample trust policy** (you must substitute in the External ID that Row Zero provides during setup):

```json
{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "AWS": [
                   "arn:aws:iam::732940336628:role/DataSourceProxyRole"
               ]
           },
           "Action": "sts:AssumeRole",
           "Condition": {
               "StringEquals": {
                   "sts:ExternalId": "<EXTERNALID_FROM_ROW_ZERO>"
               }
           }
       }
   ]
}

```

**Permissions policy example** (scope to your DB instance / user):

```json
{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": "rds-db:connect",
           "Resource": "arn:aws:rds-db:<region>:<account-id>:dbuser:<db-resource-id>/<database-username>"
       }
   ]
}

```

## Share your connection with other users

If you would like other users to be able to use this credential to query Postgres from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:

    1. Navigate to your [Connections](/connections) page.
    2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
    3. Enter the emails of the users or groups that should have access to this connection.

## Write a query to import Postgres data

Now that you have created a Postgres connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect Redshift to Row Zero

Use the built-in Redshift connector to import millions of rows and build Redshift connected spreadsheets.

Row Zero's built-in Redshift connector makes it easy to connect your spreadsheets to Redshift. Follow the instructions below to connect to Redshift, share your connection with others, and import data to a spreadsheet..

## Create username / password connection

Follow the instructions below to connect to Redshift using a username and password.

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose Redshift. The Redshift connector requires a few pieces of information, defined below:

   ![redshift connector in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/a9057d5dc42420ff17778339cb6b70cd70c13862-686x827.png)

    - **Connection name** - This field can be anything that helps identify the data source being connected (e.g. "Production Data" or "Product Metrics"). It will be visible to all users who have access to this connection.
    - **Host** - This is the Redshift address that typically takes the form of a string like '12345xyz.redshift.amazonaws.com'.
    - **Port** - This is always 5439.
    - **User** - This is the username for your Redshift database.
    - **Password** - The password used to log into your Redshift Database.
    - **Database** - The name of the Redshift database being connected to.
3. Once all the information is entered, hit 'Test connection' to ensure the information is correct. If the test connection icon turns green and says 'Connected', proceed by clicking on 'Create'.

> **Note** - If your database is behind a VPN or firewall, you'll need to allow the Row Zero IP addresses: 18.217.97.112 and 18.224.119.220.

![](https://cdn.sanity.io/images/2w8agf2t/production/f074a6045f91dc5b8a11e2943bb16a155507ef0f-1020x186.png)

1. If you would like other users to be able to use this user/password to query Redshift from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:
    1. Navigate to your [Connections](/connections) page.
    2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
    3. Enter the emails of the users or groups that should have access to this connection.

## Create AWS IAM role connection

### Setup an AWS IAM role to connect to Redshift with

1. Login to your AWS console and create a new AWS IAM role in the same AWS account as your Redshift cluster or workgroup.
2. Attach the **trust policy**, replacing `&lt;EXTERNALID_FROM_ROW_ZERO&gt;` with the External ID shown in the Row Zero connection form (see below).

   ```json
   {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws:iam::732940336628:role/DataSourceProxyRole"
                  ]
              },
              "Action": "sts:AssumeRole",
              "Condition": {
                  "StringEquals": {
                      "sts:ExternalId": "<EXTERNALID_FROM_ROW_ZERO>"
                  }
              }
          }
      ]
   }
   ```

3. Attach the permissions policy for your cluster type (provisioned or  
serverless).
    - Serverless Cluster

      ```json
        {
           "Version": "2012-10-17",
           "Statement": [
               {
                   "Effect": "Allow",
                   "Action": "redshift-serverless:GetCredentials",
                   "Resource": "arn:aws:redshift-serverless:<region>:<account-id>:workgroup/<workgroup-id>"
               }
           ]
        }
      ```

    - Provisioned Cluster

      ```sql
        {
           "Version": "2012-10-17",
           "Statement": [
               {
                   "Effect": "Allow",
                   "Action": "redshift:GetClusterCredentialsWithIAM",
                   "Resource": "arn:aws:redshift:<region>:<account-id>:dbname:<cluster-identifier>/<database-name>"
               }
           ]
        }
      ```

### Grant the IAM role the appropriate permissions in Redshift

1. With IAM authentication, Row Zero logs into Redshift as the user  
IAMR:&lt;role-name&gt;, where &lt;role-name&gt; is the final segment of your Role ARN (for the ARN arn:aws:iam::123456789012:role/my-redshift-role, the user is IAMR:my-redshift-role). This applies to both provisioned and serverless. Grant database privileges to the IAM user Row Zero logs in as:

   ```sql
   GRANT USAGE ON SCHEMA <schema> TO "IAMR:<role-name>";
   GRANT SELECT ON ALL TABLES IN SCHEMA <schema> TO "IAMR:<role-name>";
   ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT SELECT ON TABLES TO "IAMR:<role-name>";
   ```

### Configure the connection in Row Zero

Follow the instructions below to connect to Redshift using a username and password.

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose Redshift. The Redshift connector requires a few pieces of information, defined below:

   ![](https://cdn.sanity.io/images/2w8agf2t/production/cdb9b3277f5fce9913d0c77f13a7197a5c68ae21-973x808.png)

    - **Host** - the Redshift endpoint, e.g. 12345xyz.redshift.amazonaws.com
    - **Port** - 5439
    - **Database -** the name of the Redshift database to connect to
    - **Database Region -** the AWS region your cluster or workgroup is in
    - **Role ARN -** the ARN of the IAM role Row Zero will assume, e.g.  
`arn:aws:iam::&lt;account-id&gt;:role/&lt;your-redshift-role&gt;`
    - **Role Region -** the AWS region the IAM role of the above Role ARN is in
    - **Cluster type -** _**Provisioned**_ or _**Serverless**_
    - **Cluster identifier / Workgroup name -** the cluster identifier (provisioned)  
or the workgroup name (serverless)
    - **External ID** - a value generated by Row Zero. Copy it into your IAM role's trust policy (below).
3. Once all the information is entered, hit 'Test connection' to ensure the information is correct. If the test connection icon turns green and says 'Connected', proceed by clicking on 'Create'.

> **Note** - If your database is behind a VPN or firewall, you'll need to allow the Row Zero IP addresses: 18.217.97.112 and 18.224.119.220.

![](https://cdn.sanity.io/images/2w8agf2t/production/f074a6045f91dc5b8a11e2943bb16a155507ef0f-1020x186.png)

## Share your connection with other users

If you would like other users to be able to use this role to query Redshift from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:

1. Navigate to your [Connections](/connections) page.
2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
3. Enter the emails of the users or groups that should have access to this connection.

## Write a query to import Redshift data

Now that have created a Redshift connection, you can import data by writing queries directly within Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect S3 to Row Zero

Use the built-in S3 connector to import millions of rows and build S3 connected spreadsheets.

Import data directly from S3 to a Row Zero workbook using presigned URLs or by connecting an S3 bucket directly to Row Zero. Row Zero supports a variety of file formats including CSV, Parquet, JSONL, TXT, XLSX, and .gz.

## Import from S3 Presigned URL

To import from S3 using a pre-signed URL, visit your S3 console and select the bucket containing the file you want to import. In the bucket, select the check box next to the bucket, then choose 'Actions' and 'Share with presigned URL.' On the next screen, enter the amount of time (minutes or hours) you would like the link to be accessible. Next click the orange 'Create presigned URL' button. You will be taken back to your S3 bucket and the presigned URL will automatically copied to your clipboard.

![S3 create URL screen](https://cdn.sanity.io/images/2w8agf2t/production/de40f53b03a701f4762cedb669ca04cb4110953f-1435x786.png)

Next, open a workbook in [Row Zero](https://rowzero.com/new?ref=S3), click on Data &gt; Import &gt; Import from URL, paste your presigned URL into the text box and click 'Import.'

![Pasted S3 bucket URL screen in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/234d946976b9118bdc69a99f92da7babc1fe2873-747x507.png)

## Connect an S3 bucket to browse S3 directly from the spreadsheet

For users who are regularly exploring and analyzing data from S3, a more efficient option is to connect S3 directly to Row Zero. Once complete, the connected S3 bucket will display in the Row Zero Data Import window, making it easy to select and import S3 files.

![Browse S3 buckets in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/f5e93a0e9b8a11642ac19afb22036aa587717b3d-1245x829.png)

### Connect an S3 bucket

The following instructions explain how to create an IAM role in AWS S3 and grant permissions for a Row Zero workbook to connect a specific S3 bucket and ingest data.

1. From any workbook, select **Import from Amazon S3** from the 'Data' menu. 

   ![Import from Amazon S3](https://cdn.sanity.io/images/2w8agf2t/production/629966afb49d8fa4b202ab7582726e56ae358d02-979x297.png)

2. You will see a link to the **public datasets** S3 bucket and a button in the upper right hand corner that says **+ connect bucket.** Click the button to connect a new bucket. The public datasets bucket is available to demo the integration and Row Zero features.  

   ![Connect bucket](https://cdn.sanity.io/images/2w8agf2t/production/0c29c31e00a48415df97a753eb19a184690921cf-1201x394.png)

3. The first step is identifying the bucket name you intend to connect to Row Zero and entering the name in the provided text box.  

   ![Bucket name](https://cdn.sanity.io/images/2w8agf2t/production/eb532eae28e63ecffd207d7e63dee5170effdc75-1196x336.png)

4. Provide the Amazon Resource Name (ARN). To identify the name, follow the instructions below to create an IAM role for Row Zero and grab the ARN from the AWS console. At the top of the screen your Row Zero AWS Account ID and your External ID will be visible. Both will be needed to create the IAM role.  

   ![ID numbers](https://cdn.sanity.io/images/2w8agf2t/production/0f42e9daac30eba11cc7abcd982c4551be70062d-1200x443.png)

### Create an IAM Role

1. Log in to the AWS Management Console
2. Select **AWS Account**
3. Select **Another AWS Account** and enter 732940336628 as the account ID
4. Select **Require External Id** and enter Your Account ID
5. Click **Next**  

   ![Enter AWS account IDs](https://cdn.sanity.io/images/2w8agf2t/production/26059c545e7f6dd9687bf04394a654a691400214-2076x1460.png)

6. Select **Create Policy** (this will open a new tab)  

   ![AWS create policy](https://cdn.sanity.io/images/2w8agf2t/production/26296b5080ed60705b2b13904c98b2149da4ff6a-1656x356.png)

7. Select the tab that says **JSON** and replace the text with this:  

   ![AWS json text](https://cdn.sanity.io/images/2w8agf2t/production/af9202cafb4104a544d8e0b22158de6ca55c0e20-1809x961.png)

8. Click **Next: Tags**
9. Click **Next: Review**
10. Give the policy a name like 'RowZero-myS3bucket-ReadOnly'
11. Click **Create policy** and close this browser tab  

   ![AWS policy name](https://cdn.sanity.io/images/2w8agf2t/production/87656042caf7c63ccb941c44e252267aebe7a2a0-2473x1287.png)

12. On the first browser tab, refresh the list of policies
13. Search for the policy you just created (e.g. RowZero-myS3bucket-ReadOnly),  
click the checkbox to its left, and click **Next**  

   ![AWS permission policies](https://cdn.sanity.io/images/2w8agf2t/production/08c2cf28ea89a5565199632abaedfba9f620f544-1039x530.png)

14. Give the role a name, like RowZero-myS3bucket-ReadOnly
15. Scroll to the bottom of the page, and click **Create Role**  

   ![AWS create role](https://cdn.sanity.io/images/2w8agf2t/production/50133a5a4a8218c80ae2836fa65ca4cd5753d4f1-1575x346.png)

16. Click View Role at the top of the screen and copy the role ARN and paste it in the text box at the top of the window. Click Next.  

   ![AWS view role](https://cdn.sanity.io/images/2w8agf2t/production/2fee18558a761727bcd3c17f1a6422bed2fc563a-1246x224.png)

   ![AWS copy ARN number](https://cdn.sanity.io/images/2w8agf2t/production/cb69e882e2f4d03e21851261bd30a64c19859751-1215x396.png)

   ![Paste ARN](https://cdn.sanity.io/images/2w8agf2t/production/565ec28b018b90a7029f04a75fe315577198fc53-1347x915.png)

### Import data from S3

Once your S3 bucket is connected, you can import data from any workbook.

1. Select 'Import from Amazon S3' from the 'Data' menu. 

   ![Data import menu](https://cdn.sanity.io/images/2w8agf2t/production/327fd6990febf884faf17a221be068889472c632-706x419.png)

2. Select your file(s) and click "Import".  

   ![Browse S3 buckets in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/f5e93a0e9b8a11642ac19afb22036aa587717b3d-1245x829.png)

3. Preview your data and configure import settings, if needed. 

   ![Imported data preview screen in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/fc86a9fb43f4a1c4f918874431f6c60cd0e76bd5-796x504.png)

### Open and combine multiple S3 files

For users with multiple related files in one folder, Row Zero can combine, merge, and concatenate S3 files into one spreadsheet, making the data easier to analyze. One your S3 bucket is connected, navigate to any folder and select the files you would like to combine. Then use the import window to verify whether your data has headers and hit 'import.' Row Zero will merge the S3 files and concatenate them into one worksheet.

![S3 import multiple files](https://cdn.sanity.io/images/2w8agf2t/production/8d7d1e057fec9e6361cded8369579dba9ad322e6-798x619.png)

### Sharing S3 connections

You can easily share S3 connections with teammates by clicking the 3-dot icon on your S3 bucket and selecting 'Share'.

![share S3 connection](https://cdn.sanity.io/images/2w8agf2t/production/1b1bb1894e71ee81b61823a8d93c22fdc727ca16-1394x423.png)

---

# Connect Snowflake to Row Zero

Use the built-in Snowflake connector to import millions of rows and build Snowflake connected spreadsheets. Connect Snowflake via OAuth, key pair, or password.

Row Zero's built-in Snowflake connector makes it easy to connect your spreadsheets to Snowflake using username and password, key-pair authentication, or Snowflake OAuth.

## Choosing the right authentication method

**Key Pair** and **password** authentication are appropriate for individual Row Zero accounts or for connecting service accounts in larger organizations. For the second use case, we recommend creating a dedicated `SERVICE` user in Snowflake for this purpose, then connecting Row Zero using key pair authentication. Once the connection is created in Row Zero, you can securely share it with the appropriate people in your organization.

**OAuth** is the best authentication method for organizations where users have their own Snowflake credentials. Any queries using OAuth connections respect the database permissions of the person who runs the query, including RLS and RBAC.

> **Note:** [Snowflake will soon be removing password-only sign-ins](https://docs.snowflake.com/en/user-guide/security-mfa-rollout). While Row Zero still supports authentication via password, we recommend you connect to Snowflake using Key Pair or Snowflake OAuth.

## Connect using a Key Pair or Password

Follow the instructions below to connect to Snowflake using a key pair or password.

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose Snowflake. The Snowflake connector requires a few pieces of information defined below.

   ![snowflake connector](https://cdn.sanity.io/images/2w8agf2t/production/8eaee30ceab8b050f17ef0e73caadada61c1cd10-1133x873.png)

    - **Connection name:** This field can be anything that helps identify the data source being connected (e.g. "Production Data" or "Product Metrics"). It will be visible to all users who have access to this connection.
    - **Account identifier:** This is your organization name and account name combined with a hyphen (-). When logged into Snowflake, find them in the URL: [https://app.snowflake.com/org_name/account_name](https://app.snowflake.com/org_name/account_name). View [Snowflake's docs](https://docs.snowflake.com/en/user-guide/admin-account-identifier) for additional detail.
    - **Username:** The username used to log into your Snowflake account.
3. Choose your authentication method.
    - **Key Pair:** This is the default method. For help setting up a key pair in Snowflake, read Snowflake's user guide [here](https://docs.snowflake.com/en/user-guide/key-pair-auth#configuring-key-pair-authentication). Row Zero supports both encrypted and unencrypted private keys. Paste the contents of private key that you generated when setting up your Snowflake user. The text should be in PEM format. If you generated an encrypted private key, enter the passphrase in the form field under the private key.

      ![snowflake connector](https://cdn.sanity.io/images/2w8agf2t/production/1f8a967804c2002129403b433292e8076ead15f9-1106x1494.png)

    - **Password:** If you still have a legacy Snowflake account that supports password sign in and you do not want to use key-pair authentication, select 'Password' and enter the password you use to log into your Snowflake account. 

      ![snowflake connector](https://cdn.sanity.io/images/2w8agf2t/production/a3fd361c92c1f4ba9cf7abff90eae6774a98d190-1092x1474.png)

4. If you would like other users to be able to use this account to query from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:
    1. Navigate to your [Connections](/connections) page.
    2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
    3. Enter the emails of the users or groups that should have access to this connection.

## Connect using Snowflake OAuth

If you wish to use [Snowflake's built-in OAuth capabilities](https://docs.snowflake.com/en/user-guide/oauth-snowflake-overview) to provide OAuth-based authentication for your users when they query Snowflake from Row Zero, follow the steps below. The corresponding Snowflake documentation is [here](https://docs.snowflake.com/en/user-guide/oauth-custom) and [here](https://docs.snowflake.com/en/sql-reference/sql/create-security-integration-oauth-snowflake). You will need administrator privileges in order to configure these settings in your Snowflake account.

```
CREATE SECURITY INTEGRATION "Row Zero"
    TYPE = OAUTH
    ENABLED = TRUE
    OAUTH_CLIENT = CUSTOM
    OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
    OAUTH_REDIRECT_URI = 'https://oauth.rowzero.com/oauth/authorization-code/1'
    OAUTH_ENFORCE_PKCE = TRUE
    OAUTH_USE_SECONDARY_ROLES = IMPLICIT
;
```

**Note:** **`OAUTH_USE_SECONDARY_ROLES = IMPLICIT`** enables users’ secondary roles during OAuth sessions. Users whose **`DEFAULT_SECONDARY_ROLES`** is set to **`ALL`** will automatically have all granted roles available. Omit this setting if you want only the user’s primary role to be active.

**Note:** It is important to use the name "Row Zero" because Snowflake uses the security integration name as a display name that it shows to users when they are signing in to Snowflake, like this:

![Sample Snowflake OAuth Display Name](https://cdn.sanity.io/images/2w8agf2t/production/d81564f7dbd0a535f72c398f3365512045a5299d-765x259.png)

After the create statement succeeds, you will need to run three Snowflake queries to obtain information about your security integration:

```
SELECT CURRENT_ORGANIZATION_NAME() AS orgname,
       CURRENT_ACCOUNT_NAME() AS accountname,
       CURRENT_ACCOUNT() AS account_locator;
```

```
DESCRIBE SECURITY INTEGRATION "Row Zero";
```

```
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('Row Zero');
```

Once you have the above information, [contact us](/contact) at Row Zero so we can schedule a meeting to configure the OAuth integration on our end.

This is the information that we will need from you:

1. The following three values from the `SELECT CURRENT...` result to construct your Snowflake identifier:
    - `orgname`
    - `accountname`
    - `accountlocator`
2. The following three values from the `DESCRIBE SECURITY INTEGRATION` result:
    - `OAUTH_CLIENT_ID`
    - `OAUTH_AUTHORIZATION_ENDPOINT`
    - `OAUTH_TOKEN_ENDPOINT`
3. The client secrets from the `SHOW_OAUTH_CLIENT_SECRETS` result. **Do not share this via email or other unsecured means.** We will give you a secure way to provide your secret.

## Enable Cortex Analyst

[Snowflake Cortex Analyst](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst) is Snowflake's text-to-SQL service for answering questions against structured data. Row Zero discovers the semantic views that are available to a Snowflake connection and can use Cortex Analyst to [generate SQL](/docs/ai-assistant) against those semantic views.

Prerequisites to enable Cortex Analyst in Row Zero:

- Admin access to the Snowflake account.
- At least one Snowflake semantic view for the data users should query.
- A Row Zero Snowflake connection in the workspace where users will use AI generated queries.
- Enterprise customers must also [configure an AI provider](/docs/ai) in Row Zero. 

### Enable Cortex Analyst in Snowflake

To enable Cortex in Row Zero, first enable Cortex Analyst in Snowflake. 

1. Use a Snowflake administrator role to confirm that Cortex Analyst is enabled for the account.

   ```sql
   USE ROLE ACCOUNTADMIN;
   SHOW PARAMETERS LIKE '%CORTEX%' IN ACCOUNT;
   ```

2. If `ENABLE_CORTEX_ANALYST` is set to `FALSE`, enable it.

   ```sql
   ALTER ACCOUNT SET ENABLE_CORTEX_ANALYST = TRUE;
   ```

3. If your account uses `CORTEX_MODELS_ALLOWLIST`, make sure it is not set to `None` and includes the models your organization allows for Cortex. For example, the command below sets access to all models.

   ```sql
   ALTER ACCOUNT SET CORTEX_MODELS_ALLOWLIST = 'All';
   ```

4. If your Snowflake account is outside a native Cortex Analyst region, enable cross-region inference according to your organization's data residency requirements.

   ```sql
   ALTER ACCOUNT SET CORTEX_ENABLED_CROSS_REGION = 'ANY_REGION';
   ```

5. You can also set `CORTEX_ENABLED_CROSS_REGION` to a more restrictive Snowflake-supported value, such as `AWS_US`, if your organization requires region boundaries.

### Grant Cortex access to the Row Zero Snowflake role

Next, grant Cortex access to the Row Zero Snowflake role:

1. The Snowflake role used by Row Zero must have either the `SNOWFLAKE.CORTEX_ANALYST_USER` database role or the broader `SNOWFLAKE.CORTEX_USER` database role. 

   ```sql
   USE ROLE ACCOUNTADMIN;
   GRANT DATABASE ROLE SNOWFLAKE.CORTEX_ANALYST_USER TO ROLE <rowzero_role>;
   ```

2. For service account, key-pair, or password connections, grant this to the role used by the connected Snowflake user. For Snowflake OAuth, grant this to the Snowflake role(s) your Row Zero users will use when running queries from Row Zero.

### Create and grant access to semantic views

Cortex Analyst needs semantic views that describe the business concepts, metrics, and relationships in your Snowflake data. You can create semantic views in Snowflake with SQL or with Snowflake's semantic view tooling. See Snowflake's guide to [creating and managing semantic views](https://docs.snowflake.com/en/user-guide/views-semantic/sql).

1. To use a semantic view in Cortex Analyst, grant `REFERENCES` and `SELECT` on the semantic view to the Row Zero role.

   ```sql
   GRANT USAGE ON DATABASE <database_name> TO ROLE <rowzero_role>;
   GRANT USAGE ON SCHEMA <database_name>.<schema_name> TO ROLE <rowzero_role>;
   GRANT REFERENCES, SELECT ON SEMANTIC VIEW <database_name>.<schema_name>.<semantic_view_name> TO ROLE <rowzero_role>;
   ```

2. If you will create more semantic views in the same schema, consider a future grant.

   ```sql
   GRANT REFERENCES, SELECT ON FUTURE SEMANTIC VIEWS IN SCHEMA <database_name>.<schema_name> TO ROLE <rowzero_role>;
   ```

### Cortex Analyst troubleshooting

- **Missing Cortex database role:** Grant SNOWFLAKE.CORTEX_ANALYST_USER or SNOWFLAKE.CORTEX_USER to the Snowflake role used by the Row Zero connection.
- **Cortex Analyst disabled:** Set ENABLE_CORTEX_ANALYST to TRUE.
- **No Cortex models allowlisted:** Update CORTEX_MODELS_ALLOWLIST so it is not None.
- **Cross-region inference disabled:** If the account is outside a native Cortex Analyst region, set CORTEX_ENABLED_CROSS_REGION to a supported value.
- **No semantic models found:** Create at least one semantic view and grant the Row Zero role access to it.
- **Users cannot see the generated query source:** Verify the Snowflake connection is in the same Row Zero workspace as the workbook and is shared with the user.

## Write a query to import Snowflake data

Now that you have created a Snowflake connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect SQLServer to Row Zero

Use the built-in SQLServer connector to import millions of rows and build SQLServer connected spreadsheets.

Row Zero's built-in SQLServer connector makes it easy to connect your spreadsheets to a SQLServer database. Follow the instructions below to connect to SQLServer, share your connection with others, and import data.

## Create your SQLServer connection

To create a new connection:

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose SQLServer. The SQLServer connector requires a few pieces of information defined below. 

   ![sqlserver connector](https://cdn.sanity.io/images/2w8agf2t/production/275e1e74a0daa574884a317cf4d06f5414f8510d-1074x898.png)

    - **Connection name** - This field can be anything that helps identify the data source being connected (e.g. "Production Data" or "Product Metrics"). It will be visible to all users who have access to this connection.
    - **Host** - This is the SQLServer address that typically takes the form of a string like 'database.mydomain.com'.
    - **Port** - This is often 1433.
    - **User** - This is the username for your SQLServer database.
    - **Password** - The password used to log into your SQLServer database.
3. Once all the information is entered, hit '**Test connection**' to ensure the information is correct. If the test connection icon turns green and says '**Connected**', proceed by clicking on '**Create Connection**'.

> **Note:** If your database is behind a VPN or firewall, you'll need to allow the Row Zero IP addresses: 18.217.97.112 and 18.224.119.220.

## Share your connection with other users

1. If you would like other users to be able to use this user/password to query SQLServer from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:
    1. Navigate to your [Connections](/connections) page.
    2. Find the Connection that you'd like to share, click '**...**' next to the name of the connection, and select '**Manage sharing**'.
    3. Enter the emails of the users or groups that should have access to this connection.

## Write a query to import SQLServer data

Now that have created a SQLServer connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Connect Teradata to Row Zero

Use the built-in Teradata connector to import millions of rows and build Teradata connected spreadsheets.

Row Zero's built-in Teradata connector makes it easy to connect your spreadsheets to Teradata. Follow the instructions below to connect to Teradata, share your connection with others, and import data to a spreadsheet.

## Create your Teradata connection

The Teradata connector supports two result delivery modes:

- **Staged** - Recommended for larger datasets and better performance. Staged mode requires a [Bring Your Own Bucket](/docs/bring-your-own-bucket) configuration, where query  
results are staged through an AWS S3 bucket that you control. Before creating a Staged connection, set up an S3 bucket and IAM role by following the [Bring Your Own Bucket](/docs/bring-your-own-bucket) setup guide.
- **Streaming** - Intended for smaller datasets. Streaming mode retrieves data directly to your workbook and only requires host, port, username, and password.

To create a new connection:

1. From your Row Zero homepage, click **+ New** in the upper left corner and then choose **Connection**.  

   ![create new connection in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/3e17b739a700d529447c921c985bd651f6096a3d-512x920.png)

2. Choose Teradata.
3. Select your result delivery mode (**Staged** or **Streaming**), then fill in the required fields: 

   ![teradata connector](https://cdn.sanity.io/images/2w8agf2t/production/889703dca5c23758ebfa043773c1976238dbe41f-883x1378.png)

    - **Connection name** - This field can be anything that helps identify the data source being connected (e.g. "Production Data" or "Product Metrics"). It will be visible to all users who have access to this connection.
    - **Result delivery mode** - Choose **Staged** for larger datasets and better performance, or **Streaming** for smaller datasets with simpler setup.
    - **Host** - This is the Teradata server address that typically takes the form of a string like 'teradata.mydomain.com'.
    - **Port** - This is often 1025.
    - **User** - This is the username for your Teradata database.
    - **Password** - The password used to log into your Teradata database.
    - The following fields are required only for **Staged** mode:
        - **S3 Bucket** - The name of the staging bucket you created during the [Bring Your Own Bucket](/docs/bring-your-own-bucket).
        - **Region** - The AWS region of your staging bucket.
        - **IAM Role ARN** - The ARN of the IAM role you created during the [Bring Your Own Bucket](/docs/bring-your-own-bucket).
4. Once all the information is entered, hit '**Test connection**' to ensure the information is correct. If the test connection icon turns green and says '**Connected**', proceed by clicking on '**Create Connection**'.

> **Note:** If your database is behind a VPN or firewall, you'll need to allow the Row Zero IP addresses: 18.217.97.112 and 18.224.119.220.

## Share your connection with other users

If you would like other users to be able to use this connection to query Teradata from Row Zero, you can securely share the connection with them in Row Zero. This is appropriate if multiple users share a service account. To share your connection in Row Zero:

1. Navigate to your [Connections](/connections) page.
2. Find the Connection that you'd like to share, click '...' next to the name of the connection, and select 'Manage sharing'.
3. Enter the emails of the users or groups that should have access to this connection.

## Write a query to import Teradata data

Now that have created a Teradata connection, you can import data by writing queries directly from Row Zero. See [Data Import](/docs/data-import#custom-queries-using-sql-editor-and-query-builder) to learn how.

---

# Enterprise Launch Guide

Guide containing best practices for implementing Row Zero at scale, including configuring a new account, connecting data, and launching to users.

## How to Use this Guide

This guide is for admins and leaders at larger organizations. It covers best practices for implementing Row Zero at scale and the necessary actions to configure your account, connect your data, and launch to end users.

## Overview: What is Row Zero?

Row Zero is a modern spreadsheet built for enterprises. It’s fast, secure, and connects directly to your data. Unlike conventional spreadsheets, Row Zero runs in the cloud instead of on employee laptops. This has two advantages:

1. Compute can be scaled up to handle large data sets.
2. Sensitive data is trapped securely in the cloud.

Row Zero combines the security and governance of an enterprise data platform with the flexibility of a spreadsheet, giving teams the familiar interface they want while keeping data protected, auditable, and integrated with your organization’s existing controls.

## Key Concepts

Row Zero is structured around a few entities that define how data is organized and shared. Understanding these first will help you align Row Zero with your existing data infrastructure and apply your organization’s governance model consistently.

**Workspaces** are a security feature that allow admins to isolate sensitive data. Each workspace has its own membership, security policies, and connections that are isolated from other workspaces in an organization. Every workbook belongs to a single workspace, though users can belong to multiple. By default, all Enterprise customers begin with a single, enterprise-wide workspace.

**Connections** are integrations with external databases, data warehouses, or cloud storage. They can be configured to allow querying, writeback, or both. Connections handle authentication and permissions. Row Zero supports common authentication methods, including OAuth.

**Workbooks** are spreadsheets that contain data, formulas, and/or visualizations. All workbooks are private when created, but can be shared according to your organization’s policies. You can import data from connections into your workbooks by directly querying connections or inserting data from a data source.

**Data Sources** are published queries that can be shared with other Row Zero users. They are used to manage governed “source of truth” datasets or to give less technical users direct access to live data without writing SQL.

## Set Up Your Account

Setup is quick, and can typically be done over a few short sessions between Row Zero’s customer success team and your database and IT admins.

### User Authentication and Provisioning (SSO & SCIM)

Like other apps in your productivity suite (e.g. Office, Google Workspace, Slack), Row Zero works best when everyone in your organization has access. Broad adoption makes collaboration seamless and keeps your data secure, so we recommend enabling SSO and SCIM for all potential users at setup.

Row Zero uses just-in-time account provisioning for Business and Enterprise accounts. Users are automatically created when they log in for the first time. If your organization syncs groups with SCIM, new users automatically inherit access to any workbooks, connections, or data sources shared with their assigned groups within Row Zero.

Row Zero has two user roles:

- **Users**: This is the default role in Row Zero. Users can create workbooks and data sources, and can also collaborate with others, within the bounds of a workspace’s sharing policies.
- **Admins**: Admins have additional privileges, including managing membership, configuring security and sharing policies, and creating workspaces.

---

**Action:** For secure, streamlined user management at enterprise scale, schedule an integration call to:

- Enable [Single Sign-On](/docs/singlesignon) via SAML or OIDC. For seamless sharing and secure data control, we recommend enabling access to your full organization.
- Sync users and groups via [SCIM](/docs/scim) for automated user provisioning and to manage group sharing, ensuring access within Row Zero remains in sync with your IdP.
- Assign your Admin(s).

---

### Private Storage

Row Zero is a stateful service. Unlike BI tools that issue queries to your data warehouse and present the results, Row Zero workbooks allow users to perform data entry, upload files, and import data from databases and APIs. Workbook data is encrypted and saved in cloud storage.

Configuration options:

- **Row Zero storage (default):** Workbook data is securely saved in Row Zero-managed cloud storage.
- **Private storage (optional):** Enterprise customers may elect to use their own cloud storage to satisfy security requirements. In this mode, customer data exists in memory on Row Zero servers when a workbook is active, but it’s only persisted to your cloud storage account. For optimal performance, it is important to set up cloud storage in every region where your users are located (e.g. US West, US East, and Europe). At minimum, you should set up cloud storage for Row Zero in at least two regions for redundancy.

---

**Action:** Decide whether to use Row Zero-managed storage or your own storage. If you choose private storage, schedule a call with your customer success team to complete setup.

---

### Enable AI for your Organization

Row Zero’s AI assistant can read and analyze data, create formulas and pivot tables, generate visualizations, and perform complex calculations within a workbook. AI-produced analysis is fully auditable and editable, so you can easily investigate the underlying data and tweak the analysis. Watch a demo [here](/features/ai-spreadsheet).

Row Zero uses a “bring-your-own-key” approach, which enables your organization to retain control over access to the inference provider and run in your organization’s approved cloud services. Admins can configure your organization's AI provider on the [Organization Settings](/settings/organization/general) page in Row Zero.

---

**Action:** Configure your AI provider following the instructions [here](/docs/ai).

---

### Configure Security and Sharing Policies

Row Zero is built with enterprise security concerns in mind. The following policies can be configured for your workspace:

- Sharing policies for connections, data sources, and workbooks
- Export policies for downloads and copy/paste
- Workbook lifecycle policies
- Region lock to satisfy data residency requirements

These policies can be viewed and modified by workspace admins on the [Workspace Settings](/settings/organization/workspaces) page in Row Zero. Our default policies are designed to balance security needs with business needs, and are appropriate for most security-conscious organizations.

---

**Action:** Work with your customer success team to review our default policies and, if needed, update your workspace policies to align with your organization's business needs and security posture.

---

### Additional Workspaces

By default, all Enterprise customers begin with a single, enterprise-wide workspace. Enterprise customers can optionally configure additional [workspaces](/docs/workspaces) if they need to organize data or projects into secure, isolated environments within their account. Each workspace has its own membership, security settings, and connections that are isolated from other workspaces in an account. Each workbook, connection, and data source belongs to a single workspace, but users can belong to multiple. Common use cases:

- Workspaces for different business units in a large company
- Workspaces with different security settings (like share settings, export restrictions, region lock, or data retention)
- Client-specific workspaces when collaborating with external partners

---

**Action:** Work with your customer success team to configure additional workspaces, if needed.

---

## Connect Your Data and Publish Data Sources

### Connections

Connections make it easy to import and analyze big datasets, automate updates, and write back to your data warehouse. Row Zero supports connections for all major data warehouses, including [Databricks](/docs/databricks), [Snowflake](/docs/snowflake), [Redshift](/docs/redshift), and [BigQuery](/docs/bigquery). There are a variety of options to connect to your data warehouse securely, including via AWS PrivateLink.

Recommended setup pattern:

- **OAuth connection**: For users with individual database credentials. Any queries using OAuth connections respect the database permissions of the person who runs the query.
- **Service account connection**: For shared credentials across groups. Queries using service account connections use the same database user and permissions for anyone running a query. Service account connections support common authentication methods: password, key pair, access token, IAM authentication, etc.

Links to integration documentation:

- [Athena](/docs/athena)
- [BigQuery](/docs/bigquery)
- [Databricks](/docs/databricks)
- [Oracle](/docs/oracle)
- [Postgres](/docs/postgres)
- [Redshift](/docs/redshift)
- [S3](/docs/s3)
- [Snowflake](/docs/snowflake)
- [SQLServer](/docs/sqlserver)
- [Teradata](/docs/teradata)

---

**Action:** To get immediate value out of Row Zero, configure all of your connections before launch.

- Create an OAuth connection for all users who have their own database credentials. This can be done on an integration call with your Row Zero customer success team.
- Create one or more service account connections for users who don’t have their own database credentials. Share these connections with your entire workspace, with groups synced via SCIM, or with individuals.

---

### Data Sources

[Data sources](/docs/shared-data-sources) are reusable, published queries. They’re the foundation of governed, self-service access to data, enabling you to expose live datasets to business users without writing SQL or copying results between tools. If you publish an update to a data source, any workbook using that data source will automatically update, ensuring everyone works from the same source of truth.

Data sources can be backed by either OAuth connections or service account connections.

- If the intended data source users have their own accounts to your data warehouse, your data source should use an OAuth connection. In this case, the data source will run using the credentials for the end user (whoever clicks “Run”) and any data access control mechanisms will be enforced, including row level security (RLS) and role-based access control (RBAC).
- If your intended data source users do _not_ have their own accounts to your data warehouse, you should use a connection backed by a service account. In this case, the data source will run using the service account credentials.

Recommended setup pattern:

To balance flexibility with control, design your data sources around two types of use cases:

- **Core entities (unaggregated data)**: Create a data source for each foundational table or entity — for example, “Orders,” “Customers,” or “Contracts.” These give non-technical users direct, governed access to granular data. Users can then join, filter, and summarize that data using standard spreadsheet operations. For very large datasets, add query filters (e.g., date range or key variables) to keep results performant.
- **Common queries or reports.** Build data sources for frequently used metrics or business reports. This establishes a consistent, auditable “source of truth” and eliminates duplicated SQL or manual extracts.

---

**Action:** Work with your customer success team to configure your first data sources.

- Create a list of your core entities and common reports. Identify the users who will need access to them.
- Start with 3-5 data sources for core entities, and add more as adoption grows. Creating and modifying data sources is simple, so it's easy to modify your approach over time.
- Share your data sources with users.

---

---

# Business Launch Guide

Guide containing best practices for implementing Row Zero for businesses, including configuring a new account, connecting data, and launching to users.

## How to Use this Guide

This guide is for admins and team leaders with Business subscriptions. It covers best practices for implementing Row Zero and the necessary actions to configure your account, connect your data, and launch with your team.

## Overview: What is Row Zero?

Row Zero is a modern spreadsheet. It’s fast, secure, and connects directly to your data. Unlike conventional spreadsheets, Row Zero runs in the cloud instead of on employee laptops. This has two advantages:

1. Compute can be scaled up to handle large data sets.
2. Sensitive data is trapped securely in the cloud.

Row Zero combines the scale of a data platform with the flexibility of a spreadsheet, giving teams the familiar interface they want to access massive, live datasets. 

## Key Concepts

Row Zero is structured around a few entities that define how data is organized and shared:

**Connections** are integrations with external databases, data warehouses, or cloud storage. They can be configured to allow querying, writeback, or both. Connections handle authentication and permissions.

**Workbooks** are spreadsheets that contain data, formulas, and/or visualizations. All workbooks are private when created, but can be shared according to your organization’s policies. You can import data from connections into your workbooks by directly querying connections or inserting data from a data source.

**Data Sources** are published queries that can be shared with other Row Zero users. They are used to manage governed “source of truth” datasets or to give less technical users direct access to live data without writing SQL.

## Set Up Your Account

### User Provisioning

Row Zero uses just-in-time account provisioning for Business accounts. There is no need for admins to create accounts for new users. Users are automatically added to your account when they [sign up](/signup), assuming they are using an email domain (e.g. name@company.com) associated with your account.  

Row Zero has two user roles:

- **Users**: This is the default role in Row Zero. Users can create workbooks and data sources, and can also collaborate with others, within the bounds of a workspace’s sharing policies.
- **Admins**: Admins have additional privileges, including managing membership.

---

**Action:** Contact support@rowzero.io to assign your Admin(s). If your organization has multiple email domains, contact support@rowzero.io to add secondary domains. 

---

### Security and Sharing Policies

Row Zero is built with security concerns in mind. Business workspaces use Row Zero’s default security policies, which are designed to balance security needs with business needs, and are appropriate for most security-conscious organizations. Admins can view these settings in the [Workspace Settings](/settings/organization/workspaces) page in Row Zero. If you need to customize security settings, consider upgrading to an [Enterprise](/pricing) plan. 

In addition, you can configure region lock to satisfy data residency requirements. 

---

**Action:** If needed, contact support@rowzero.io to configure region lock. 

---

## Connect Your Data and Publish Data Sources

### Connections

Connections make it easy to import and analyze big datasets, automate updates, and write back to your data warehouse. Row Zero supports connections for all major data warehouses.

Links to integration documentation:

- [Athena](/docs/athena)
- [BigQuery](/docs/bigquery)
- [Databricks](/docs/databricks)
- [Oracle](/docs/oracle)
- [Postgres](/docs/postgres)
- [Redshift](/docs/redshift)
- [S3](/docs/s3)
- [Snowflake](/docs/snowflake)
- [SQLServer](/docs/sqlserver)
- [Teradata](/docs/teradata)

---

**Action:** To get immediate value out of Row Zero, configure your connection(s) and share them with users who will need to run queries from Row Zero.

---

### Data Sources

[Data sources](/docs/shared-data-sources) are reusable, published queries. They’re the foundation of governed, self-service access to data, enabling you to expose live datasets to users without writing SQL or copying results between tools. If you publish an update to a data source, any workbook using that data source will automatically update, ensuring everyone works from the same source of truth.

To balance flexibility with control, design your data sources around two types of use cases:

- **Core entities (unaggregated data)**: Create a data source for each foundational table or entity — for example, “Orders,” “Customers,” or “Contracts.” These give non-technical users direct, governed access to granular data. Users can then join, filter, and summarize that data using standard spreadsheet operations. For very large datasets, add query filters (e.g., date range or key variables) to keep results performant.
- **Common queries or reports.** Build data sources for frequently used metrics or business reports. This establishes a consistent, auditable “source of truth” and eliminates duplicated SQL or manual extracts.

---

**Action:** Configure your first data sources.

- Create a list of your core entities and common reports. Identify the users who will need access to them.
- Start with 3-5 data sources for core entities, and add more as adoption grows. Creating and modifying data sources is simple, so it's easy to modify your approach over time.
- Share your data sources with users.

---

---

# Configure Single Sign-On (SSO)

Row Zero supports single sign-on (SSO) to control access and authentication.

Enterprise customers can elect to integrate their identity provider (IdP) with Row Zero to control access and authentication. Once you have configured SSO, all members of your organization will be required to authenticate via your identity provider. Authentication via email and password will not be permitted. If a user is removed from your IdP or if you remove their access to Row Zero, they will no longer be able to log in to Row Zero.

After enabling SSO, Row Zero recommends using SCIM to sync users and groups automatically from your identity provider to Row Zero. To sync users and groups from your identity provider, see [Sync Users and Groups with SCIM](/docs/scim).

Row Zero supports SSO using either [SAML 2.0](https://wiki.oasis-open.org/security/FrontPage#SAML_V2.0_Standard) or [OpenID Connect](https://openid.net/developers/how-connect-works/) (OIDC). Below, are generic instructions on how to configure SSO with OIDC or SAML, as well as specific instructions for different identity providers:

- [Configure SSO using SAML](/docs/single-sign-on-saml)
- [Configure SSO using OIDC](/docs/single-sign-on-oidc)
- [Configure SSO using SAML - Microsoft Entra](/docs/single-sign-on-saml-entra)
- [Configure SSO using OIDC - Microsoft Entra](/docs/single-sign-on-oidc-entra)
- [Configure SSO using SAML - Okta](/docs/single-sign-on-saml-okta)
- [Configure SSO using OIDC - Okta](/docs/single-sign-on-oidc-okta)
- [Configure SSO using SAML - Jumpcloud](/docs/single-sign-on-saml-jumpcloud)
- [Configure SSO using OIDC - Jumpcloud](/docs/single-sign-on-oidc-jumpcloud)

---

# Sync Users and Groups with SCIM

Row Zero supports SCIM to sync users and groups.

Enterprise customers can elect to sync users and groups from their identity provider (IdP) using SCIM, or System for Cross-domain Identity Management.

SCIM enables you to use groups in your IdP to manage access to content in Row Zero. If your organization syncs groups with SCIM, new users automatically inherit access to any workbooks, connections, or data sources shared with their assigned groups within Row Zero. Conversely, if they are removed from a group in your IdP, they will automatically lose access to any content shared with that group.

Below are instructions on how to configure SCIM for different identity providers:

- [Configure SCIM - Microsoft Entra](/docs/scim-entra)
- [Configure SCIM - Okta](/docs/scim-okta)
- [Configure SCIM - Jumpcloud](/docs/scim-jumpcloud)

---

# Workspaces

Workspaces are a security feature that allow admins to isolate sensitive data in Row Zero.

Workspaces are a security feature that allow admins to isolate sensitive data. Common use cases include:

- Workspaces for different business units in a large company
- Workspaces with different security settings (like share settings, export restrictions, region lock, or data retention)
- Client-specific workspaces when collaborating with external partners

Each workspace has its own membership, security settings, and data connections that are isolated from other workspaces in an organization. Every workbook belongs to a single workspace.

If workspaces are enabled and a user has access to multiple workspaces, the workspace dropdown will be visible at the top of any account page.

![select workspace in Row Zero](https://cdn.sanity.io/images/2w8agf2t/production/5c5d36a42ef59cd916393e5775448da3da5e22a4-494x199.png)

Workspaces are available on [Enterprise plans](/pricing) upon request. [Contact us](/contact) to set up workspaces for your organization.

---

# AI in Row Zero

Configure AI providers for your organization, including Anthropic, OpenAI, and AWS Bedrock setup, model selection, and credential management.

Row Zero’s AI agent can read and analyze your data, create formulas and pivot tables, generate visualizations, and perform complex calculations, all within your workbook. AI-produced analysis is fully auditable and editable, so you can easily investigate the underlying data and tweak the analysis.

Row Zero AI is available all users. Free, Pro, and Business customers do not need to configure their AI provider. 

Enterprise plans offer a “bring-your-own-key” approach, which allows your organization to retain control over access to the inference provider. The AI runs in your already-vetted cloud services.

There are currently four available inference providers: Anthropic, OpenAI, Gemini, and AWS Bedrock. When using Anthropic, OpenAI, or Gemini, you provide an API key. When using Bedrock, Row Zero will assume a role within your AWS account.

## Enabling AI for your organization

The AI Provider Settings page allows workspace administrators to configure AI features for their organization. This includes selecting an AI provider (Anthropic, OpenAI, Gemini, or AWS Bedrock), configuring which models are available to users, and managing provider credentials.

## Setting Up Anthropic as Your AI Provider

### Prerequisites

- Access to the Anthropic Console for your organization
- Admin access to your Row Zero organization

### Step 1: Obtain an Anthropic API Key

1. Log in to your [Anthropic Console](https://console.anthropic.com/).
2. Navigate to **API Keys**.
3. Click **Create Key**.
4. Give your key a descriptive name (e.g., "Row Zero Key").
5. Copy the generated API key (you won't be able to see it again).

### Step 2: Configure Anthropic in Row Zero

1. Navigate to your [organization settings](/settings/organization/general) in Row Zero.
2. Scroll down to the **AI** section.
3. Click the **Provider** dropdown and select **Anthropic**.
4. Configure your model settings (see [Model Settings](#model-settings) below).
5. Under **Provider credentials**, enter:
    - **Key name**: A name (like the one set in the Anthropic console) that helps you identify the key
    - **API key**: Paste your Anthropic API key.
6. Click **Test Connection**.
7. Wait for the status indicator to show **Connected** (green).
8. Click **Save Changes**.

**Note**: If the connection test fails, verify that your API key is correct and has not been revoked in the Anthropic Console.

---

## Setting Up OpenAI as Your AI Provider

### Prerequisites

- Access to the OpenAI API Platform for your organization
- Admin access to your Row Zero organization

### Step 1: Verify your OpenAI organization

1. Log in to the [OpenAI Platform](https://platform.openai.com/settings/organization/general).
2. Navigate to your [Organization settings](https://platform.openai.com/settings/organization/general).
3. Make sure you have been verified as an individual or business.

### Step 2: Obtain an OpenAI API Key

1. From the [OpenAI Platform](https://platform.openai.com/api-keys), navigate to **API keys**.
2. Click **Create new secret key**.
3. Give your key a descriptive name (e.g., "Row Zero Key").
4. Copy the generated API key (you won't be able to see it again).

### Step 3: Configure OpenAI in Row Zero

1. Navigate to your [organization settings](/settings/organization/general) in Row Zero.
2. Scroll down to the **AI** section.
3. Click the **Provider** dropdown and select **OpenAI**.
4. Configure your model settings (see [Model Settings](#model-settings) below).
5. Under **Provider credentials**, enter:
    - **Key name**: A name (like the one set in the OpenAI platform) that helps you identify the key
    - **API key**: Paste your API key.
6. Click **Test Connection**.
7. Wait for the status indicator to show **Connected** (green).
8. Click **Save Changes**.

**Note**: If the connection test fails, verify that your API key is correct and has not been revoked in the OpenAI platform, and make sure your organization has been verified.

---

## Setting Up Gemini as Your AI Provider

### Prerequisites

- Access to the Google AI Studio for your organization
- [Billing set up in Google AI Studio](https://aistudio.google.com/billing)
- Admin access to your RowZero organization

### Step 1: Obtain a Gemini API Key

1. Log in to your [Google AI Studio](https://aistudio.google.com/).
2. Navigate to [Get API key](https://aistudio.google.com/api-keys).
3. Click **Create API key**.
4. Choose or create a project and give your key a descriptive name (e.g., “Row Zero Key”).
5. Copy the generated API key (you won’t be able to see it again).

### Step 2: Configure Gemini in Row Zero

1. Navigate to your [organization settings](/settings/organization/general) in Row Zero.
2. Scroll down to the **AI** section.
3. Click the **Provider** dropdown and select **Gemini**.
4. Configure your model settings (see [Model Settings](https://rowzero.com/docs/ai#model-settings) below).
5. Under **Provider credentials**, enter:
    1. **Key name:** A name (like the one set in Google AI Studio) that helps you identify the key.
    2. **API key:** Paste your API key.
6. Click **Test Connection**.
7. Wait for the status indicator to show **Connected** (green).
8. Click **Save Changes**.

**Note:** If the connection test fails, verify that your API key is correct and has not been revoked in Google AI Studio.

---

## Setting Up Databricks as Your AI Provider

Row Zero uses a dedicated [Databricks service principal](https://docs.databricks.com/aws/en/admin/users-groups/manage-service-principals) and [OAuth machine-to-machine (M2M)](https://docs.databricks.com/aws/en/dev-tools/auth/oauth-m2m) credentials to send AI inference requests through Databricks [Unity AI Gateway](https://docs.databricks.com/aws/en/ai-gateway/query-model-services).

### Prerequisites

- A Databricks workspace with Unity Catalog enabled
- Unity AI Gateway enabled for the workspace in a supported region
- Admin access to create, assign, and generate an OAuth secret for a service principal
- Admin access to your Row Zero organization

### Step 1: Create Service Principal and Generate OAuth Credentials

1. Follow the [Databricks documentation](https://docs.databricks.com/aws/en/admin/users-groups/manage-service-principals) to create a new service principal and assign it to your Databricks workspace.
2. In the Databricks page for the service principal, open the **Credentials & Secrets** tab.
3. Click **Generate secret**.
4. Choose a lifetime that follows your organization’s rotation policy, then click Generate.
5. Copy both the Client ID and Secret before closing the dialog. You will use these values in the next step.

### Step 2: Configure Databricks in Row Zero

1. Open your Row Zero [organization settings](/settings/organization/general).
2. Scroll down to the **AI** section.
3. In **AI Provider** Settings, open the Provider dropdown and select **Databricks**.
4. Configure your model settings in the existing [Model Settings](#model-settings) section.
5. Under **Provider** credentials, enter:
    - **Key name:** A descriptive label for the credential, such as row-zero-ai.
    - **Workspace URL:** The HTTPS origin of the target Databricks workspace, such as `https://dbc-...cloud.databricks.com`.
    - **OAuth client ID:** The Client ID copied from the Databricks secret dialog.
    - **OAuth client secret:** The one-time Secret value copied from the Databricks secret dialog.
6. Click **Test Connection**.
7. Wait for the status indicator to show **Connected** (green).
8. Click **Save Changes**.

**Important:** Enter the workspace URL, not the Databricks account-console URL. Row Zero accepts Databricks workspace hosts on AWS, Azure, and Google Cloud.

### Troubleshooting

#### “Failed to obtain Databricks OAuth access token” or 401 Unauthorized

- Verify that the client ID is the service principal application ID and that the client secret is the Databricks-generated OAuth secret.
- Confirm that the secret has not expired or been deleted.
- Confirm that the service principal is Active and assigned to the target workspace.
- Verify that the Workspace URL is the workspace origin and matches the workspace where the principal is assigned.

#### 403 Forbidden or a model permission error

Databricks enables access to system-provided model services for all account users by default, so most accounts do not need to configure model-service permissions. If your organization has restricted access to system.ai, grant the Row Zero service principal the following minimum permissions:

- Confirm that the service principal is assigned to the workspace and has Workspace access.
- In Catalog Explorer, open the system catalog and then the ai schema.
- Grant USE CATALOG on system and USE SCHEMA on system.ai.
- Grant EXECUTE on system.ai. For a narrower allowlist, grant EXECUTE only on each model service selected in Row Zero.
- Check for a DENY rule or an organization-level model allowlist that excludes the service principal or a selected model.
- Confirm that each selected model is available in the workspace’s region and enabled account features.
- If several models are selected, test one model at a time to isolate the denied or unavailable model.

#### Security Considerations

- Use a dedicated service principal for Row Zero so usage can be audited and revoked independently.
- Do not reuse a person’s identity or a personal access token for this integration.
- Grant only Workspace access plus the minimum Unity Catalog model-service permissions required for selected models.
- Do not add the service principal to the admins group.
- Rotate OAuth secrets before expiration and remove the superseded secret after a successful connection test.
- Row Zero encrypts the OAuth client secret at rest and does not return the stored secret after configuration.

---

## Setting Up AWS Bedrock as Your AI Provider

Row Zero will assume an IAM role in order to make requests to Bedrock on your behalf.

### Prerequisites

- An AWS account with Bedrock enabled in your desired region
- Permissions to create IAM roles in your AWS account
- The ability to configure cross-account IAM role trust policies
- Admin access to your Row Zero organization

### Step 1: Start Bedrock Configuration in Row Zero

1. Navigate to your [organization settings](/settings/organization/general) in Row Zero.
2. Scroll down to the **AI** section.
3. Click the **Provider** dropdown and select **Bedrock**.
4. Configure your model settings (see [Model Settings](#model-settings) below).
5. Under **Provider connection settings**, you'll see three fields:
    - **Role ARN**: (empty - you'll fill this in later)
    - **External ID**: A unique identifier generated by Row Zero (visible and copyable)
    - **Inference profile**: Bedrock Inference Profiles distribute requests across multiple AWS regions for higher performance. The default global option routes AI requests across AWS commercial regions world-wide. Choose a regional option to restrict requests to a single geography if you have data residency requirements. Refer to [Bedrock documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html#cross-region-inference-comparison) for details.
6. Click the copy icon next to the **External ID** field to copy the value.
7. Keep this value handy - you'll need it when creating the IAM role.

**Important**: The External ID is a security mechanism that prevents the "confused deputy problem" in cross-account access. See AWS’s [explanation](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) for details. Do not share this ID outside of your AWS role configuration.

### Step 2: Create an IAM Role in AWS

1. Log in to the [AWS IAM Console](https://console.aws.amazon.com/iam/)
2. Navigate to **Roles** → **Create role**
3. Select **AWS account** as the trusted entity type
4. Choose **Another AWS account**
5. Enter the Row Zero AWS account ID: `732940336628`
6. Check **Require external ID**
7. Paste the External ID you copied from Row Zero
8. Click **Next**

### Step 3: Attach Bedrock Permissions

1. Click **Create policy** to create a new policy, or select an existing Bedrock policy.
    - Anthropic models through Bedrock require aws-marketplace access. The minimal required list of actions is shown in the JSON document below.
2. If creating a new policy, use this JSON:

   ```json
   {
       "Version": "2012-10-17",
       "Statement": [
           {
               "Sid": "VisualEditor0",
               "Effect": "Allow",
               "Action": [
                   "bedrock:Get*",
                   "bedrock:List*",
                   "bedrock:InvokeModel",
                   "bedrock:InvokeModelWithResponseStream",
                   "aws-marketplace:ViewSubscriptions",
                   "aws-marketplace:Subscribe",
                   "aws-marketplace:Unsubscribe",
                   "bedrock-mantle:CreateInference",
                   "bedrock-mantle:CallWithBearerToken"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

3. Name your policy (e.g., `RowZeroBedrockAccess`).
4. Attach the policy to your role.
5. Click **Next**.

### Step 4: Name and Create the Role

1. Give your role a descriptive name (e.g., `RowZeroBedrockRole`).
2. Add a description (e.g., "Allows Row Zero to access Bedrock models").
3. Click **Create role**.
4. After creation, click on your new role.
5. Copy the **Role ARN** (it will look like: `arn:aws:iam::123456789012:role/RowZeroBedrockRole`)

### Step 5: Complete Configuration in Row Zero

1. Return to the AI Provider section of your [organization settings](/settings/organization/general) page in Row Zero.
2. Paste the Role ARN into the **Role ARN** field.
3. Click **Test Connection**.
4. Wait for the status indicator to show **Connected** (green).
5. Click **Save Changes**.

**Troubleshooting**: If the connection test fails, verify:

- The Role ARN is correct
- The External ID matches exactly
- The trust policy allows the Row Zero AWS account
- Your role has the necessary Bedrock permissions
- Bedrock is enabled in your AWS region
- If you are updating an existing role with a new externalId, it may take a little while for the change to propagate. Try again after 60 seconds.

---

## Model Settings

Model settings control which AI models are available to users in your organization and which model is selected by default.

### Allowed Models

- Check the boxes for models you want to make available to your users.
- At least one model must be selected.
- Each model has a tooltip describing its capabilities.

### Default Model

- Select which model should be used by default when users access AI features.
- The default model must be one of the allowed models.
- Models marked with "(recommended)" are suggested defaults for most use cases.

**Note**: If you uncheck the current default model, Row Zero will automatically select a new default from your allowed models.

---

## Modifying Existing Settings

### Changing Model Settings Only

1. In the AI section, modify the **Allowed models** checkboxes or **Default model** dropdown.
2. Click **Save Changes**.

**Note**: Changing model settings does not require re-testing your provider connection.

### Changing Provider Credentials

To change providers or update credentials, follow the same steps as setting up a new provider.

Note that for Bedrock, a _new_ **External ID** will be generated when changing IAM roles.

### Disabling AI Features for your organization

1. Select **Disabled** from the **Provider** dropdown.
2. Click **Save Changes**.

**Note**: Disabling AI will remove access to AI features for all users in your organization.

---

## Connection Status Indicators

When testing provider connections, you'll see one of these status indicators:

- 🟡 **Connecting...** - Testing the connection (yellow)
- 🔴 **Connection failed** - Unable to connect (red)
    - Check the error message below the status for details
- ⚫ **Not connected** - No test has been run yet (gray)
- 🟢 **Connected** - Successfully connected (green)

**Important**: You must achieve a **Connected** status before you can save new provider credentials.

---

## Troubleshooting

### Anthropic Connection Failures

**"Invalid API key"**

- Verify the API key is correct and hasn't been copied with extra spaces.
- Confirm the key hasn't been revoked in the Anthropic Console.

### OpenAI Connection Failures

- Make sure your organization has been verified by OpenAI, which allows access to OpenAI’s frontier models.
- Confirm the key hasn’t been revoked in the OpenAI platform.

### Bedrock Connection Failures

**“Failed to assume role”**  
By design, AWS does not provide distinguishable error messages for different types of failures. Some of the common ones are:

- Make sure the role ARN was copied with no typos or extraneous spaces.
- If anything in the trust policy was changed, it can take a few seconds to propagate through AWS.

**“You have not agreed to the terms and conditions needed to use model”**

- Anthropic’s models require you to fill in some terms and conditions for use within Bedrock.
- Follow [Anthropic’s guide](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock#subscribe-to-anthropic-models) for more details.

## Security Considerations

### Credential Storage

- API keys are encrypted at rest and never displayed after initial entry.
- External IDs are cryptographically signed to prevent tampering.
- Provider credentials are never exposed to workbook processes.

### AWS Bedrock Security

- Row Zero uses cross-account role assumption with External ID validation.
- Your AWS credentials never leave your AWS account.
- The role permissions can be scoped to specific Bedrock models or regions.
- You can revoke Row Zero's access at any time by deleting the IAM role.

### Access Control

- Only organization administrators can modify AI provider settings.
- Changes to provider settings affect all users in the workspace.
- Users can only access models that have been explicitly allowed.

---

## FAQs

**Q: Can I use different providers or different settings for different users?**  
A: No, the AI settings are configured at the organization level and the same settings apply to all users.

---

# Frequently Asked Questions

Find answers to common questions and troubleshoot issues in Row Zero

Find answers to common questions below. You can also reference links to further documentation for specific features in the menu to the left.

### Can I view sample spreadsheets to try out Row Zero?

Yes, Row Zero is free to try. You can import your own data or explore sample spreadsheets with large datasets. Here are a few:

- [Sample sales dataset](/datasets/sample-sales-dataset)
- [U.S. flights dataset](/datasets/us-flights-dataset)
- [Baby names dataset](/datasets/us-baby-names-by-year)
- [World Development Indicators dataset](/datasets/world-development-indicators)
- [U.S. demographics by ZIP code](/datasets/demographics-by-zip-code)

[View all public datasets](/datasets)

### What data sources can I connect to?

Row Zero has built-in connectors to [Snowflake](/docs/snowflake), [Databricks](/docs/databricks), [Redshift](/docs/redshift), [Oracle](/docs/oracle), [BigQuery](/docs/bigquery), [Postgres](/docs/postgres), and [Amazon Athena](/docs/athena). You can also connect directly to an [Amazon S3](/docs/s3) bucket to import files. Enterprise plans can support connections to additional data sources.

### What file types does Row Zero support?

Row Zero supports several file formats including CSV, TXT, TSV, Parquet, JSONL, and XLSX. Note that XLSX files will import the data, but may not fully import formatting, charts, pivot tables, obscure functions, macros, or VBA. Row Zero also automatically unzips and opens compressed .gz files.

### Why didn't my file import?

There can be a number of reasons why your file may not import correctly. Here's more information on [troubleshooting import issues](/docs/data-import#troubleshooting-import-issues).

### How do I delete my account and data?

Here is how to permanently delete your account and all of your data:

1. Click on the Account icon in the top right and select 'Account'  

   ![delete account](https://cdn.sanity.io/images/2w8agf2t/production/00190f82334b086b870e4a14b2a242b634793686-1904x917.png)

2. Click the 'Delete your account' button. You'll be given a warning that deletion is permanent and non-reversible. Proceed to fully delete your account.

### How do I change my password?

To change your password, you'll need to log out and use the password reset link to change your password. Here's how:

1. Log out
2. Click log in
3. Enter your email and click continue  

   ![login](https://cdn.sanity.io/images/2w8agf2t/production/e737ebfb98781b11cb688da3d144c61228379ea5-421x554.png)

4. Click the 'Forgot password' link to reset your password  

   ![reset password](https://cdn.sanity.io/images/2w8agf2t/production/859286a88906de6ebe6b65625d6edc6d4a728168-416x544.png)

### How do I restore a workbook I accidentally deleted?

Deleted workbooks are moved to a Trash bin for a short period of time, giving you the chance to undo an accidental deletion. Access Trash in your account in the left side navigation.  

![access trash bin](https://cdn.sanity.io/images/2w8agf2t/production/32f3a753abada734d766d9599bd3332a7c311334-1906x904.png)

  
Click 'Restore' to recover workbooks from the Trash.  

![restore deleted workbook from trash](https://cdn.sanity.io/images/2w8agf2t/production/0d4ab6ec655b3e8a0a38aa126ccbab913b2bdf27-1911x607.png)

  
The Trash bin is only available on Pro, Business, and Enterprise tiers.

### What is the data limit in Row Zero?

Free, Pro and Business plans support 5GB datasets, which typically supports 10s of millions of rows of data. [Enterprise plans](/pricing) can support billion row datasets and scale with your needs.

---

# Troubleshooting data imports

Tips on troubleshooting data import issues

There could be a number of reasons why your file fails to parse or import correctly including extra or missing commas or quotation marks, unescaped quotes, inconsistent formatting, invalid characters, or spreadsheet features we do not yet support.

## Importing CSV files

The CSV file format has no inherent data validation so it is common for CSV files to have errors. You can save any plain text file as a .csv even if it has invalid CSV content or formatting. Our importer attempts to detect and account for these errors, but some errors will cause your file to fail to parse or open correctly.

To troubleshoot CSV errors, it is important to know what a properly formatted CSV file looks like. CSV are plain-text files and are typically structured with fields enclosed by quotes and separated by commas:

```
"Name","Town","ZIP"
"Owen Smith","Boston","81234"
"Roger Jones","Denver","71533"
"Max Collins","Pittsburgh","15213"
```

There is typically a header row and a new line for each entry. Each row needs to have the same number of comma separated values. When there is missing or inconsistent formatting or invalid characters, your file may fail to parse correctly.

## Import warnings

If you see an import warning message like the one below, it means your file was imported, but possible errors were detected during import, so you'll want to double check your imported data.

![csv import warning](https://cdn.sanity.io/images/2w8agf2t/production/7e85ddcf886ba2dd0b9d2221bc865393dab3209f-801x429.png)

Here are possible warnings:

- **Improperly quoted values** - CSV files should enclose fields in quotes to ensure punctuation within fields is handled correctly. If any fields contain quotes, they should be escaped by adding an extra set of quotes around the quoted value. See [#1 and #2 common import errors below](#common-import-errors) for more detail.
- **Not all rows have the same number of fields** - CSV files should have the same number of fields in each row. If some rows have more than others, it can cause parsing errors and some of your columns and rows may not line up as expected.
- **Some values were too long and were truncated** - Cells are limited to 50,000 bytes on import. If a field contains more than 50,000 bytes, it will be truncated.

View the [full list of common import errors below](#common-import-errors).

## File fails to parse or import correctly

If you see a preview of the file that looks correct (like the one below), but the file fails to parse correctly into multiple columns when you click **Import** then this likely means that there is an issue with your file below the first few dozen lines (which correctly populate the preview).

![csv import preview](https://cdn.sanity.io/images/2w8agf2t/production/bbb6f5101bc19e0cc234730747018beecdd529aa-1897x874.png)

  
If the file imports into one column, you can try using the [Split text to columns feature](/docs/split-text-to-columns) to split into columns, but you may still have an underlying issue in your data.

If your file does not correctly populate in the preview but the progress bar completes, then your issue may be in the header or appear in the first few dozen lines.

If the progress bar does not make it to completion or your file loses connection, there could be a number of issues, including problems with the file itself or your file exceeds the memory available on your plan.

See [importing large files](#importing-large-files) below.

## Common import errors

Note: these issues are with the CSV file itself and not unique to Row Zero.

1. **Fields not properly enclosed in quotes**:  
CSV files are typically formatted with fields enclosed by quotes and separated by commas. While not required, enclosing fields by quotes ensures that a CSV importer won't get confused by commas or other punctuation within a field. For example, when a field contains a comma like "Seattle, WA" it will cause errors if not enclosed in quotes:  
`   "Name","Street","City_State","ZIP"  
 "Jill Smith","1234 Main St","Seattle, WA","98109"  
 "Jacob Jones","5615 Lake Dr","Chicago, IL","60652"  
 "Russel Collins","1712 Shady Ave","Pittsburgh, PA","15218"`  
In this example, if your CSV does not enclose fields in quotes, **Seattle** and **WA** will be considered two separate fields which will likely cause rows to have different lengths and mess up your import.
2. **Unescaped quotes**:  
If a field in your file contains quotation marks, they must be escaped, usually by doubling them. For example, this CSV would fail because "Bill" adds quotes but does not escape them:  
`   "William "Bill" Jones","216 Jefferson St","Virginia"`  
In this instance, the quotes around "Bill" must be escaped by doubling the quotation marks around "Bill":  
`   "William ""Bill"" Jones","216 Jefferson St","Virginia"`
3. **Inconsistent or incorrect delimiters**: CSV stands for **comma separated values**. If a file is missing a comma, has an extra comma, or uses inconsistent delimiters (e.g., comma and tab) it can cause the importer to fail to parse the file correctly. If your file uses a different delimiter that is not automatically recognized by the importer, you can specify the correct delimiter in the **Advanced options** in the import preview.  

   ![advanced import settings to specify delimiter](https://cdn.sanity.io/images/2w8agf2t/production/673a133b1e7d7ffcabe64d8740187a0427423718-1892x873.png)

4. **Inconsistent row lengths**: CSV files must have the same number of fields in each row. If one line has more comma separated values than another line, it will lead to CSV parsing errors.
5. **Missing or misaligned headers**: If your file lacks a header row or the header row is misaligned with the data, it can cause import errors. You should also not use duplicate column names. Repeated column names can lead to ambiguity in parsing CSV files. When you expand **Advanced options** on the import preview, you can select to ignore the header row and/or skip X number of rows.
6. **Corrupt data or invalid characters**: If your CSV file contains corrupted or unexpected data, such as binary data in a text column or invalid characters, it can lead to parsing errors or get interpreted incorrectly and appear as gibberish.
7. **Locale differences**: You may experience issues when using number or date formats that differ from the expected locale (e.g. 1,234.56 vs 1.234,56). For locale differences, you may be able to use formulas like [NUMBERVALUE](/docs/spreadsheet-functions#NUMBERVALUE) to convert to your desired format after import.
8. **Whitespace issues**: Leading or trailing whitespace in fields (extra spaces) can cause unexpected results. If your file doesn't import correctly or seems to be missing data, try looking for and removing extra spaces.
9. **Extra, missing, or inconsistent line breaks**: Extra blank lines, missing line breaks, or improper or inconsistent end-of-line (EOL) characters can disrupt parsing. The two common EOL characters are **LF (Line Feed)** (which is **\n** and used by Linux and macOS) and **CRLF (Carriage Return + Line Feed)** (which is **\r\n** and used by Windows). On the import preview under **Advanced options**, you can specify the EOL characters under **Terminator**. In most instances, you do not need to worry about EOL characters since most tools where you'd get your CSV from will use proper EOL characters. When you import into Row Zero you will not see the EOL characters by default as is the case with Excel, Google Sheets, and most tools. Some specialized editors like [Notepad++](https://notepad-plus-plus.org/) have features to make EOL characters visible.
10. **Encoding issues**: The most widely used encoding for CSV files is [UTF-8](https://en.wikipedia.org/wiki/UTF-8). This supports virtually all characters, including special characters and international characters and is recommended for compatibility across applications. Row Zero, Excel, and Google Sheets open CSV files encoded in UTF-8. When you export CSV files from any common software program, the default encoding is UTF-8, so you typically won't need to worry about this.

If you need to troubleshoot CSV errors you can try reaching out to whoever produced the file, inspecting the file in a text editor like Notepad++, or cleaning the file programmatically with Python. View [tips for troubleshooting common import errors](/blog/common-csv-errors).

## Importing XLSX files

When importing XLSX files, you may experience issues if your file contains features we do not yet support. These include some formula functions, anything related to VBA or macros, and some features related to formatting, charts, and pivot tables. While Row Zero supports the common spreadsheet features and functions, there is a long-tail of obscure functions we do not yet support, so you may see an error in cells with unsupported formulas. You can view a full list of [Row Zero functions here](/docs/spreadsheet-functions).

If there is a particular function that you'd like us to support, please [contact us](/contact).

If you experience issues importing an XLSX file, you can try downloading as a CSV instead and then importing into Row Zero. While downloading as a CSV will convert the file to plain text values with no formulas or formatting, it may improve data integrity.

### Opening files from Google Drive and Google Sheets

You can import files (CSV, Parquet, XLSX, etc.) directly from Google Drive into Row Zero by going to **Data** &gt; **Import from URL** in a Row Zero workbook and using this URL structure: `https://drive.google.com/uc?export=download&id=INSERT_FILE_ID_HERE`. To open a Google Sheet in Row Zero, first download the file as an XLSX file or CSV and then open in Row Zero. [Learn more here](/docs/open-files-from-google-drive-and-sheets).

### Importing large files

The Row Zero Free, Pro, and Business plans supports up to 5GB datasets, so if your file is under 5GB, it is unlikely that data size is the issue. Enterprise plans can support much larger datasets and scale with needs.

---

# The Create Data Table Function

Explanation of the Create Data Table function, syntax, examples, key points, and uses.

The Create Data Table function is used to automatically create a data table when provided with a range of cells. The advantage of data tables is they fascilitate live connections and updates to data sets, are read-only so fat finger mistakes aren't possible, and enable writing functions that interact with the data without getting overwritten when the data sets change. The function uses the following syntax:

`=(range)`

- **range** refers to the range of cells you want to use to create the data table.

### Example

Assume you have a dataset in cells A1 to D10 with information about employees, including their names, ages, departments, and salaries. To create a data table for this dataset, simply enter the following formula in a desired cell:

`=(A1:D10)`

The create data table function will automatically analyze the range and generate a data table with appropriate headers and formatting.

## Key Points to Consider

- The create data table function streamlines the process of creating data tables by automatically formatting the data and providing a structured layout.
- It is particularly useful for datasets with multiple columns, as it handles headers and formatting without manual - intervention.
- The function can handle dynamic changes in the data range, automatically adjusting the table when a new row or column is added or existing data is modified.
- It simplifies data organization and analysis, enhancing the readability and usability of the spreadsheet.

## When to Use the CreatedataTable Function

- Creating data tables for various datasets, such as employee records, sales data, inventory information, or survey responses.
- Organizing and managing large datasets to improve data analysis and decision-making processes.
- Using data tables as the basis for creating charts, graphs, and other visualizations to present data insights effectively.

## Summary

The create data table function is a valuable tool for simplifying data table creation in spreadsheets. By providing a range of cells as input, users can automatically generate structured and organized data tables without the need for manual formatting.  Experiment with the creating data tables in your [Row Zero workbook](/new) to explore its capabilities further.

---

# Find with Ctrl + F

Easily find values in a big spreadsheet with Ctrl+F.

The Ctrl + F function makes it easy to locate specific data points in your sheet.  

![find values in a spreadsheet with ctrl+f](https://cdn.sanity.io/images/2w8agf2t/production/0a0d0faefae8a7f7d32c72f9c213d7b8958509ca-1133x599.png)

To activate, press the **Ctrl** and **F** keys at the same time on your keyboard and then enter the value you want to search for. Row Zero will identify all the occurrences and highlight them. Use the up and down arrows to jump to the subsequent or previous occurrence.

You can click the 3 dot menu to expand to [find and replace](/docs/find-and-replace).  

![switch from find to find and replace](https://cdn.sanity.io/images/2w8agf2t/production/6f8b03a7d12e78affc01cc095365a68c29e87820-844x184.png)

![find and replace values in sheet](https://cdn.sanity.io/images/2w8agf2t/production/1f0a51fe9add4586d4182166b8534ff276a4151d-1522x698.png)

---

# Single Sign-On SAML Integration - JumpCloud

SAML single sign-on configuration for enterprise accounts using JumpCloud.

If you have an Enterprise account in Row Zero, you can configure single sign-on (SSO) via [SAML 2.0](https://wiki.oasis-open.org/security/FrontPage#SAML_V2.0_Standard) using your organization's existing JumpCloud SSO provider. Row Zero supports SAML 2.0 for single sign-on with HTTP-POST binding.

Here is the information that you will need to configure a new Row Zero SAML application in JumpCloud:

1. In the JumpCloud console, click on the "**SSO Applications**" link in the left hand panel:  

   ![sso applications](https://cdn.sanity.io/images/2w8agf2t/production/4158b755310d9340df53319afd6ada5ad7c8a349-389x673.png)

2. Click on the "**+ Add New Application**" button towards the top left:  

   ![sso add new application](https://cdn.sanity.io/images/2w8agf2t/production/3c2ea1c59bad8fd196fa62f17f5fb097319ba049-634x286.png)

3. On the new "**Create New Application Integration**" screen, press the "**Select**" link under "**Customer Application**":  

   ![sso create new application](https://cdn.sanity.io/images/2w8agf2t/production/10c8825aeadc199aa6ecda9d56678b0193e8378b-1699x1138.png)

4. When prompted for "**Which application would you like to integrate?**", click the "**Next**" button in the bottom right hand corner:  

   ![sso application to integrate](https://cdn.sanity.io/images/2w8agf2t/production/644cfe79f7a72a2fe606f1a5709b65ef652fab0d-1909x1243.png)

5. When prompted for "**Select the features you would like to enable**", check "**Manage Single Sign-On (SSO)**", "**Configure SSO with SAML**", and "**Export users to this app (Identity Management)**"; then click "**Next**":  

   ![sso saml features](https://cdn.sanity.io/images/2w8agf2t/production/1c8c19859140fd47fd9cd42afbcf2fc39d202898-1899x1239.png)

6. When prompted for "**Enter general info**":
    - For **Display Label** type "Row Zero"
    - Click the **Logo** radio button
    - Dowload the Row Zero log by clicking [this link](https://d3gu6cpxmtctuo.cloudfront.net/brand/v2/rz-logo-black.png)
    - Click **Choose a File** and upload the Row Zero logo
    - Click the **Save Application** button  

      ![sso general information](https://cdn.sanity.io/images/2w8agf2t/production/3314f4a1d2b5d089e4d7b70a3c29e18b7a8b432d-1906x1240.png)

7. Once the Row Zero application was successfully added, click on the "**Configure Application**" button:  

   ![sso saml review](https://cdn.sanity.io/images/2w8agf2t/production/3ea2d2473f6af213e02e20ae9ff9e803605cd089-1911x1245.png)

8. On the "**SAML Single Sign-On**" page under the "**Configuration Settings**" section:
    - For **SP Entity ID** enter `urn:auth0:rowzero:<CONNECTION_NAME>`
        - **Note:** You will need to replace `CONNECTION_NAME` above with an identifier that Row Zero will provide. Contact us when you are setting up your SSO integration and we will give you the `CONNECTION_NAME` to use.
    - For **ACS URLs**, enter **Index** `0` and **Default URL** as `https://auth.rowzero.io/login/callback?connection=<CONNECTION_NAME>`
        - **Note:** Again, replace `CONNECTION_NAME` with the identifier Row Zero provides.
    - For **SAMLSubject NameID** select `email`
    - For **SAMLSubject NameID Format** select `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`
    - For **Signature Algorithm** select `RSA-SHA256`
    - For **Sign** select `Response`
    - For **Default RelayState** enter `https://rowzero.com/startlogin?connection=<CONNECTION_NAME>`
        - **Note:** Again, replace `CONNECTION_NAME` with the identifier Row Zero provides.  

          ![sso saml configuration settings](https://cdn.sanity.io/images/2w8agf2t/production/5eff77f39c379b0d2631eb32a9906ec7d7013160-1557x1617.png)

9. On the "**SAML Single Sign-On**" page under the "**Attributes**" section:
    - Under **User Attributes** click the **Add Attribute** button so two inputs are displayed and enter the following:
        - Enter `email` and `<USER_EMAIL_ATTRIBUTE>` (typically `email`, `user.email`, etc.)
        - Enter `name` and `<USER_DISPLAY_NAME_ATTRIBUTE>` (typeically `displayName`, `user.displayName`, etc.)
    - Under **Constant Attributes** enter the following:
        - Enter `email_verified` and **true**  

          ![sso saml attributes](https://cdn.sanity.io/images/2w8agf2t/production/e0b858b3ea3fdf8e1becc03727b0d853d8024fff-1515x763.png)

10. On the bottom right hand corner of the page, click the "**Save**" button:  

   ![sso saml save](https://cdn.sanity.io/images/2w8agf2t/production/b9759eb9fe2932522b68c5715247b60362fe1327-355x112.png)

11. Click on the "**User Groups**" tab and select any users or groups you wish to allow access to Row Zero and click the "**Save**" button.  

   ![sso saml users and groups](https://cdn.sanity.io/images/2w8agf2t/production/c1ca45073b5909b2d2a409f35fbfa56b8a93455e-1874x1311.png)

Once you have configured a Row Zero SAML application in JumpCloud, contact us at Row Zero so that we can finish configuring the SSO integration on our end.

This is the information that we will need from you:

1. Under the "**SSO**" tab in the "**Configuration Settings**" section, copy the "**Metadata URL**" and provide it to Row Zero:  

   ![sso metadata url](https://cdn.sanity.io/images/2w8agf2t/production/f186db244232a33f49b8bbc9b2a974b1ef966d7d-1297x520.png)

2. Under the "**SSO**" tab in the "**Configuration Settings** section, copy the "**Idp URL**" and provide it to Row Zero:  

   ![sso idp url](https://cdn.sanity.io/images/2w8agf2t/production/009f5b497adc5ce426117a4d3c118d4738b8c822-1300x511.png)

---

# Single Sign-On SAML Integration

SAML single sign-on configuration for enterprise accounts.

If you have an Enterprise account in Row Zero, you can configure single sign-on (SSO) via [SAML 2.0](https://wiki.oasis-open.org/security/FrontPage#SAML_V2.0_Standard) using your organization's existing SSO provider (Okta, Microsoft Entra, etc.). Every SSO platform uses slightly different terminology when configuring an SSO integration, so don't hesitate to contact us for help when you are configuring your provider.

Row Zero supports SAML 2.0 for single sign-on with HTTP-POST binding. We support both identity provider-initiated and service provider-initiated login flows.

Here is the information that you will need to configure a new Row Zero SAML application in your identity provider:

1. ACS (Assertion Consumer Service) URL or Callback URL:
    - `https://auth.rowzero.io/login/callback?connection=<CONNECTION_NAME>`
    - **Note:** You will need to replace `CONNECTION_NAME` above with an identifier that Row Zero will provide. Contact us when you are setting up your SSO integration and we will give you the `CONNECTION_NAME` to use.
2. Audience URI (SP Entity ID):
    - `urn:auth0:rowzero:<CONNECTION_NAME>`
    - **Note:** Again, replace `CONNECTION_NAME` with the identifier Row Zero provides.
3. Application username format:
    - **Email** (NameID format should be `EmailAddress`)
4. Attribute Mappings (Required), with the **_Name Format_** as `Unspecified`:
    - `email` → user `user.emailAddress`
    - `email_verified` → **true** (literal boolean value)
5. Relay State or SP Intiated URL:
    - `https://rowzero.com/startlogin?connection=<CONNECTION_NAME>`

Once you have configured a Row Zero SAML application in your identity provider, contact us at Row Zero so that we can finish configuring the SSO integration on our end.

This is the information that we will need from you:

1. The SAML Sign In URL (also called SSO URL or IdP Metadata URL) for the application
2. The X.509 Signing Certificate from your identity provider (PEM format). **Do not share this via email or other unsecured means.** We will give you a secure way to provide your certificate.
3. Your identity provider domain(s) for login experience (e.g., `yourcompany.com`)

---

# Bring Your Own Bucket Setup

Set up an AWS S3 bucket, IAM role, and trust policy for Row Zero connections that require your own staging bucket.

Some Row Zero connectors ([Athena](/docs/athena), [Teradata](/docs/teradata), etc.) require you to provide your own AWS S3 bucket for staging data. This guide walks you through creating the bucket, configuring the IAM role and policies, and connecting it to Row Zero.

## Step 1: Create an AWS S3 bucket for Row Zero to stage results.

Create a bucket in the same region as your data source. We recommend a name like **s3://YOURCOMPANY-ROWZERO-STAGING/**.  

![create aws bucket](https://cdn.sanity.io/images/2w8agf2t/production/a6c36d9f74bf94d59704ac778abbcebf4947105b-1231x1417.png)

Only temporary data goes into this bucket, so we recommend creating a lifecycle policy to delete all data from this bucket after 1 day.  

![create bucket lifecycle rule](https://cdn.sanity.io/images/2w8agf2t/production/f1f5dc7b9cb7d08cdc58b7ed44c0ee3ba6701e40-835x848.png)

![bucket deletion](https://cdn.sanity.io/images/2w8agf2t/production/825ee30fa343d3eea1525457d628b0e280f6ea60-816x422.png)

## Step 2: Create an AWS IAM role with a trust policy that allows Row Zero to access the bucket.

Create a role that Row Zero will use to read and write staged results in your bucket. The role must have a trust policy that allows the Row Zero account (732940336628) to assume the role, using the connection-specific External ID that is provided when you create your connection in Row Zero ([see Step 3 below](#step-3-attach-an-inline-policy-for-s3-bucket-access)).

![aws role trust relationship](https://cdn.sanity.io/images/2w8agf2t/production/623f5b230bd784e6cbbc3c99465159f27137ab7a-1192x615.png)

## Step 3: Attach an inline policy for S3 bucket access

This role needs permissions to read and write objects in the staging bucket you created in Step 1. Attach the following inline policy to the role, replacing `{YOUR_RZ_STAGING_BUCKET}` with the name of your bucket and `{YOUR_AWS_ACCOUNT_ID}` with your AWS account ID.

```sql
{
   "Version": "2012-10-17",
   "Statement": [{
       "Effect": "Allow",
       "Action": [
           "s3:Get*",
           "s3:List*",
           "s3:Describe*",
           "s3:PutLifecycleConfiguration",
           "s3:PutBucketVersioning"
       ],
       "Resource": [
           "arn:aws:s3:::{YOUR_RZ_STAGING_BUCKET}"
       ],
       "Condition": {
           "StringEquals": {
               "aws:ResourceAccount": "{YOUR_AWS_ACCOUNT_ID}"
           }
       }
   },
   {
       "Effect": "Allow",
       "Action": [
           "s3:Get*",
           "s3:List*",
           "s3:Describe*",
           "s3:AbortMultipartUpload",
           "s3:PutObject",
           "s3:DeleteObject"
       ],
       "Resource": [
           "arn:aws:s3:::{YOUR_RZ_STAGING_BUCKET}/*"
       ],
       "Condition": {
           "StringEquals": {
               "aws:ResourceAccount": "{YOUR_AWS_ACCOUNT_ID}"
           }
       }
   }]
}
```

The first statement grants bucket-level permissions (listing contents, managing lifecycle configuration). The second statement grants object-level permissions (reading, writing, and deleting staged data files).

---

# Workbook Diagnostics

Workbook Diagnostics give you insights into your workbook’s performance and dependencies.

Workbook Diagnostics give you insights into your workbook’s performance and dependencies. This feature is for advanced users to identify expensive calculations in their workbook that may be contributing to why a workbook is slower than expected.

Access Diagnostics via **Help** in the header.  

![access workbook diagnostics](https://cdn.sanity.io/images/2w8agf2t/production/0c7ec914013aee1f20a5d6ded4631eef10a8c4ce-907x384.png)

Within the Diagnostics panel, the **Calculation** tab surfaces any elements that took more than 100 ms to process in your last workbook action.  

![slow workbook calculations](https://cdn.sanity.io/images/2w8agf2t/production/b6fb5256e24c3a965128106334692efe63222d85-1895x679.png)

Click any element to navigate directly to that location in the workbook. Here is a breakdown of the element types in Diagnostics:

- **Range**: Evaluation of a function or group of functions in the sheet
- **Computed column**: Evaluation of a computed column on a data table
- **Table/Table finalization**: Data table operations that prepare your data for viewing. Examples are Pivot table updates, connected table queries, and sort/filter.
- **Chart**: Rendering data for a chart
- **Conditional format**: Evaluation of a conditional format, such as unique/duplicate, heatmap, or custom function.

Click on the **Dependencies** tab to see the downstream dependencies and upstream dependencies for a given cell or range. First select your source to trace. To see dependencies for a pivot table or connected table, click on the top-left cell of the table.  

![select source to trace in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/1232663a8b562f55eec905d88c100138ddd7fe28-1892x829.png)

You can set the maximum number of steps to trace as 5, 10, or unbounded. Steps represent the number of steps this element is either upstream or downstream of the target element. For example, if A1 contains =A2+1, A2 is one _step_ away from A1.

Click **Trace** to surface the up and downstream dependencies for the selected range.  

![trace dependencies in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/b5ee3756e8d95e4f66d4970cad6090889b8b97ef-1908x825.png)

Here again, you can click any of the elements to navigate directly to that location in the workbook. Note, if multiple table items have the same step, it means they are all the same number of steps away from the target.

In addition to accessing via **Help**, you can also open Diagnostics from the progress counter in the bottom right of the workbook by clicking on it while it's showing your progress.  

![click progress bar to access diagnostics](https://cdn.sanity.io/images/2w8agf2t/production/a759f5b33448a7d0fe1e44868a617653b0253600-697x217.png)

---

# Find and Replace

Row Zero makes it easy to find and replace values in a big dataset. Use CTR+H to activate the find and replace feature in your spreadsheet.

The find and replace feature makes it easy to find and replace values in a sheet. Use the keyboard shortcut **CTRL+H** to activate the find and replace feature.

![find and replace all in row zero](https://cdn.sanity.io/images/2w8agf2t/production/16900a17aef3255b37666674ab8bc6b11927018f-858x808.png)

## How to use find and replace

1. To use **Find and replace**:
    - Press **Ctrl+H** on your keyboard, or
    - Use the menu: **Edit &gt; Find and replace**.
2. Enter the values to find and/or replace. You can optionally check **Match case** to make the operation case sensitive or check **Search in formulas** to match formula text.
3. Click **Find** to find matches in the sheet. Click **Replace** to replace each value individually or **Replace all** to replace all matching values at once. 

You can limit your search to a selected range by selecting the cells to search before activating the find and replace feature. If no cell range is selected, it will search the entire sheet.

The find and replace feature does not currently support searching across sheets.

## Functions for find and replace

The following functions let you find and replace text values and substrings.

- [SUBSTITUTE](/docs/spreadsheet-functions#SUBSTITUTE) - Use to replace text values and text within text
- [REGEXREPLACE](/docs/spreadsheet-functions#REGEXREPLACE) - Replaces text in a string based on a supplied regular expression
- [REPLACE](/docs/spreadsheet-functions#REPLACE) - Replaces part of a text string with another text string, with the ability to specify starting position and number of characters to replace

---

# Open files from Google Drive and Google Sheets

See how to open files from Google Drive in Row Zero and import Google Sheets to Row Zero.

You can open files (CSV, Parquet, XLSX, etc.) directly from Google Drive in Row Zero using the steps below. If you want to open a Google Sheet in Row Zero, first download the file as an XLSX file or CSV and then open in Row Zero.

### Open files from Google Drive

Here's how to open a file (CSV, Parquet, XLSX, etc.) in Google Drive directly in Row Zero:

1. Find your file in Google Drive. Right-click and select Share &gt; Share  

   ![google drive access](https://cdn.sanity.io/images/2w8agf2t/production/69ae925e004bfc7f8cb3e0f5a38dc2e5cda643cc-755x579.png)

2. Under “General access” set the file to “Anyone with link” and click “Copy link”  

   ![google drive share](https://cdn.sanity.io/images/2w8agf2t/production/8d4cd7e53073a1799e8b6a70c937c4729f1dfe76-1124x524.png)

3. Paste the copy link into a blank document and select and copy the file ID portion of the URL. In the example link below this is the ID between /d/ and /view  
`https://drive.google.com/file/d/1JMFYOO2lYVGEc8X-WBKkREGTrmJpdjY2/view?usp=sharing`
4. Paste the file ID into the URL structure below and then copy this updated URL:  
`https://drive.google.com/uc?export=download&id=INSERT_FILE_ID_HERE`
5. In a Row Zero workbook, go to Data &gt; Import from URL, paste the URL, and click Next.  

   ![import from Google Drive URL](https://cdn.sanity.io/images/2w8agf2t/production/3248c7c0dc9c1b0ecbda5415daf41130bfe90e89-2559x1156.png)

You'll see a preview screen and then click **Import** to open the file in Row Zero.

### Open a Google Sheet in Row Zero

You have 3 options to import a Google Sheet to Row Zero:

1. Download the Google Sheet as an XLSX file and open in Row Zero  

   ![download google sheet](https://cdn.sanity.io/images/2w8agf2t/production/16f12dba8d0762615b13604998b0e78f4e3680dc-1129x724.png)

2. Download a sheet within the Google Sheet as a CSV and open in Row Zero.
3. Import a CSV of a sheet directly with an export to CSV url. Ensure the Google Sheet is shared as “Anyone with link”, copy the sheet ID from the URL of your Google Sheet and paste into the URL structure below.  
`https://docs.google.com/spreadsheets/d/SHEET_ID/export?format=csv`  
You can then copy this link and open it in Row Zero by going to Data &gt; Import from URL and pasting this link.

---

# Remove Duplicates, Show and Count Unique Values

See how to remove duplicate values in spreadsheets, conditional format duplicates, and show and count unique values with pivot tables and COUNTUNIQUE in Row Zero.

Row Zero makes it easy to find, highlight, and/or remove duplicates in a spreadsheet. You can similarly find, highlight, and count unique values with ease. Here's how:

- [Remove duplicates](#how-to-remove-duplicates-in-your-spreadsheet)
- [Conditional format duplicates](#conditional-format-duplicates)
- [Conditional format uniques](#conditional-format-uniques)
- [Show and count unique values](#show-and-count-unique-values)

### How to remove duplicates in your spreadsheet:

Row Zero makes it easy to [remove duplicate values](/blog/remove-duplicates-and-count-unique-values) in a spreadsheet with a built-in feature that works like remove duplicates in Excel and Google Sheets. Here are steps to remove duplicates:

1. Select the range of cells you would like to remove duplicates from. If you don't select a range of cells, the feature will select the entire sheet by default, which is generally recommended.
2. There are two ways to access the feature:
    - In the header menu, go to **Data**, **Remove duplicates**
    - Click the remove duplicates icon in the formatting menu in the header. **Note**: Depending on your screen size and zoom level, you may need to click the 3 dots to expand the menu to access remove duplicates.  

      ![remove duplicates in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/616f4cd9bbe7d7a7a62bc15a3c2af60f3198f1dd-1587x180.png)

3. Select the column(s) that you want to remove duplicates from. If you select multiple columns, it will only remove duplicate rows that have duplicate values in each of the columns selected. Note that all columns are selected by default, but in many instances you may want to select just one or two columns.  

   ![remove duplicates in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/584927dd6d2c5ef53d3acd76a8e0d8c6d22626e3-1905x842.png)

4. Click **Apply** and all matching duplicate rows will be deleted from the sheet

## Conditional format duplicates

It can sometimes be helpful to show duplicate values in your spreadsheet but not remove them. You can used Row Zero's [conditional formatting](/docs/formatting) feature to set the **Condition** to **Duplicate**. This will find duplicate values in the range and apply your desired formatting to highlight duplicates in your sheet. Here's how to set duplicate conditional formatting:  

![duplicate conditional formatting in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/93259b0e6c3e14fbc1b0e8bcfc702dcfd12cf0a2-1387x702.png)

## Conditional format uniques

Similar to duplicate conditional formatting, you can also use conditional formatting to highlight unique values that only appear once in a range by setting the **Condition** to **Unique**. Here's how to conditional format unique values:  

![conditional formatting unique values in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/961df1c95da2baa3161efa995f5f96a70bd086e0-1379x700.png)

## Show and count unique values

There are a few options for showing and counting unique values in the spreadsheet:

- The **HISTOGRAM** function creates a data table with a row for each unique value and a count of how many times the value appears in the range. Think of it as a quick pivot table count unique.

  ![use the HISTOGRAM function to data table with the frequency of each unique value ](https://cdn.sanity.io/images/2w8agf2t/production/f095bb04b3af985f2078c4a524db8b7bd6790c6b-796x806.png)

- Similarly, creating a [pivot table](/docs/pivot-tables) is an easy way to drill down to unique values in a spreadsheet. Select your data range and go to **Insert**, **Pivot table** and move the field you want to see unique values for to **Rows** and then summarize data by these values by moving fields to **Values**. The simplest way to count uniques is to pull the same field to **Values** as **Rows** and select **Count** as the calculation to apply.  

  ![count unique values with a pivot table](https://cdn.sanity.io/images/2w8agf2t/production/3b3ed5c7cab7987c531302a299950133f3b7d54d-1904x762.png)

- **Pivot Table count uniques values** - Row Zero pivot tables have a built-in **Count Unique** calculation option that counts the number of unique values in a given column or field. This can be very useful for things like counting the number of unique Customer IDs that have performed a particular action or counting distinct email addresses that have logged into a website over a time period. Read more about the [pivot table count unique](/blog/count-unique-pivot-table) values option here.  

  ![pivot table count unique values](https://cdn.sanity.io/images/2w8agf2t/production/559b72239ab34eb7d504bd392cceff5bbb243cb4-1774x720.png)

  [Video: YouTube](https://www.youtube.com/watch?v=POEH3SKHxjI)

---

# Configure SCIM - Microsoft Entra

Row Zero SCIM configuration for enterprise accounts using Microsoft Entra.

This describes how to sync users and groups to **Row Zero** with **Microsoft Entra ID** using SCIM (System for Cross-domain Identity Management). Once set up, any users or groups assigned to the application in Entra ID will automatically sync to Row Zero.

---

## Prerequisites

Before starting, ensure you have:

- Administrator access to **Microsoft Entra ID**.
- A **SCIM Secret Token** provided by the Row Zero team.

---

## Step 1: Create an Enterprise Application

Log into the Microsoft Entra admin center.

1. Navigate to your company’s Microsoft Azure Home and in the left navigation menu of the, select **Enterprise applications**.  

   ![scim entra enterprise applications](https://cdn.sanity.io/images/2w8agf2t/production/eb6801594805f0b25f39749c1d52b80b5576a0b0-484x592.png)

2. Click **+ New application**  

   ![scim entra new application](https://cdn.sanity.io/images/2w8agf2t/production/26fb0937a35a910cb06301c6b976febe06afef24-996x134.png)

3. Choose **+ Create your own application**  

   ![scim entra create application](https://cdn.sanity.io/images/2w8agf2t/production/6e89ed954dd3b04eba482484d8a1658ff7de5679-711x230.png)

4. Enter **Row Zero** as the application name and select **Integrate any other application you don’t find in the gallery (Non-gallery)**.  

   ![scim entra integrate any](https://cdn.sanity.io/images/2w8agf2t/production/cb5a216c148c9845d2072a0354ffa8d318bd07dc-722x451.png)

5. Click **Create**

---

## Step 2: Assign Users and Groups

You must assign users and/or groups to the application before provisioning will sync them to Row Zero.

1. Open the **Row Zero** enterprise application.
2. In the left panel, select **Users and groups**.  

   ![scim entra users and groups](https://cdn.sanity.io/images/2w8agf2t/production/0f2f53a49422cb1ecc6a638594fc9798ec276917-401x465.png)

3. Under **Getting Started**, select **Assign users and groups**.  

   ![scim entra assing users](https://cdn.sanity.io/images/2w8agf2t/production/7d93d03915f5db0c5a7c66d42fd9ff2856de04a5-565x304.png)

4. Click on **Add user/group**
5. Click **None Selected** to open the selection panel.  

   ![scim entra none selected](https://cdn.sanity.io/images/2w8agf2t/production/32345db4935c0ad75c9ce6df308ec25a93dfbb09-428x257.png)

6. Choose the users and/or groups you want to provision into Row Zero.
7. Click **Assign**

---

## Step 3: Configure SCIM Provisioning

1. In the **Row Zero** Enterprise application, select **Provisioning** from the left menu.  

   ![scim entra provisioning](https://cdn.sanity.io/images/2w8agf2t/production/29eaee43ca8a32df33b3b96570d93e4ba23c71ee-440x555.png)

2. Click **Connect your application**.  

   ![scim entra create configuration](https://cdn.sanity.io/images/2w8agf2t/production/6c3457a460736021c918f50b6ebdd322f14693a9-626x209.png)

3. Enter the following details and click **Test connection**:  

   ![scim entra test connection](https://cdn.sanity.io/images/2w8agf2t/production/679c51951fd204c05b7ad9b6ae9ff503a4a49730-768x326.png)

4.  - **Tenant URL**: `https://scim.rowzero.com/scim/v2` - **Secret Token**: Enter the token provided by Row Zero. - If successful, you’ll see a confirmation message.
5. Click **Create** to save the settings.

---

## Step 4: Start Provisioning

From the **Row Zero** Enterprise Application, in the **Overview** tab in the left panel, click **Start provisioning**.

## Once enabled, assigned users and groups will sync into Row Zero automatically on the Microsoft Entra provisioning schedule.

## Notes

- Provisioning typically runs every **40 minutes** by default.
- You can also use **Provision on demand** in the Provisioning blade to trigger a manual sync.  

  ![scim entra test connection](https://cdn.sanity.io/images/2w8agf2t/production/3be32e8ce6f5f07703073e3e059acd749abcdc5e-426x335.png)

- For seamless access, ensure the same users/groups are also assigned to your **Row Zero SSO** application (if SSO is configured). Note that SSO gates access to the Row Zero application for your enterprise while SCIM enables typeahead to easily share / restrict workbooks with your company's defined users and groups.

---

## Frequently Asked Questions

### For Microsoft Entra why does SCIM provisioning use an Enterprise Application?

- SCIM provisioning in Microsoft Entra is configured at the **Enterprise Application** level.
- This is where you connect Row Zero’s SCIM endpoints, provide your SCIM bearer token, and map attributes.
- Users and groups assigned to the Enterprise Application will be automatically synced to Row Zero _**for the type-ahead feature to share workbooks**_, users and groups configured via SSO gate the actual _**access**_ to the Row Zero application.
- Entra does not allow you to configure SCIM provisioning directly on an **App Registration** (which is required for SSO): [Automatic provisioning isn’t available on my OIDC-based application](https://learn.microsoft.com/en-us/entra/identity/app-provisioning/known-issues?pivots=app-provisioning#automatic-provisioning-isnt-available-on-my-oidc-based-application)

### Why is Row Zero not in the Microsoft Gallery?

- Microsoft maintains a gallery of pre-integrated applications for SSO and provisioning but at this time has paused new submissions: [Learn more about the app gallery listing process](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/v2-howto-app-gallery-listing)

---

# Configure SCIM - JumpCloud

Row Zero SCIM configuration for enterprise accounts using JumpCloud.

This guide describes how to configure **Row Zero** with **JumpCloud** using SCIM (System for Cross-domain Identity Management). Once set up, any users or groups assigned to the application in JumpCloud will automatically sync to Row Zero.

_**NOTE: Before configuring SCIM, configure the SSO solution first (**_[_**SSO - SAML (JumpCloud)**_](single-sign-on-saml-jumpcloud) _**or**_ [_**SSO - OIDC (JumpCloud)**_](single-sign-on-oidc-jumpcloud)_**).**_

Here is the information that you will need to configure a Row Zero SCIM application in JumpCloud:

1. In JumpCloud under the "**SSO Applications**" tab, click on the "**Row Zero**" application:  

   ![row zero sso](https://cdn.sanity.io/images/2w8agf2t/production/a34f60c3f8e3ff6b7e6d57e16f7ad5721851910b-1643x544.png)

2. On the "**Identity Management**" tab, under "**Configuration Settings**" configure the following:
    - For **API Type** select `SCIM API`
    - For **SCIM Version** select `SCIM 2.0`
    - For **Base URL** enter `https://scim.rowzero.com/scim/v2`
    - For **Token Key** contact **_[Row Zero Support](https://rowzero.com/contact)_**[ ](https://rowzero.com/contact) for your unique token
    - For **Test User Email** enter `test-scim@YOUR-DOMAIN.com` (replace `YOUR-DOMAIN` with your enterprise domain)
    - Click the "**Test Connection**" button  

      ![row zero scim configuration](https://cdn.sanity.io/images/2w8agf2t/production/f6015352f94076ccd21d554a704dddfc915c68d1-1492x1402.png)

3. Verify that the "**Test Connection**" was successful:  

   ![row zero scim connection successful](https://cdn.sanity.io/images/2w8agf2t/production/bc3b847a1e8d137453d83db3bbcce759a51a2f9b-703x166.png)

4. Under "**Group Management**", check "**Enable management of User Groups and Group Membership in this application.**":  

   ![row zero scim group management](https://cdn.sanity.io/images/2w8agf2t/production/20b80d5a05b2094d14a8792f0107e5fb82f02d8e-1431x234.png)

5. Under "**Attribute Mapping**", configure the following:
    - For the "**Password**" mapping, select "**Exclude**"
    - Add a "**Username**" mapping, select "**Include**"
    - Add a "**DisplayName**" mapping, select "**Include**"
    - Click the "**Activate**" button:  

      ![row zero scim activate connection](https://cdn.sanity.io/images/2w8agf2t/production/6dc17b1a1ebc333bc5c99e87770607b9caea3912-1441x640.png)

6. Click the "**Start Manual Import**" button:  

   ![row zero scim import](https://cdn.sanity.io/images/2w8agf2t/production/8491ab4846b11523cc0fc42de30b78e668a9016a-1483x258.png)

7. If you've already assigned users for SSO, select those users and click the "**Import**" button. Any users added to the applicaiton moving forward will automatically be imported through the SCIM endpoints.

---

# Configure SCIM - Okta

Row Zero SCIM configuration for enterprise accounts using Okta.

This guide describes how to sync users and groups to **Row Zero** with **Okta** using SCIM (System for Cross-domain Identity Management). Once set up, any users or groups assigned to the application in Okta will automatically sync to Row Zero.

_**NOTE: Before configuring SCIM, determine the SSO solution you plan on using.**_

- _**If you are planning to configure SSO through SAML, please follow the instructions in**_ [_**Single Sign-On (SSO) - SAML (Okta)**_](single-sign-on-saml-okta) _**first.**_
- _**If you've already configued Okta to use SAML for SSO, skip to**_ [_**Step 2**_](scim-okta#step-2-configure-the-scim-connection)_**.**_

docs/scim-okta#step-2-configure-the-scim-connection

## Step 1: Create the SAML Application with Provisioning

1. In the Okta "Admin Console", navigate to "Applications --&gt; Applications"  

   ![scim okta applications](https://cdn.sanity.io/images/2w8agf2t/production/7aed2a477b9667071b5c1b3e0993c9872a85a724-287x512.png)

2. Click on the "Create App Integration" button:  

   ![scim okta app integration](https://cdn.sanity.io/images/2w8agf2t/production/541f5e2b7490f2857eb0c9e5503db783f513e73f-286x72.png)

3. Select "`SAML 2.0`" and click the "Next" button:  

   ![scim okta app integration saml](https://cdn.sanity.io/images/2w8agf2t/production/780aad7eb48e70dcf72986e480626a666c7a5fcd-1392x795.png)

4. In the "Create SAML Integration" page, provide the following:
    - For the "**App name**" type "`Row Zero`"
    - Find Upload new logo. You can click [this link](https://d3gu6cpxmtctuo.cloudfront.net/brand/v2/rz-logo-black.png) to download the Row Zero logo, and then upload for "**App logo**"
    - Leave the "**Do not display application icon to users**" _**unchecked**_
    - Click the "Next" button  

      ![scim okta saml settings](https://cdn.sanity.io/images/2w8agf2t/production/f0fc78bdce01de19f2d52cac22e4ee3c6ea045df-1547x853.png)

5. For the "SAML Settings" - "General" page, provide the following:
    - Leave the "**Use this for Recipient URL and Destination URL**" _**checked**_
    - For "**Single sign-on URL**" type "`https://rowzero.com`"
    - For "**Audience URI (SP Entity ID)**" type "`N/A`"
    - Click the "Next" button  

      ![scim okta create saml integration](https://cdn.sanity.io/images/2w8agf2t/production/078f1062b87f7c1dfc9bf9c2e2ed0747b660eab3-1584x1123.png)

6. Click the "Finish" button:  

   ![scim okta create saml integration](https://cdn.sanity.io/images/2w8agf2t/production/78169851f2b92fa4786f096e03a554c8b069c09d-1102x1073.png)

## Step 2: Configure the SCIM Connection

1. In the "**Row Zero**" application, on the "**General**" tab, click the "**Edit**" button:
    - For "**Provisioning**" select "`Enable SCIM provisioning`"
    - Click the "**Save**" button  

      ![scim okta saml settings](https://cdn.sanity.io/images/2w8agf2t/production/17235918dfa295847469323a6b58fe0ef3e22369-1117x1222.png)

2. In the "**Row Zero**" application, on the "**Provisioning**" tab, click the "**Edit**" button:
    - For "**SCIM connector base URL**" type "`https://scim.rowzero.com/scim/v2`"
    - For "**Unique identifier field for users**" type "`userName`"
    - For "**Supported provisioning actions**" select "`Push New Users`", "`Push Profile Updates`", and "`Push Groups`"
    - For "**Authentication Mode**" select "`HTTP Header`"
    - For "**Authorization**" enter the token provided to you by Row Zero
    - Click the "**Test Connector Configuration**" button and verify success
    - Click the "**Save**" button  

      ![scim okta saml settings](https://cdn.sanity.io/images/2w8agf2t/production/19c51604be74c7915c8e5717de501acd7baa1a67-1555x1603.png)

## Step 3: Enable User Provisioning Features

1. In the “**Row Zero**” application, under the “_**Provisioning**_” tab, select “_**Settings —&gt; To App**_”:  

   ![scim okta provisioning app](https://cdn.sanity.io/images/2w8agf2t/production/fdb1f20061422ba520bee0ab094e7bed0ec61e66-1269x562.png)

2. Click the “_**Edit**_” link, and select “_**Create Users**_”, “_**Update User Attributes**_”, and “_**Deactivate Users**_” checkboxes:  

   ![scim okta sync profile](https://cdn.sanity.io/images/2w8agf2t/production/396317fcdfe20bf0878891e3df7e413c29e24676-1281x1120.png)

3. Click the “_**Save**_” button:  

   ![scim okta save button](https://cdn.sanity.io/images/2w8agf2t/production/30740d376806cd9d0b32a01eb6e3be8c456c5199-100x61.png)

4. On the same page, under “**Row Zero**”, click on the “_**Go to Profile Editor**_” button:  

   ![scim okta go to profile editor](https://cdn.sanity.io/images/2w8agf2t/production/7401d5fd460b3aed210eb4b12047c0cd4a0cb0a3-937x226.png)

5. Under the “_**Attributes**_” section click on the “_**Mappings**_” button:  

   ![scim okta plus mappings](https://cdn.sanity.io/images/2w8agf2t/production/c85bb65c35333d5ca5bc4b4aad5173b9242b2904-1267x574.png)

6. Select the “_**Okta User to Row Zero**_” tab:  

   ![scim okta to row zero](https://cdn.sanity.io/images/2w8agf2t/production/3b2a677c77aafba1ca6f800b68ba445ea993131c-949x157.png)

7. Select “_**Do not map**_” for every mapping other than “_**userName**_” and “_**displayName**_”:  

   ![scim okta mappings](https://cdn.sanity.io/images/2w8agf2t/production/232f4dec376cf234f6db2783cae89bd84c9fa227-1461x1155.png)

8. Click the “_**Save Mappings**_” button:  

   ![scim okta mappings](https://cdn.sanity.io/images/2w8agf2t/production/630ebcaaeb1361d871058fcc4b469b1265e1dcec-223x81.png)

9. Click the "_**Apply Updates**_" button

## Step 4: Assign Groups and Users

1. Navigate back to “_**Applications**_” → “_**Applications**_” and click on the “**Row Zero 2.0 App (OAuth Bearer Token)**” application:  

   ![scim okta row zero application](https://cdn.sanity.io/images/2w8agf2t/production/af73f78fa5d240d53fc841c90268f280448c07af-1600x858.png)

2. Under the “_**Push Groups**_” tab press the “_**Push Groups**_” button and select “_**Find groups by name**_”:  

   ![scim okta push groups](https://cdn.sanity.io/images/2w8agf2t/production/f33b1f993f1edb5d187edf50a00356ecf2a120ae-1282x1057.png)

3. Select the “_**Push group memberships immediately**_” checkbox, enter the group name(s) you’d like to sync to Row Zero, and when done click the “_**Save**_” button:  

   ![scim okta push groups selection](https://cdn.sanity.io/images/2w8agf2t/production/813201ef67a54f45630ac70c71f5dc3a37bf539b-1527x1365.png)

4. Under the “_**Assignments**_” tab press the “_**Assign**_” button and select “_**Assign to People**_” for any user in your application that could possibly use Row Zero in order to activate type ahead completion in the secure sharing feature:
    - Note: If Okta makes you populate the “_**Given name**_” and “_**Family name**_” attributes when assigning the user, populate them with relevant values; ultimately these will be ignored by Row Zero in favor of the display name.  

      ![scim okta assign users](https://cdn.sanity.io/images/2w8agf2t/production/ce5b7c3e6a5d31f8a2556270965a1310ac3de09e-943x973.png)

5. Under “_**Assignments**_” tab press the “_**Assign**_” button and select “_**Assign to Groups**_” and assign any of the groups defined under the “_**Push Groups**_” tab:
    - Note: The “_**Push Groups**_” tab tells Okta to sync the group records but not the group membership, the “_**Assignments**_” tab in relation to groups tells Okta to sync the members of the group.  

      ![scim okta assign groups](https://cdn.sanity.io/images/2w8agf2t/production/ce5b7c3e6a5d31f8a2556270965a1310ac3de09e-943x973.png)

---

# Single Sign-On OIDC Integration - Microsoft Entra

Single sign-on OIDC integration for enterprise accounts using Microsoft Entra.

If you have an Enterprise account in Row Zero, you can configure single sign-on (SSO) in Microsoft Entra using [OpenID Connect (OIDC)](https://openid.net/developers/how-connect-works/).

Row Zero is configured to use the OpenID Connect implicit flow for single sign-on with Microsoft Entra (`response_mode=form_post` and `response_type=id_token`). We request the `openid profile email` scopes and assume `email_verified = true` for all users logging in through Microsoft Entra enterprise integrations.

---

### 1. Create an App registration

1. In the Microsoft Entra admin center, go to **Applications** &gt; **App registrations** and select **New registration**.
2. Use these settings:
    - Name: `Row Zero`
    - Supported account types:  
**Accounts in this organizational directory only (Single tenant)**
    - Redirect URI (optional)
        - Platform: **Web**
        - URI: `https://auth.rowzero.io/login/callback`
3. Click **Register**.

### 2. Complete the App registration

Now, find the registration that you just created. In the Microsoft Entra admin center, go to **Applications** &gt; **App registrations** &gt; **All applications** and select **Row Zero**.

1. Go to **Overview**
    1. Select **Endpoints** and find the **OpenID Connect metadata document** and copy the full URL. You will need to provide this to Row Zero for us to complete the integration.
    2. Under **Essentials** find the **Application (client) ID** and copy the full ID. You will need to provide this to Row Zero for us to complete the integration.
2. Go to **Branding & properties**
    1. Find **Upload new logo**. You can click [this link](https://d3gu6cpxmtctuo.cloudfront.net/brand/v2/rz-logo-black.png) to download the Row Zero logo, and then upload it to Microsoft Entra.
    2. Set **Home page URL** to the URL given to you by Row Zero. It will look like `https://rowzero.com/startlogin?connection=<CONNECTION_NAME>`.
        - **Note:** This URL is different for every customer. You will need to replace `CONNECTION_NAME` above with an identifier that Row Zero will provide. Your Row Zero contact will tell you what URL to use for your integration.
    3. Find **Publisher domain** and click **Update domain**. Select **Verify a new domain** and set the Publisher domain to `rowzero.com` ([https://rowzero.com](https://rowzero.com)). Download the microsoft-identity-association.json file under Step 1 and provide that to your Row Zero contact. We will make the necessary configuration change, and then you can click **Verify and save domain**.
3. Go to **Authentication**
    1. Set **Front-channel logout URL** to `https://rowzero.com/logout`
    2. Under **Implicit grant and hybrid flows** click the checkbox to enable **ID tokens (used for implicit and hybrid flows)**. You do not need to enable Access tokens.
4. Go to **API permissions**
    1. Select **Add a permission**. Choose **Microsoft Graph** &gt; **Delegated permissions**.
    2. Select the following permissions:
        - OpenID permissions
            - email
            - openid
            - profile
        - User
            - User.Read
    3. Click **Grant admin consent for (your tenant)** (Recommended)

### 3. Configure the Enterprise application

In the Microsoft Entra admin center, go to **Applications** &gt; **Enterprise applications** &gt; **All applications** and select **Row Zero**.

1. Go to **Properties**
    1. **Enabled for users to sign-in?** `Yes` (Required)
    2. Check that **Homepage URL** and **Logo** match what you configured above.
    3. **Assignement required?** `No` (Recommended)
    4. **Visible to users?** `Yes` (Recommended)

### 4. Complete the Integration

Once you have finished configuring Microsoft Entra, contact us at Row Zero so that we can finish configuring the SSO integration on our end.

This is the information that we will need from you, from the steps above:

1. The OpenID Connect metadata document URL (ends in `/.well-known/openid-configuration`)
2. The Client ID for the application
3. The microsoft-identity-association.json file for verifying our publisher domain

**Note:** You do not need to share a Client Secret because Row Zero currently uses the OpenID Connect implicit flow for single sign-on with Microsoft Entra.

---

## FAQs

### For Microsoft Entra why does SSO use an App Registration?

- Row Zero supports OIDC for SSO.
- In Microsoft Entra, OIDC-based SSO can only be configured through an **App Registration**. App Registrations define how an application authenticates: redirect URIs, client IDs, secrets, and endpoints.
- When you register Row Zero, Entra automatically creates a corresponding Enterprise Application (service principal), but note that object does not support automatic provisioning for SCIM: [Automatic provisioning isn’t available on my OIDC-based application](https://learn.microsoft.com/en-us/entra/identity/app-provisioning/known-issues?pivots=app-provisioning#automatic-provisioning-isnt-available-on-my-oidc-based-application)

### Why is Row Zero not in the Microsoft Gallery?

- Microsoft maintains a gallery of pre-integrated applications for SSO and provisioning but at this time has paused new submissions: [Learn more about the app gallery listing process](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/v2-howto-app-gallery-listing)

---

# Single Sign-On OIDC Integration - JumpCloud

OIDC single sign-on configuration for enterprise accounts using JumpCloud.

If you have an Enterprise account in Row Zero, you can configure single sign-on (SSO) in JumpCloud using [OpenID Connect (OIDC)](https://openid.net/developers/how-connect-works/).

Row Zero is configured to use the OpenID Connect implicit flow for single sign-on with JumpCloud. We request the `openid profile email` scopes and assume `email_verified = true` for all users logging in through JumpCloud enterprise integrations.

Here is the information that you will need to configure a new Row Zero OIDC application in JumpCloud:

1. In the JumpCloud console, click on the "**SSO Applications**" link in the left hand panel:  

   ![sso applications](https://cdn.sanity.io/images/2w8agf2t/production/4158b755310d9340df53319afd6ada5ad7c8a349-389x673.png)

2. Click on the "**+ Add New Application**" button towards the top left:  

   ![sso add new application](https://cdn.sanity.io/images/2w8agf2t/production/3c2ea1c59bad8fd196fa62f17f5fb097319ba049-634x286.png)

3. On the new "**Create New Application Integration**" screen, press the "**Select**" link under "**Customer Application**":  

   ![sso create new application](https://cdn.sanity.io/images/2w8agf2t/production/10c8825aeadc199aa6ecda9d56678b0193e8378b-1699x1138.png)

4. When prompted for "**Which application would you like to integrate?**", click the "**Next**" button in the bottom right hand corner:  

   ![sso application to integrate](https://cdn.sanity.io/images/2w8agf2t/production/644cfe79f7a72a2fe606f1a5709b65ef652fab0d-1909x1243.png)

5. When prompted for "**Select the features you would like to enable**", check "**Manage Single Sign-On (SSO)**", "**Configure SSO with OIDC**", and "**Export users to this app (Identity Management)**"; then click "**Next**":  

   ![sso oidc features](https://cdn.sanity.io/images/2w8agf2t/production/cd029bf4aa96419872f2c179c7b878fac901be12-1899x1236.png)

6. When prompted for "**Enter general info**":
    - For **Display Label** type "Row Zero"
    - Click the **Logo** radio button
    - Dowload the Row Zero log by clicking [this link](https://d3gu6cpxmtctuo.cloudfront.net/brand/v2/rz-logo-black.png)
    - Click **Choose a File** and upload the Row Zero logo
    - Click the **Save Application** button  

      ![sso general information](https://cdn.sanity.io/images/2w8agf2t/production/3314f4a1d2b5d089e4d7b70a3c29e18b7a8b432d-1906x1240.png)

7. Once the Row Zero application was successfully added, click on the "**Configure Application**" button:  

   ![sso oidc review](https://cdn.sanity.io/images/2w8agf2t/production/a3c28889b9e75fa29bc47268e5d3289d0867083b-1895x1245.png)

8. In the "**OpenID Connect**" page under the "**Endpoint Configuration**" section:
    - For **Redirect URIs** enter `https://auth.rowzero.io/login/callback`
    - For **Client Authentication Type** select `Client Secret Post`
    - For **Login URL** type `https://rowzero.com/startlogin?connection=<CONNECTION_NAME>`
        - **Note**: You will need to replace CONNECTION_NAME above with an identifier that Row Zero will provide. Contact us when you are setting up your SSO integration and we will give you the CONNECTION_NAME to use.  

          ![sso oidc endpoint configuration](https://cdn.sanity.io/images/2w8agf2t/production/04d1f414007a4886c478ceb5d2ee5803774bd990-1813x904.png)

9. In the "**OpenID Connect**" page under the "**Attribute Mapping (optional)**" section:
    - For **Standard Scopes** select `Email` and `Profile`  

      ![sso oidc attribute mapping](https://cdn.sanity.io/images/2w8agf2t/production/a440043af7b1b3eaa5996dd74c39834ebe6f54fb-1747x251.png)

    -   
jumpcloud-sso-oidc-attribute-mapping
10. In the "**OpenID Connect**" page under the "**Attribute Mapping (optional)**" section, verify that the "**Constant Attributes**" contains the `email_verified` --&gt; `true` attribute (if not add it); once complete click the "**Activate**" button:  

   ![sso oidc email verified](https://cdn.sanity.io/images/2w8agf2t/production/82bcca40f79133c6fb25bf517308e2f41f9d4859-1839x593.png)

11. When the "**Application Saved**" dialogue box appears, save the "**Client ID**" and "**Client Secret**" to later provide to Row Zero:  

   ![sso oidc client id secret](https://cdn.sanity.io/images/2w8agf2t/production/8100fded407d50acb4a89a4fecf0a66eaac89629-583x628.png)

12. In JumpCloud under the "**SSO Applications**" tab, click on the "**Row Zero**" application:  

   ![row zero oidc](https://cdn.sanity.io/images/2w8agf2t/production/db44b82e87e2ff4b84f76bd3686339f53d47eb0a-2062x484.png)

13. On the "**SSO**" tab, under the "**Attribute Mapping (optional)**" section, update the mappings to the following:
    - Under **User Attribute Mapping**:
        - `preferred_username` --&gt; `email`
        - `name` --&gt; `displayname`
        - `email` --&gt; `email`
    - Under **Constant Attributes**:
        - `email_verified` --&gt; **true**
    - Click the "**Save**" button  

      ![sso oidc update attribute mappings](https://cdn.sanity.io/images/2w8agf2t/production/703dba19be8d27897c1cbda6befa6c0f0491b136-1852x1087.png)

14. Click on the "**User Groups**" tab and select any users or groups you wish to allow access to Row Zero and click the "**Save**" button.  

   ![sso oidc users and groups](https://cdn.sanity.io/images/2w8agf2t/production/53b4a41ec739342cdd89d4bff09a6639cb85ec6b-1854x1312.png)

Once you have configured a Row Zero OIDC application in JumpCloud, contact us at Row Zero so that we can finish configuring the SSO integration on our end. This is the information that we will need from you:

1. **_Client ID_**
2. **_Client Secret_**  

   ![sso oidc client id secret](https://cdn.sanity.io/images/2w8agf2t/production/8100fded407d50acb4a89a4fecf0a66eaac89629-583x628.png)

---

# Single Sign-On OIDC Integration - Okta

Single sign-on OIDC integration for enterprise accounts using Okta.

Row Zero supports the OIDC protocol for single sign-on (SSO). While specific setup instructions for **Okta** are not yet available, you can use the [Other Identity Providers guide](single-sign-on-oidc) to configure SSO.

If you need additional assistance, please [contact us](../contact).

---

# Single Sign-On OIDC Integration

Single sign-on OIDC integration for enterprise accounts.

If you have an Enterprise account in Row Zero, you can configure single sign-on (SSO) via [OpenID  
Connect (OIDC)](https://openid.net/developers/how-connect-works/) using your organization's existing  
SSO provider (Okta, etc.). Every SSO platform uses slightly different terminology when configuring  
an SSO integration, so don't hesitate to contact us for help when you are configuring your provider.

Row Zero is configured to use the OpenID Connect authorization code flow for single sign-on  
(`response_type=code`). We request the `openid profile email` scopes, which are enabled by default  
for most SSO platforms.

Here is the information that you will need to configure a new Row Zero application for single  
sign-on:

1. Sign-in redirect URL or Authorized Redirect URL:
    - `https://auth.rowzero.io/login/callback`
2. Sign-out redirect URL:
    - `https://rowzero.com/logout`
3. Initiate login URL (for users to log in to Row Zero through your provider, e.g. by clicking on a  
Row Zero tile in Okta):
    - `https://rowzero.com/startlogin?connection=<CONNECTION_NAME>`
    - **Note:** You will need to replace `CONNECTION_NAME` above with an identifier that Row Zero  
will provide. Contact us when you are setting up your SSO integration and we will give you the  
`CONNECTION_NAME` to use.

Once you have configured a Row Zero application in your platform, contact us at Row Zero so that we  
can finish configuring the SSO integration on our end.

This is the information that we will need from you:

1. The OpenID Connect metadata URL for the application (typically ends in  
`/.well-known/openid-configuration`)
2. The Client ID for the application
3. The Client Secret for the application. **Do not share this via email or other unsecured means.**  
We will give you a secure way to provide your secret.

---

# Single Sign-On SAML Integration - Okta

SAML single sign-on configuration for enterprise accounts using Okta.

If you have an Enterprise account in Row Zero, you can configure single sign-on (SSO) via [SAML 2.0](https://wiki.oasis-open.org/security/FrontPage#SAML_V2.0_Standard) using your organization's existing Okta SSO provider. Row Zero supports SAML 2.0 for single sign-on with HTTP-POST binding.

Here is the information that you will need to configure a new Row Zero SAML application in Okta:

1. In the Okta "Admin Console", navigate to "Applications --&gt; Applications"  

   ![scim okta applications](https://cdn.sanity.io/images/2w8agf2t/production/7aed2a477b9667071b5c1b3e0993c9872a85a724-287x512.png)

2. Click on the "Create App Integration" button:  

   ![scim okta app integration](https://cdn.sanity.io/images/2w8agf2t/production/541f5e2b7490f2857eb0c9e5503db783f513e73f-286x72.png)

3. Select "`SAML 2.0`" and click the "Next" button:  

   ![scim okta app integration saml](https://cdn.sanity.io/images/2w8agf2t/production/780aad7eb48e70dcf72986e480626a666c7a5fcd-1392x795.png)

4. In the "Create SAML Integration" page, provide the following:
    - For the "**App name**" type "`Row Zero`"
    - Find Upload new logo. You can click [this link](https://d3gu6cpxmtctuo.cloudfront.net/brand/v2/rz-logo-black.png) to download the Row Zero logo, and then upload for "**App logo**"
    - Leave the "**Do not display application icon to users**" _**unchecked**_
    - Click the "Next" button  

      ![scim okta saml settings](https://cdn.sanity.io/images/2w8agf2t/production/f0fc78bdce01de19f2d52cac22e4ee3c6ea045df-1547x853.png)

5. For the "SAML Settings" - "General" page, provide the following:
    - Leave the "**Use this for Recipient URL and Destination URL**" _**checked**_
    - For "**Single sign-on URL**" type "`https://auth.rowzero.io/login/callback?connection=<CONNECTION_NAME>`"
        - **Note:** You will need to replace `CONNECTION_NAME` above with an identifier that Row Zero will provide. Contact us when you are setting up your SSO integration and we will give you the `CONNECTION_NAME` to use.
    - For "**Audience URI (SP Entity ID)**" type "`urn:auth0:rowzero:<CONNECTION_NAME>`"
        - **Note:** Again, replace `CONNECTION_NAME` with the identifier Row Zero provides.
    - For **Default RelayState**" type "`https://rowzero.com/startlogin?connection=<CONNECTION_NAME>`"
        - **Note:** Again, replace `CONNECTION_NAME` with the identifier Row Zero provides.
    - For "**Name ID format**" provide "`EmailAddresses`"
    - For "**Application username**" provide "`Email`"
    - For "**Update application username on**" provide "`Create and Update`"
    - Under _**Attribute Statement (Optional)**_
        - For "**Name**" type "`email`"
        - For "**Name format**" provide "`Unspecified`"
        - For "**Value**" select "`user.email`"
        - Click the "**Add Another**" button
        - For "**Name**" type "`name`"
        - For "**Name format**" provide "`Unspecified`"
        - For "**Value**" type "`user.displayName`"
        - Click the "**Add Another**" button
        - For "**Name**" type "`email_verified`"
        - For "**Name format**" provide "`Unspecified`"
        - For "**Value**" type "`true`"
    - Click the "Next" button  

      ![scim okta saml general settings](https://cdn.sanity.io/images/2w8agf2t/production/9c43516eb4b84ed210c6d0132eddebf495b9bb23-1555x1686.png)

6. Click the "Finish" button:  

   ![scim okta create saml integration](https://cdn.sanity.io/images/2w8agf2t/production/78169851f2b92fa4786f096e03a554c8b069c09d-1102x1073.png)

7. In the "Row Zero" app, under the "Assignments" tab, click on the "Assign" button and select the appropriate users ("Assign to People") and groups ("Assign to Groups"):  

   ![scim okta saml sso assignments](https://cdn.sanity.io/images/2w8agf2t/production/557d7bf57350d93df9faf97156346ca1c56e4199-1137x1066.png)

Once you have configured a Row Zero SAML application in Okta, contact us at Row Zero so that we can finish configuring the SSO integration on our end.

This is the information that we will need from you:

1. The "**Sign on URL**" from the SAML application and the "**Signing Certificate**" from Okta. **Do not share this via email or other unsecured means.** We will give you a secure way to provide your certificate.  

   ![scim okta row zero information](https://cdn.sanity.io/images/2w8agf2t/production/22b7849a7b2267516e0599658ee9e4544604d484-1591x1695.png)

2. Your identity provider domain(s) for login experience (e.g., `yourcompany.com`)

---

# Data validation and dropdowns

Add data validation rules to control data input. Data validation rules are automatically applied as data is updated.

Data validation lets you control data input by enforcing specific rules or criteria. This helps improve data accuracy, consistency, and integrity when collaborating with multiple users.

![dropdown example in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/cfded3811c5b5c18b01417257685482f520bac66-1914x847.png)

## How to add a data validation rule

1. Select your range and go to **Data validation** in the **Data** menu.  

   ![add data validation](https://cdn.sanity.io/images/2w8agf2t/production/0c554c6a73ae077c816af5749bd4a23376e31401-752x617.png)

2. Select your **Condition** and set the valid values or list options.  

   ![data validation rule between numbers](https://cdn.sanity.io/images/2w8agf2t/production/ec4ecf40422d7a9c2b8a315270263ec5f2f068fe-756x560.png)

3.   
Available conditions include:
    - Dropdown
    - Greater than
    - Greater than or equal to
    - Less than
    - Less than or equal to
    - Equal to
    - Not equal to
    - Between
    - Not Between
    - Text contains
    - Text does not contain
    - Text starts with
    - Text ends with
    - Text equals
    - Date equals
    - Date before
    - Date after
    - Date between
    - Custom formula
4. Optionally use **Advanced Options** to set custom error messages or warnings when invalid data is entered.

   [Video](https://cdn.sanity.io/files/2w8agf2t/production/d01b0be37705af94e8f27723ae8ee281efff276f.mp4)

## Inserting a dropdown

Dropdowns are a type of data validation. In addition to selecting **Dropdown** as a condition when creating a data validation rule, you can also insert a dropdown by going to **Insert**, **Dropdown** in the header menu.

Here's how to insert a dropdown in your workbook:

1. Select the range where you'd like your dropdown and go to **Insert**, **Dropdown**.  

   ![insert dropdown in spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/e5e2ac58719fdf4fd0a8b962923dda923d5a4805-859x577.png)

2.   
This creates a data validation rule with condition set to dropdown. List options are automatically populated with any values present in your selected range.  

   ![dropdown list options](https://cdn.sanity.io/images/2w8agf2t/production/7cb6b5e0af21fd4a92b3e40878e7d8ee28054264-794x410.png)

You can add list options manually, or you can select a range to populate the dropdown. To use a range, change **Dropdown source** to **Range** and then click the **Select range** input box to open the range selector. Select your range for dropdown options and click **Confirm**.

![dropdown populated from a range](https://cdn.sanity.io/images/2w8agf2t/production/abd61f056e9164415401eb2487330409310c41f0-1914x920.png)

When you use a range as your dropdown source, the dropdown options will dynamically update as your source range updates.

## Editing and deleting data validation rules

View, edit, and delete any data validation rules on a sheet by going to **Data validation** in the **Data** header menu. Here you can add more rules and edit or delete existing rules.

![edit data validation rules](https://cdn.sanity.io/images/2w8agf2t/production/1de8c7cfbb37449abd1d2d6ed24f41c7d79025ba-1910x916.png)

---

# Open in Row Zero links

See how to create links that dynamically open files in a new Row Zero spreadsheet.

To make it easy for teammates or customers to open large datasets directly in Row Zero, users can create dynamic **Open in Row Zero** links that will open the latest version of a file in a new Row Zero workbook. Here's how to create dynamic links to open a file:

1. Use the following URL structure: [https://rowzero.com/new?link=INSERT_YOUR_LINK_HERE](https://rowzero.com/new?link=INSERT_YOUR_LINK_HERE) and replace INSERT_YOUR_LINK_HERE with the URL of your file.
2. Test your link to make sure it opens the file in a new workbook as expected.
3. Share the link and/or publish it your webpage.

### Advantages of using dynamic links

There are several advantages to using this dynamic link feature:

1. No need to download and upload files
2. If your file updates with new data AND the file URL is unchanged, then the user will get the latest version of the file any time they visit the link.
3. It's an easy way to share big files publicly - anyone can open the file directly without creating an account.

**Related**: [Share a dynamic copy of a Row Zero workbook or template](/docs/share-a-template-copy)

If you need help creating a dynamic **Open in Row Zero** link, please [contact us](/contact).

---

# Share a dynamic copy of a Row Zero workbook or template

See how to create and share a dynamic copy of a Row Zero workbook or template via a URL.

Users can create a dynamic link that will create a copy of the current version of their workbook whenever it is accessed. This can be helpful for sharing dynamic datasets, publishing large datasets, or sharing templates so the sharee can have their own editable copy without impacting the original version.

Here's how to create dynamic copy links for Row Zero workbooks:

1. In the workbook you want to share, click the **Share** button in the top right. At the bottom of the Share window, select **Anyone with link can view** and then click **Copy link**  

   ![share public spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/0db5e428c07012ae4dbac1652c0b53f1831c44a3-1618x898.png)

2. When sharing or publishing the link, add **?copy** to the end of the URL.
3. When anyone visits the link, it will create their own copy of the workbook that they can edit.

**Example**: In our [ZIP Code to State](/blog/zip-code-to-state-county-metro) blog post, we share a public copy of our workbook using the **?copy** URL parameter ([https://rowzero.com/workbook/0F41E1613F44E71C8CB338A4/49?copy](https://rowzero.com/workbook/0F41E1613F44E71C8CB338A4/49?copy)) so that anyone can click the link and open their own editable version of the workbook.

### Advantages of using the dynamic copy feature

There are several advantages to using this dynamic copy feature:

1. No need to download and upload files
2. If your workbook updates with new data, then the user will get the latest version of the file any time they visit the link.
3. It's an easy way to share big files publicly

**Related**: [Create dynamic "Open in Row Zero" links](/docs/open-in-row-zero-links)

If you need help creating a dynamic copy link, please [contact us](/contact).

---

# Single Sign-On SAML Integration - Microsoft Entra

SAML single sign-on configuration for enterprise accounts using Microsoft Entra.

If you have an Enterprise account in Row Zero, you can configure single sign-on (SSO) via [SAML 2.0](https://wiki.oasis-open.org/security/FrontPage#SAML_V2.0_Standard) using your organization's existing Microsoft Entra SSO provider. Row Zero supports SAML 2.0 for single sign-on with HTTP-POST binding.

**Prerequisites**

Before starting, ensure you have administrator access to **Microsoft Entra ID**.

## Step 1: Create an Enterprise Application

Log into the Microsoft Entra admin center.

1. Navigate to your company’s Microsoft Azure Home and in the left navigation menu of the, select **Enterprise applications**.

   ![entra enterprise applications](https://cdn.sanity.io/images/2w8agf2t/production/020f51a1e8fb80cf85031f50a7a1c67e2c0e68a2-484x592.jpg)

2. Click **+ New application**

   ![entra enterpirse new application](https://cdn.sanity.io/images/2w8agf2t/production/de99aad50b66060667909b52c6bb50d5ed7ea9e4-996x134.jpg)

3. Choose **+ Create your own application**

   ![entra create your own application](https://cdn.sanity.io/images/2w8agf2t/production/1e4b338a5c329a53d5b62ece493af9a08b9edaee-711x230.jpg)

4. Enter **Row Zero** as the application name and select **Integrate any other application you don’t find in the gallery (Non-gallery)**.

   ![entra integrate other application](https://cdn.sanity.io/images/2w8agf2t/production/0be7cc2769b8b6a7081d495f3fe06e6521121de7-722x451.jpg)

5. Click **Create**

## **Step 2: Configure SSO**

1. Once the enterprise application is created, click on “**Single sign-on**” in the left tab and click “**SAML**”:

   ![entra sso saml](https://cdn.sanity.io/images/2w8agf2t/production/a65a26e690e489d9b03ca40a6fc65a3cf6169b3f-1353x1212.jpg)

2. Under “**Basic SAML Configuration**” click the “**Edit**” icon:

   ![entra basic saml configuration](https://cdn.sanity.io/images/2w8agf2t/production/c19c3c91b9129148a81a4ae15306d06d5dd1a8ea-1395x1276.jpg)

3. Under “**Basic SAML Configuration**” populate the following and click “**Save**” (**Note:** You will need to replace **CONNECTION_NAME** above with an identifier that Row Zero will provide; contact us when you are setting up your SSO integration and we will give you the **CONNECTION_NAME** to use):
    - Identifier (Entity ID) - urn:auth0:rowzero:_**&lt;CONNECTION_NAME&gt;**_
    - Reply URL (Assertion Consumer Service URL) - `https://auth.rowzero.io/login/callback?connection=`_**`<CONNECTION_NAME>`**_
    - Sign on URL (Optional) - `https://rowzero.com/startlogin?connection=`_**`<CONNECTION_NAME>`**_
    - Relay State (Optional) - `https://rowzero.com/startlogin?connection=`_**`<CONNECTION_NAME>`**_

      ![entra basic saml configuration](https://cdn.sanity.io/images/2w8agf2t/production/1ab7502fe02dc3f5558a7211b0207f34de3e0df8-1069x1216.jpg)

4. Under “**Attributes & Claims**” click the “**Edit**” icon:

   ![entra attributes and claims edit](https://cdn.sanity.io/images/2w8agf2t/production/a2dccb8d574785c02cba118a40b735d311b31583-943x232.jpg)

5. Click “**+ Add new claim**” to establish both “**email**” and “**email_verified**” claims:
    - **Note**: For the “**email**” mapping, make sure it’s mapped to an attribute that _**is populated for each user**_. This attribute can be different for every user definition.
    - **Note**: For “**email_verified**” utilize the transformation “**ToLowercase (user.accountenabled)**” (or whatever user attribute that represents if an account is active) to produce a mapping to either “**true**” or “**false**”.

      ![entra required attributes and claims](https://cdn.sanity.io/images/2w8agf2t/production/6dde37b5426a85a90de1d5289b2cc546d83b6f2f-1098x619.jpg)

6. Provide Row Zero with the “**App Federation Metadata URL**” and “**Login URL**”:

   ![entra row zero needed attributes](https://cdn.sanity.io/images/2w8agf2t/production/24e2010486631843f62f9d392d2d614cbb581f72-946x721.jpg)

## **Step 3: Assign Users and Groups**

You must assign users and/or groups to the application before provisioning will sync them to Row Zero.

1. Open the **Row Zero** enterprise application.
2. In the left panel, select **Users and groups**.

   ![entra users and groups](https://cdn.sanity.io/images/2w8agf2t/production/8d5c147e91644a210bcb247a8e5df1b48bbcf1c6-401x465.jpg)

3. Under **Getting Started**, select **Assign users and groups**.

   ![entra assign users and groups](https://cdn.sanity.io/images/2w8agf2t/production/20bfce96ef8cda12defa8143b3ce251e94e8ab09-565x304.jpg)

4. Click on **Add user/group**
5. Click **None Selected** to open the selection panel.

   ![entra user group assignments](https://cdn.sanity.io/images/2w8agf2t/production/fdb5c252bc620e005260c34d808d6efb35031549-428x257.jpg)

6. Choose the users and/or groups you want to provision into Row Zero.
7. Click **Assign**

---

# Split text to columns

Easily split text to columns in your spreadsheet using the built-in tool. Select the column, specify the separator, and split values.

Row Zero makes it easy to split text to columns using the built-in tool. Here's how:

1. Select the column you'd like to split
2. Go to **Data** in the header menu and select **Split text to columns**.  

   ![split text to columns in a spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/064ae2b0e2199965fcc3329883cd5776b2e187c3-1175x461.png)

3. Select your separator, verify the preview looks good, and then click **Split values**.  

   ![CSV split text to columns in a spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/2cfa54d7be5a6f791c48e6d816bbec35bd1c44eb-1911x848.png)

The text in your column will now be split into multiple columns according to the separator. Note you can set a **Custom** separator, so you can split text to columns in a myriad of ways.

### Common Use Cases for Text to Columns

1. Parsing unparsed CSV data
    - Splitting text to columns is especially useful if you have a CSV file that imports but fails to parse correctly and has all of the data is in one column as shown in the example above.
2. Splitting full names
    - From: Bill Smith
    - To: Bill | Smith
3. Breaking apart addresses
    - From: 123 Main St, Boston, MA
    - To: 123 Main St | Boston | MA
4. Separating dates and times:
    - From: 2025-03-25 14:30
    - To: 2025-03-25 | 14:30
5. Unpacking values with custom separators:
    - From: [ken@rowzero.io](mailto:ken@rowzero.io)
    - To: ken | rowzero.io

### Related parsing functions

There are a number of related parsing functions that may be useful in these situations including [TEXTBEFORE](/docs/spreadsheet-functions#TEXTBEFORE), [TEXTAFTER](/docs/spreadsheet-functions#TEXTAFTER), [LEFT](/docs/spreadsheet-functions#LEFT), and [RIGHT](/docs/spreadsheet-functions#RIGHT). If you need to do the reverse and concatenate a list of values into a single string with a specified delimiter, use [TEXTJOIN](/docs/spreadsheet-functions#TEXTJOIN) or [CONCAT](/docs/spreadsheet-functions#CONCAT).

---

# Spreadsheet

Row Zero is a next-gen spreadsheet engineered for big data and security. Explore all spreadsheet features.

Row Zero is a cloud spreadsheet that [works like Excel and Google Sheets](/features/excel-compatible) but is built for big data, connectivity, and enterprise security. Here's a quick overview of the main spreadsheet features:

[Video: YouTube](https://www.youtube.com/watch?v=Wpo-HITR4IQ)

Row Zero supports the spreadsheet features listed below and is regularly adding new features. [View the latest product releases here](/updates).

If there is a particular feature you can't find that would be useful for you, please [contact us](/contact).

## Typical Spreadsheet Features

Row Zero spreadsheets include the typical features found in traditional spreadsheets like Excel and Google Sheets. Click below to view documentation and examples for each feature.

- [Spreadsheet functions](/docs/spreadsheet-functions) that are Excel-compatible
- [Filter/Sort](/docs/filter-sort)
- [Formatting](/docs/formatting)
- [Charts and graphs](/docs/charts)
- [Pivot tables](/docs/pivot-tables) that dynamically update
- [Slicers](/docs/slicers)
- [Real-time collaboration and sharing](/docs/sharing)
- [Version history](/docs/version-history)
- Duplicate, copy, and paste
- Cell references
- Cross-sheet references
- [Keyboard shortcuts](/docs/keyboard-shortcuts)
- [Data cleaning features](/docs/data-cleaning)
    - [Remove duplicates](/docs/remove-duplicates)
    - [Data validation and dropdowns](/docs/data-validation)
    - [Find with CTRL + F](/docs/ctrl-f)
    - [Find and replace with CTRL + H](/docs/find-and-replace)
    - [Split text to columns](/docs/split-text-to-columns)

## Spreadsheet features unique to Row Zero

- [Big data power and speed](/features/performance)
- [Data tables and connected data](/docs/data-tables)
- [Enterprise security features](/security)
- [Native python code window](/docs/code-window)
- [Support for large file formats](/features/open-large-files) (parquet, JSONL, .gz, etc.)
- [Shared data sources](/docs/shared-data-sources)
- Built-in data connectors
    - [Postgres](/docs/postgres)
    - [Snowflake](/docs/snowflake)
    - [Databricks](/docs/databricks)
    - [Redshift](/docs/redshift)
    - [Oracle](/docs/oracle)
    - [BigQuery](/docs/bigquery)
    - [Amazon Athena](/docs/athena)
    - [Amazon S3](/docs/s3)

      ![connected spreadsheet online](https://cdn.sanity.io/images/2w8agf2t/production/68f583cf588d8ccb1f6c393023ea61c5ade3b59a-1905x938.png)

  
View a comparsion of [Row Zero vs Excel vs Google Sheets](/features/excel-compatible).

## Feedback and Support

If you have feedback on a particular feature, would like to request a feature, or need support with an issue, please [contact us](/contact). You can also click the lightbulb icon in the top right of any workbook to submit feedback directly from the application.  

![submit feedback](https://cdn.sanity.io/images/2w8agf2t/production/f9798f9283e71bc812a26e53822373ac976ff8d7-826x468.png)

---

# Version History in Row Zero

See how to access past versions of your spreadsheet autosaved at each revision. You can also name versions of the same sheet as spreadsheet snapshots.

Row Zero autosaves your spreadsheet at each revision which you can access with **Version History**. You can also name specific versions so you can easily access them later. Here's how to access version history:

Go to **File**, **Version history** in any workbook.  

![spreadsheet version history](https://cdn.sanity.io/images/2w8agf2t/production/3bc3ea3d56e5185af84a9d4b6ab839cdc89d4f75-1912x823.png)

Select **See version history** and the right sidebar will display the past revisions of your workbook along with a time stamp.  

![select autosaved version of spreadsheet](https://cdn.sanity.io/images/2w8agf2t/production/5ea38e1288fa71a5656f82df7b84acd870cbd642-1902x814.png)

  
Here you can hover over a specific revision and click the three dot icon to either **Copy to new workbook** or **Name this revision**. **Copy to new workbook** will create a copy of the selected revision in a new workbook.

**Name this revision** lets you name a specific revision as a spreadsheet snapshot which you can easily access later by opening **Version History** and selecting **Named versions** in the dropdown.  

![spreadsheet snapshot in version history](https://cdn.sanity.io/images/2w8agf2t/production/18666cb3dcd016b6d44b9af202e24b040515ea37-801x413.png)

Spreadsheet snapshots can be very helpful when working with dynamic data and scheduled data refresh. It allows you to go back in time and snapshot a specific state in your spreadsheet. For example, if you want a month end snapshot of a report or dashboard, you can easily do that and then go back and navigate to past months with ease.

**Note**: The version history feature is only available on [paid plans](/pricing) (Pro, Business, Enterprise). However, free spreadsheets are autosaved, so if you need to access a past version of a free spreadsheet, you can upgrade to Pro or Business to access past versions.
