To build explorations inside a spreadsheet and refresh them by hand, use the
Cube for Sheets add-on instead. Deliveries don’t need the
add-on.
Before you start
You need:- the Admin, Developer, or Explorer role;
- a saved exploration you can read; an unsaved one is saved as part of creating the delivery;
- a Google account connected to Cube that is an editor of the target spreadsheet.
Connect a Google account
Cube writes every run as one Google account: the delivery owner’s. Spreadsheet version history shows that account as the editor.- Open Connected accounts, listed below Preferences in the settings sidebar.
- In the Google Sheets section, click Connect and approve the Google consent screen in the pop-up. Cube asks for your email address and access to your Google Sheets spreadsheets.
- Optionally, paste a spreadsheet URL under Test access to a spreadsheet and click Test access. Cube opens the spreadsheet as your account and lists its tabs.
Create a delivery
Start from either place:- Explore: open the chevron next to Convert to workbook and choose Deliver to Sheets. The exploration becomes the delivered report.
- Scheduled → Sheets deliveries: click New delivery, or choose New delivery to this spreadsheet on an existing delivery’s row.
Click Create. A new delivery doesn’t run until its first scheduled time; use Run
now to write the sheet right away.
Only one delivery can write to a given spreadsheet, tab, and start cell. Saving a
second one is rejected with the name of the delivery that already writes there.
Write modes
Append never removes duplicates, so it suits snapshot reports such as “yesterday’s
orders”, not cumulative ones. An append delivery keeps growing until it reaches
Google’s cell limit.
Schedule
The timezone defaults to your browser’s. Runs of one cron expression must be at least
15 minutes apart, so
*/15 9-17 * * 1-5 works but */10 * * * * doesn’t. The L, W,
#, ?, and H cron tokens aren’t supported.
To run on several unrelated schedules (up to 24 cron expressions), set them through
the API. The dialog shows such a schedule but can only replace it as a
whole.
Notifications
A delivery notifies its owner when it fails and when it starts working again. Choose the channels in the dialog:
How often it notifies depends on the schedule:
- Runs more than once a day: only when its status changes, once when it starts failing and once when it recovers.
- Runs daily or less often, or only on demand: after every failed run, and once on recovery.
What a run writes
Each run executes the report’s saved query with the owner’s data access and writes the result as a flat table:- one bold header row, using the query’s column names, then one row per result row, in the query’s own order;
- numbers as numbers, booleans as
TRUE/FALSE, and nulls as empty cells; a row with nulls is never dropped; - timestamps as date cells, formatted
yyyy-mm-ddwhen every value in the column is midnight andyyyy-mm-dd hh:mm:ssotherwise, with no timezone conversion.
- It tracks the block with a named range in the spreadsheet, so rows or columns you insert above or to the left move the block instead of breaking it. Don’t delete that named range.
- When the result shrinks, Cube clears the leftover cells. When it grows, it extends only into empty cells. If the block would cover cells holding anything else, the run fails and writes nothing.
- Overwrite resets values and formatting inside the block on every run, so keep notes and formatting outside it.
shape through the
API.
Changing a delivery’s tab or start cell clears the old block on the next run. Moving it
to another spreadsheet leaves the old block untouched.
Manage deliveries
Open Scheduled → Sheets deliveries. Admins see every delivery in the deployment; everyone else sees only their own. Each row shows the report, spreadsheet, tab and start cell, schedule, next run, last run, and status.
Run now, Pause, Resume, and Delete also work on several selected rows.
Click a delivery to see its Run history: each run’s status, trigger (Manual or
Scheduled), start and finish time, duration, rows and cells written, and error.
Statuses
A failing delivery keeps running on its schedule; it isn’t paused automatically.
Transfer ownership
A delivery runs as its owner: the query uses the owner’s data access, and the owner’s Google account writes the sheet. An admin can hand it to another user with Transfer owner. The new owner must be active, be able to read the report, and have a Google account connected. A transfer returns an Orphaned or Reconnect Google delivery to Active.Retries and failures
Cube retries temporary errors, such as Google or data source rate limits, timeouts, and unavailable services, up to 5 times over roughly 7 minutes before the run fails. A run that hasn’t finished after an hour is marked as failed. Common failures:Limits
- Spreadsheet size: Google caps a spreadsheet at 10,000,000 cells, counting the full grid of every tab, empty cells included. A run that would exceed it fails before writing.
- Rows: deliveries have no row cap of their own. A run delivers what the report’s saved query returns, so the report’s own row limit applies. To deliver more rows, raise the report’s row limit, and the deployment’s maximum row limit if needed.
- Timestamps on the sheet: a run writes no “last updated” stamp into the
spreadsheet. Use the run history, or
lastRunAtandlastSuccessAtin the API. - Triggers: a delivery runs on its schedule or on demand. It can’t run automatically after a pre-aggregation refresh; call the API from your pipeline instead.
Platform API
Every delivery setting, includingshape and multiple cron expressions, is available
through the Platform API under
/api/v1/deployments/{deploymentId}/report-deliveries; see the
Report Deliveries reference for every field. Authenticate with a Platform
API key or an OAuth token (report.read scope for reads, report.write for changes);
embed tokens are refused. Until the feature is activated for your account, these
endpoints return 404.
For example, to create a daily overwrite delivery with a fixed column layout:
shape.columns sets the column order and headers; each entry is a query column
(column, with an optional header) or an empty column (placeholder: true with a
header, which can be empty). Placeholder columns are cleared on every run, so don’t
type into them.
The API doesn’t check that the Google account can open the spreadsheet when you
create a delivery; access problems show up on the first run.