---
title: Cube for Sheets
description: "Cube for Sheets is the native Google Sheets add-on for Cube."
---

<Note>

Available on [Premium and above plans](https://cube.dev/pricing).

</Note>

After [configuring](#configuration), [installing](#installation), and
[authenticating](#authentication) this add-on, you will be able to [create
explorations via pivot table](#create-explorations-via-pivot-table) and work with
[explorations](#work-with-explorations).

<iframe
  width="100%"
  height="400"
  src="https://www.youtube.com/embed/qPp9hroqd4g"
  title="YouTube video"
  frameBorder="0"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  allowFullScreen
/>

## Configuration

Cube for Sheets uses the SQL API internally. So, the SQL API has to be
[enabled][ref-sql-api-enabled] in the Cube deployment settings.

## Installation

You have to install Cube for Sheets into your Google Workspace organization.
To do so, navigate to its [page in the Google Workspace
Marketplace][link-marketplace-listing] and click **Install**:

<Frame>
  <img src="https://ucarecdn.com/79a183d2-5c18-4adb-93f8-886ec513920f/" />
</Frame>

To verify that the add-on is successfully installed, go to any Google Sheets
document, open the **Extensions** menu, and check that there is the
**Cube Cloud for Sheets** menu item:

<Frame>
  <img src="https://ucarecdn.com/90f3a9d0-abde-4eb4-9222-27e4ebc46c6c/" />
</Frame>

## Authentication

You need to authenticate Cube for Sheets to retrieve data from Cube.
To do so, open the sidebar by going to the **Extensions** menu and choosing
**Cube Cloud for Sheets → Show Sidebar**. Then, click **Log in to Cube**.

{/* TODO: screenshot — sign-in screen redesign, headline "Log in to continue" and a "Log in to Cube" button */}

A modal window with an authentication prompt will appear. Choose the deployments
that you want to work with in Google Sheets and click **Authorize**.
Once you see the `Access Granted` message, close the modal window.

If you want to revoke the authentication, open the add-on menu and click
**Sign out**.

## Create explorations via pivot table

To create an exploration, open the add-on and click **Create exploration**.
Then, select a Cube deployment from the drop-down. Finally,
you can start building a query by selecting a view and its members in the UI that
looks and feels like [Playground][ref-playground].

<Info>

Cube for Sheets works only with [views][ref-views], not cubes.

</Info>

If the view defines [`default_ui_filters`][ref-default-ui-filters], those
filters are pre-populated as soon as you select the view — the same way they
are in workbooks. They are a starting point, not enforcement: you can change
their values, switch operators, or remove them.

Click on members to add them to **Rows** and **Measures**, or drag a member from
the list straight onto **Rows**, **Columns**, **Measures**, or **Filters**. You
can also drag members between zones to rearrange them, or click the funnel
buttons to add members to **Filters**. A member dropped onto **Filters** has no
value yet, so it appears greyed until you set one in the **Filters** pane.
Click on **×** to remove members from a query.

<Frame>
  <img src="https://ucarecdn.com/acc8e133-f237-4aa7-a725-f32dd4a2ebdb/" />
</Frame>

Use **Order** and **Filters** panes below to sort and filter the
data in the exploration.

If you'd like to move the exploration to a new location, click on the desired top-left
cell and then confirm with the target button under **Result location**.

<Frame>
  <img src="https://ucarecdn.com/5a8d2b6a-b415-46ee-9e03-57ea5eeb693a/" />
</Frame>

With every change to your query, Cube for Sheets will update the exploration on
the sheet after a slight delay. If you'd like to minimize it, consider
implementing [pre-aggregations][ref-pre-aggs].

Writing a large result to the sheet can take a few seconds. When it does, a
progress bar appears above the run controls, tracking the write itself rather
than the query.

### Measure position and order

By default, measures nest under each value of the dimension they're paired
with — every measure for the first column value, then every measure for the
next. Open the **Display** tab to change **Measure position** to **Before
columns** to get the opposite layout: each measure spans every column value,
with all values of one measure together before moving to the next.

For example, with `Forecast Sales Units` and `Forecast Net Sales` on Measures
and a `season` dimension on Columns:

- **After columns** (default): `Q1: [Sales Units, Net Sales] | Q2: [Sales
  Units, Net Sales]`
- **Before columns**: `Sales Units: [Q1, Q2] | Net Sales: [Q1, Q2]`

{/* TODO: screenshot — side-by-side of the two output layouts (After columns vs Before columns) */}

The same choice applies when measures are placed on **Rows** instead (set
with **Measures on**, in the same tab) — there it's labeled **After rows** /
**Before rows**.

To change the order measures appear in within their group, drag them within
the **Measures** pane on the **Pivot** tab. Position and order are saved with
the exploration and survive **Refresh**.

When your exploration is ready, click **Save** to add it to your workspace. You
can then [work with the exploration](#work-with-explorations) from the add-on.
To discard an unsaved exploration instead, choose **Delete exploration** from
the editor's **⋮** menu.

## Work with explorations

Opening the add-on shows the current spreadsheet's home: every exploration
placed in this spreadsheet, grouped by sheet — a sheet isn't limited to one
placement — with each placement's range and how long ago it last refreshed.
A placement shows **Out of date** when its source exploration has been
edited since that copy was written to the sheet. Running an exploration
keeps its progress even if you close the pane before saving: it's listed
under its sheet with a **Not saved** label; if it has no sheet or anchor
yet, it appears under a top-level **Unsaved** heading instead. Reopening it
resumes exactly where you left off. The pane can also hold more than one
exploration open at once, switchable from a picker at the top.

Click **Browse all explorations** to search by name across your whole
deployment, not just the current folder — results are grouped by type and
show each item's folder location, and selecting one navigates you straight to
it.

An exploration can be placed more than once — on different sheets or at
different anchors in the same spreadsheet, and in more than one document at
once (a Google Sheets spreadsheet and an Excel workbook simultaneously).
Hovering a row in this list shows every placement it has in the **current**
document under **Location** / **Locations**. Click **Refresh** to update all
of that exploration's placements in the current document at once; click its
title to open it and change the query, which applies to every placement.

**Refresh all**, at the top of the spreadsheet home, refreshes every
placement in the document as a tracked run: a footer at the bottom of the
pane tracks overall progress (**N of M refreshed**) with a **Stop** button,
while each row shows **Queued**, **Refreshing…**, or **Not refreshed** with a
reason if it failed. The run keeps going if you navigate away and back;
refreshes are written one sheet at a time, so a spreadsheet with many
sheets refreshes noticeably slower than a single placement.

If you've edited a placement's cells by hand since it last refreshed, a
banner names the affected rows and warns that the next **Refresh** will
overwrite them — its **Locate** button jumps straight to them.

{/* TODO: screenshot — the hand-edit overwrite banner with its Locate button */}

A placement survives renaming the sheet it's on or the spreadsheet it's in —
it's tracked by the sheet's and spreadsheet's own stable ids, not by name. A
placement's anchor is a fixed cell reference, though, so it does **not**
survive rows or columns inserted above it: the visible data shifts down with
the insert, but the stored anchor doesn't move with it, so the next refresh
targets the wrong cell.

<Frame>
  <img src="https://ucarecdn.com/c8d490c6-80bf-44fe-9233-45121a7c4088/" />
</Frame>

If an exploration has filters applied, an admin can turn on **Show applied filters
in reports** (Settings → Spreadsheet Add-ins) to make the filter state
visible on the sheet itself. When enabled, a summary of active filters is
added above the table, and filtered columns are marked "(filtered)" in
their header, both when the exploration is inserted and after **Refresh**.

Saved explorations also appear in the Cube workspace. See
[Saving explorations][ref-explorations] for details.


[link-google-sheets]: https://workspace.google.com/products/sheets/
[link-marketplace-listing]: https://workspace.google.com/u/0/marketplace/app/cube_cloud_for_sheets/641460343379
[ref-playground]: /docs/explore-analyze/playground
[ref-views]: /docs/data-modeling/views
[ref-pre-aggs]: /docs/pre-aggregations/using-pre-aggregations
[ref-default-ui-filters]: /reference/data-modeling/view#default_ui_filters
[ref-sql-api-enabled]: /reference/core-data-apis/sql-api#cube-cloud
[ref-explorations]: /docs/explore-analyze/explore#saving-explorations
