DailyRoundup

Google Tasks Import

DailyRoundup can import tasks from a Google Tasks list into an existing synced list. Imported tasks land in the paired Reminders list and the next sync cycle pushes them to Trello.

Google Cloud OAuth Setup

Before the feature can be used, the app must be registered with the Google Cloud Console.

1. Create a Google Cloud Project

  1. Go to Google Cloud Console and create a new project (or select an existing one).
  2. Navigate to APIs & Services > Library.
  3. Search for Google Tasks API and click Enable.
  1. Go to APIs & Services > OAuth consent screen.
  2. Select External user type (or Internal if using a Google Workspace org).
  3. Fill in the required fields:
    • App name: DailyRoundup
    • User support email: your email
    • Developer contact information: your email
  4. On the Scopes step, click Add or remove scopes and add:
    • https://www.googleapis.com/auth/tasks (read/write access — required for optional deletion of imported tasks)
    • email (displays the signed-in account in the import breadcrumb)
  5. Complete the remaining steps and publish the consent screen.

3. Create an OAuth 2.0 Client ID

  1. Go to APIs & Services > Credentials and click Create Credentials > OAuth client ID.
  2. Select iOS as the application type. (Mac Catalyst shares the iOS bundle ID, so a single iOS client ID works for both platforms.)
  3. Enter the Bundle ID: dev.dcwalker.DailyRoundup
  4. Click Create and note the Client ID (e.g., 123456789-abc.apps.googleusercontent.com).

4. Update the App Code

The client ID and redirect URI are configured in GoogleTasksClient.swift (clientId and redirectURI constants) and the matching URL scheme is registered in Info.plist. If you are using a different Google Cloud project, replace these values with your own:

static let clientId = "YOUR_CLIENT_ID.apps.googleusercontent.com"
static let redirectURI = "com.googleusercontent.apps.YOUR_CLIENT_ID:/oauth2callback"
<string>com.googleusercontent.apps.YOUR_CLIENT_ID</string>

5. App Verification (if required)

If the app is published externally (not limited to test users), Google may require verification of the OAuth consent screen before the tasks scope is available to all users. This review process can take several days to weeks. During development, add test user emails under OAuth consent screen > Test users.

How the Import Works

  1. The user taps the import button (arrow icon) on the main task screen.
  2. An OAuth sign-in flow authenticates the user with Google using PKCE.
  3. The user reviews the signed-in Google account. A Switch Account button allows changing accounts at any time.
  4. The user selects a Google Tasks list to import from. If the account has only one list, it is auto-selected and this step is skipped.
  5. The user selects an existing synced list as the destination.
  6. The user optionally chooses to delete Google tasks after import.
  7. The import runs in the background — each task is imported transactionally.

Field Mapping

Google Tasks Reminders Notes
title Title Subtasks are prefixed with parent title (e.g., “Parent: Subtask”)
notes Notes Direct mapping
links Notes (appended) Link URLs appended to notes (e.g. Gmail source)
due Due date Imported as all-day reminder (Google dates have no time component)
status Completion completed → marked complete; needsAction → incomplete
Priority Default Reminders value (no Google Tasks equivalent)

Subtask Handling

Google Tasks supports parent/child relationships. Since EventKit has no public API for Reminders subtasks, child tasks are flattened to top-level tasks with the parent’s title prefixed — e.g., a subtask “Buy milk” under “Groceries” becomes “Groceries: Buy milk”.

Transactional Safety

Each task import is atomic:

  1. Create the Reminder in the target list.
  2. If deletion is enabled, delete the Google task.
  3. If any step fails (rate limit, network error, OS interruption), the Reminder is reverted and the Google task is left untouched.

If the OS terminates the app during import, the user is informed on next launch and can safely retry.

Rate Limits

The Google Tasks API has a 50,000 requests/day quota. If a rate limit is hit, the import stops and the user is notified. Already-imported tasks are unaffected.