> ## Documentation Index
> Fetch the complete documentation index at: https://cubed3-igor-document-row-level-allow-all.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Cube for Sheets

> 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**.

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, the window will close automatically.

<Warning>
  Google Apps Script authenticates the add-on as whichever Google account you
  signed in to first in the browser, not necessarily one with access to the
  open spreadsheet. If they differ, the add-on can't reach the spreadsheet and
  the cursor status reads **Cannot read your selection**. Sign in to only one
  Google account per browser profile (or use a private/incognito window) to
  avoid this — or sign out of every Google account and sign back in with an
  account that has access to the file first.
</Warning>

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.

Above the query editor, a **cursor row** (`● Sheet1 · A1` next to **+ New**)
shows the cell you last selected in the sheet. It can briefly lag your click;
press the target button in that row to re-read your selection. It only
refreshes the readout — it doesn't move or write anything.

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**. Unlike the cursor row's button, this one moves the
exploration.

<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]`

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**.

### Column totals

The **Column totals** switch, below **Measure position** on the **Display**
tab, appends a bold **Total** row at the bottom of the written range, with one
value per measure column. It's disabled, with a tooltip explaining why, until
the query has at least one measure.

Each total is computed by a separate query rather than summed from the cells
on the sheet, so it's correct for non-additive measures — an average totals
to the average over the whole column, not an average of the visible rows,
and the same for a count-distinct. With a dimension pivoted onto columns,
each pivot column gets its own total the same way.
[Calculations][ref-calculated-fields] based on window functions, such as
running totals, are excluded — the same exclusion as Cube's own [row,
column, and pivot totals](/docs/explore-analyze/workbooks/querying-data#totals).

Totals are computed over the query's full result, not just the rows visible
on the sheet, so a row-limited query still totals the whole result. Measure
filters are dropped from the totals query; dimension filters are kept. With
measures on **Rows** and no row dimension, no totals row is written, since
each "total" would just restate its own data row.

Column totals are saved with the exploration and survive **Refresh**; with
auto-run off, toggling the switch waits for **Run** like any other display
change.

### Row totals

The **Row totals** switch, next to **Column totals** on the **Display** tab,
appends a bold **Total** column at the right of the written range, totaling
each row across the pivot columns. It needs a measure in the query and a
dimension on **Columns** to pivot across — it's disabled, with a tooltip
explaining which is missing, until both are set. With measures on **Columns**,
each measure gets its own total column; with measures on **Rows**, a single
total column covers them all, since each row already holds one measure.

Like column totals, each total comes from a separate query grouped by the
opposite zone, so the same rules apply: correct for non-additive measures,
window-function [calculations][ref-calculated-fields] excluded, measure
filters dropped and dimension filters kept, and totals taken over the query's
full result rather than the rows on the sheet. With both switches on,
the cell where they meet holds a grand total across the whole result, from a
third query with neither zone kept.

Row totals are saved with the exploration and survive **Refresh** too; with
auto-run off, toggling the switch waits for **Run** like any other display
change.

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.

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**.

A single exploration can depart from that default: the **Applied filters**
control on the editor's **Display** tab takes precedence over the inherited
setting. **Show** and **Hide** pin the choice for that exploration wherever
it's placed, while the default option spells out what it would otherwise
inherit — **Default (show)** or **Default (hide)**. The control is unavailable
until the exploration has filters to summarize.

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

## Chat

<Warning>
  The chat pane is currently in preview, and the tools it can call may still change. Reach out to the [Cube support team](/admin/account-billing/support) to activate this feature for your account.
</Warning>

With chat enabled, the add-on's sidebar gains a pane that can act on the
spreadsheet, not just answer questions about it. Ask it to run a query and
place the results, or refresh or clear a placed exploration. It can also
create, rename, or delete a sheet, and organize your saved explorations into
[folders][ref-folders] — list, create, rename, move, or delete one on
request. Deleting one this way [destroys less than the Workspace page but checks
less too][ref-deleting-folders].

Drag a saved exploration or an unsaved draft from the spreadsheet's home onto
the chat composer to attach it as context for your next question.

Before any destructive or ambiguous action on the sheet — writing over an
occupied area, clearing a placement, renaming or deleting a sheet — the pane
asks you to confirm first. A query the agent places lands as an **unsaved**
exploration; save it yourself if you want to keep it. Folder actions are the
exception: creating, renaming, moving, or deleting one runs immediately,
without a confirmation step.

Answers are tables, not charts — the chat pane doesn't render
visualizations. Past conversations are listed under **Chat History** in the
pane — every conversation you've had in the add-on on this deployment, not
just the current spreadsheet's — and sync with your Cube account, so they're
available from any device. Like other conversations, they're readable by
admins and anyone with the **Access chat history** permission under
[Chats History](/admin/monitoring/chats-history).

[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

[ref-calculated-fields]: /docs/explore-analyze/workbooks/calculated-fields

[ref-folders]: /docs/organize-content/folders

[ref-deleting-folders]: /docs/organize-content/folders#deleting-folders
