Google Tasks to Planner Sync
On a schedule, the flow syncs Google Tasks into Microsoft Planner (and back), mapping task lists to plans/buckets, status, and due dates, keyed on a stored ID map to avoid duplicates. Lets users who live in Google Tasks and Planner stay aligned.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow keeps Google Tasks mirrored into Microsoft Planner on a schedule. Each run reads every task from a configured Google Tasks list, looks it up in a Dataverse ID-map table, and either creates a new Planner task (first time it is seen) or updates the previously-created Planner task (title, due date, completion). A run summary is posted to Microsoft Teams.
Why it matters: People who plan in Google Tasks but whose team tracks delivery in Planner get an automatic, deduplicated bridge — no manual re-keying, and no duplicate Planner cards on repeat runs.
Status: Built and verified (Flow Checker 0 errors / 0 warnings). Ships Off — going live only requires authorizing the four connections and setting the six environment-variable values.
Use Case
A project team captures personal/ad-hoc work in Google Tasks but runs sprints in Microsoft Planner. They want Google tasks to appear and stay current as Planner cards, keyed so the same Google task never creates a second Planner card, with a daily Teams note confirming what synced.
Flow Architecture
Recurrence
Recurrence (daily)Runs the sync on a schedule (cadence is adjustable).
Initialize varGoogleTaskListId ... varTeamsChannelId
Initialize VariableBind the six environment variables to in-flow variables.
Initialize varCreatedCount / varUpdatedCount
Initialize VariableRun counters for the summary (Integer = 0).
List Google Tasks
Google Tasks — ListTasksRead all tasks from the configured Google list.
List Existing Mappings
Microsoft Dataverse — ListRecordsLoad the ID-map rows (known Google->Planner links).
Apply to each Google Task
Foreach (sequential, concurrency 1)Reconcile each Google task.
Filter Existing Mapping
Filter arrayFind this task's map row by Google Task ID.
Condition Is New Task
ConditionBranch: create vs update.
Create Planner Task / Create Mapping Record / Increment Created
Microsoft Planner — CreateTask_V3, Microsoft Dataverse — CreateRecord, IncrementVariableNew task: create Planner card, store the ID map, tally.
Update Planner Task / Update Mapping Record / Increment Updated
Microsoft Planner — UpdateTask_V2, Microsoft Dataverse — UpdateRecord, IncrementVariableKnown task: update Planner card + map row, tally.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_GoogleTaskListId | String | @default | Google Tasks list to sync from. |
| flowlibs_PlannerGroupID | String | <configure> | M365 group owning the Planner plan. |
| flowlibs_PlannerPlanID | String | <configure> | Target Planner plan. |
| flowlibs_PlannerBucketId | String | <configure> | Target bucket for new tasks. |
| flowlibs_TeamsGroupId | String | <your-team-id> | Teams team (group) for the summary post. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Teams channel for the summary post. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Google Tasks | shared_googletasks | ListTasks |
| Microsoft Planner | shared_planner | CreateTask_V3 UpdateTask_V2 |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord UpdateRecord |
| Microsoft Teams |
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Cadence
- Change the Recurrence frequency/interval (default daily).
- One list per flow
- Point flowlibs_GoogleTaskListId at the desired Google list; clone the solution for additional lists.
- Completion handling
- Update Planner Task already maps Google completed -> 100% complete; adjust the percentComplete expression for partial states.
- Skip completed tasks
- Add a Filter array before the loop to keep only status eq 'needsAction' if you do not want completed tasks mirrored.
- Reverse direction
- Add a second flow triggered by Google Tasks OnCompletedTaskInListV2 writing closure back into the Dataverse map and (optionally) Planner.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01New vs update
True when no existing mapping is found.
EXPR.02Match a map row to a Google task
Finds the map row by Google Task ID.
EXPR.03Mapped Planner task id (update branch)
Planner task id for the update.
EXPR.04Map row id for UpdateRecord
Dataverse row id for the map update.
EXPR.05Completion mapping
Maps completion to percentComplete.
EXPR.06New Planner task id stored to map
Stores the new Planner task id on the map row.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.