Choose the reporting boundary
Start with one project when the report is operational. Use a portfolio when you need the same view across several projects. Decide whether completed tasks belong in the report before you select columns.
The manual route: pulling it from Asana's API yourself
- In Asana, go to My Settings → Apps → Developer Console and create a Personal Access Token (PAT). Treat it like a password; anyone with it can read and write everything your account can see.
- Confirm the token works with a request to
GET /users/me, which returns your own user object if the token is valid and a 401 if it isn't. - List the projects you want with
GET /projects, or expand a portfolio into its member projects withGET /portfolios/{gid}/itemsfirst. - Page through each project's tasks with
GET /projects/{gid}/tasks. Asana paginates results, so a project with more than a page of tasks needs the pagination cursor followed to completion, not just the first response. - Pull each project's custom-field definitions separately and match them against the typed values on each task, since the task payload itself references fields by ID, not by the label you see in Asana's UI.
- Write rows into a sheet with the Sheets API or Apps Script, converting due dates to actual date values rather than leaving them as ISO text strings.
None of this is exotic, but it's several hours of one-off engineering for a report that then needs to be re-run by hand every time it goes stale, unless you also build your own scheduling on top.
The columns a task-level export actually needs
| Column | Why it belongs |
|---|---|
| Task name + permalink | Traceability back to the live task, especially once rows are filtered or sorted |
| Assignee | Owner-based filtering and workload views |
| Completed / status | Separates open work from done without reading dates |
| Section | The board-column or list-group a task sits in; see the note below on why this needs its own column |
| Start date, due date | As real spreadsheet dates, not text, so week/month pivots work |
| Tags | A second, independent axis to filter or group by alongside section |
| Custom fields | As their resolved display value: the enum label or number, not an internal field ID |
Section is on that list for a reason: Asana's own CSV export doesn't mark which rows are subtasks or which section they came from. See why Asana's CSV export loses task hierarchy and sections for what the native file leaves out.
Worked example
A five-task slice of a marketing project, exported with the columns above, reads like this once it lands in a sheet:
| Task | Assignee | Section | Due | Priority (custom) |
|---|---|---|---|---|
| Draft landing page copy | J. Reyes | In progress | 2026-09-04 | High |
| Review with legal | M. Okafor | Blocked | 2026-09-06 | Medium |
| Schedule launch email | J. Reyes | Backlog | 2026-09-12 | Low |
With Due written as a real date and Section as plain text, the sheet supports a COUNTIFS by assignee and section, or a pivot table by due week, without any cleanup step first.
Refresh without breaking analysis
Put the raw task export on its own tab. Build pivots, charts, and formulas elsewhere, referencing stable headers. Run a manual refresh first; only schedule it after the row count and permissions match what you see in Asana.
Troubleshooting
A custom field shows an ID instead of a value
That means the field's typed value wasn't resolved against the project's custom-field definitions before it was written to the sheet. Enum and multi-enum fields need their label looked up, not just their raw option ID.
The export seems to stop partway through a large project
Check whether pagination was actually followed to its final page. Asana's task list endpoint returns a cursor for the next page rather than every task at once, so a script that only reads the first response silently truncates.
Stuck on Starter?
Asana's own Sheets export only appears on Advanced and Enterprise plans. See exporting Asana to Google Sheets without an Advanced plan for what that gate means and how to work around it, or does Asana have a Google Sheets integration for what the native feature covers overall.
Reporting on due dates specifically
A report built around due dates, rather than status or assignee, needs its date column written as an actual spreadsheet date, not text, so filtering and pivoting by week works without a conversion step. See exporting your Asana calendar to Google Sheets for that case.
Make the export repeatable
Asana Exporter connects with a Personal Access Token, resolves custom fields to their display values automatically, and saves project and portfolio exports that refresh hourly, daily, or weekly.
See Asana Exporter