Sheets

Action Item Tracker

Read meeting notes from a sheet, extract action items with owners and due dates, and write them to a tracking sheet.

action_tracker.py
"""
Action Item Tracker
===================

Read meeting notes from a sheet, extract action items with owners and due dates,
and write them to a tracking sheet.

Setup:
  1. Create a Google Sheet with meeting notes (free-form text in a column)
  2. Set MEETING_NOTES_SHEET_ID env var
  3. Set Google OAuth credentials (GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET)

Example Input Sheet (Meeting Notes):
  | Date       | Meeting         | Notes                                                    |
  |------------|-----------------|----------------------------------------------------------|
  | 2026-06-15 | Product Sync    | @alice to finalize specs by Friday. @bob to review PRD. |
  | 2026-06-14 | Sprint Planning | @carol owns the auth refactor. Due next Tuesday.        |

Output (Action Items):
  | Action Item           | Owner | Due Date   | Source Meeting  | Status  |
  |-----------------------|-------|------------|-----------------|---------|
  | Finalize specs        | alice | 2026-06-20 | Product Sync    | Pending |
  | Review PRD            | bob   |            | Product Sync    | Pending |
  | Auth refactor         | carol | 2026-06-24 | Sprint Planning | Pending |

Run:
  .venvs/demo/bin/python cookbook/91_tools/google/sheets/action_tracker.py
"""

from os import getenv

from agno.agent import Agent
from agno.models.openai import OpenAIResponses
from agno.tools.google.sheets import GoogleSheetsTools

agent = Agent(
    name="Action Tracker",
    model=OpenAIResponses(id="gpt-5.5"),
    tools=[
        GoogleSheetsTools(
            read_sheet=True,
            update_sheet=True,
        )
    ],
    instructions=[
        "You extract action items from meeting notes and track them.",
        "Look for patterns like '@name to do X' or 'X owns Y' or 'due by Z'.",
        "Extract: the action item, owner (person responsible), and due date if mentioned.",
        "Write extracted items to the specified output sheet.",
        "Set status to 'Pending' for new items.",
        "Be thorough - capture all commitments, not just explicit action items.",
    ],
    markdown=True,
)

if __name__ == "__main__":
    notes_sheet = getenv("MEETING_NOTES_SHEET_ID")
    output_sheet = getenv("ACTION_ITEMS_SHEET_ID", notes_sheet)

    if not notes_sheet:
        print("Set MEETING_NOTES_SHEET_ID to your meeting notes spreadsheet ID")
        print(
            "Optionally set ACTION_ITEMS_SHEET_ID for output (defaults to same sheet)"
        )
        exit(1)

    agent.print_response(
        f"Read the meeting notes from spreadsheet {notes_sheet}, extract all action items "
        f"with owners and due dates, then write them to the 'Action Items' tab in {output_sheet}. "
        "Create the tab if it doesn't exist.",
        stream=True,
    )

Prepare the source and destination tabs

Create the Action Items tab in the destination spreadsheet before running. update_sheet writes cells in an existing tab, and create_sheet creates a whole spreadsheet, not a tab; neither implements the prompt's “create the tab” request. Remove that sentence from the prompt and provide the meeting-notes tab and range, for example 'Meeting Notes'!A1:C100, because read_sheet needs an explicit range.

The displayed due dates are illustrative, not verified calendar calculations. Interpret relative deadlines from each meeting's date and review them before writing. Re-running updates the chosen range and can overwrite existing action items.

Run the Example

Set up your virtual environment

uv venv --python 3.12
source .venv/bin/activate

Install dependencies

uv pip install -U agno google-api-python-client google-auth google-auth-httplib2 google-auth-oauthlib openai

Configure Google OAuth

Enable the Google API used by this example, configure the consent screen, and create a Desktop OAuth client in your Cloud project. Export its GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_PROJECT_ID, or place the downloaded client JSON at credentials.json in the directory where you run Python. Google's Python quickstart shows the Desktop client setup.

The first tool call opens a browser for consent and caches credentials in token.json. Use a separate token_path when switching accounts. Passing an Agno user_id does not switch the authenticated Google account.

Export environment variables

export GOOGLE_CLIENT_ID="your_google_client_id_here"
export GOOGLE_CLIENT_SECRET="your_google_client_secret_here"
export GOOGLE_PROJECT_ID="your_google_project_id_here"
export MEETING_NOTES_SHEET_ID="your_meeting_notes_sheet_id_here"
export OPENAI_API_KEY="your_openai_api_key_here"

Configure the optional output sheet

Set ACTION_ITEMS_SHEET_ID to write action items to a different spreadsheet. When unset, the example writes them to MEETING_NOTES_SHEET_ID.

Run the example

Save the code above as action_tracker.py, then run:

python action_tracker.py

Full source: cookbook/91_tools/google/sheets/action_tracker.py