<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: simonchai-tw</title>
    <description>The latest articles on DEV Community by simonchai-tw (@simonchaitw).</description>
    <link>https://dev.to/simonchaitw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4113127%2F732a2e3e-660b-4b6d-b5e0-f4b6020e83d7.png</url>
      <title>DEV Community: simonchai-tw</title>
      <link>https://dev.to/simonchaitw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simonchaitw"/>
    <language>en</language>
    <item>
      <title>How I built bidirectional Google Tasks ↔ Microsoft To Do sync on Apps Script</title>
      <dc:creator>simonchai-tw</dc:creator>
      <pubDate>Mon, 07 Sep 2026 05:09:47 +0000</pubDate>
      <link>https://dev.to/simonchaitw/how-i-built-bidirectional-google-tasks-microsoft-to-do-sync-on-apps-script-1ago</link>
      <guid>https://dev.to/simonchaitw/how-i-built-bidirectional-google-tasks-microsoft-to-do-sync-on-apps-script-1ago</guid>
      <description>&lt;h1&gt;
  
  
  How I built bidirectional Google Tasks ↔ Microsoft To Do sync on Apps Script
&lt;/h1&gt;

&lt;p&gt;I wanted a small, self-hosted bridge between Google Tasks and Microsoft To Do—not another productivity dashboard or a service that keeps my data forever.&lt;/p&gt;

&lt;p&gt;The result is &lt;a href="https://github.com/simonchai-tw/tasks-todo-sync" rel="noopener noreferrer"&gt;tasks-todo-sync&lt;/a&gt;, an open-source Google Apps Script project that keeps both task systems moving in both directions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why state sync instead of Zapier?
&lt;/h2&gt;

&lt;p&gt;Manual copying is easy for a day and frustrating for a month. Zapier is great when one event causes one action, but bidirectional sync is different: either side can change, events can arrive out of order, and a task can be edited while the other system is unavailable. Triggers, filters, and deduplication rules become hard to reason about.&lt;/p&gt;

&lt;p&gt;The script reads both sides, maps task identities and fields, compares the latest known state, and applies necessary creates, updates, or completions. Stored state gives the sync a memory instead of blindly copying every item on every run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Apps Script?
&lt;/h2&gt;

&lt;p&gt;Apps Script runs on a schedule without managing a server; OAuth and project configuration stay with the automation; the code is approachable JavaScript; and logs make API problems inspectable. The trade-off is that you configure credentials and APIs yourself. This is intentionally self-hosted.&lt;/p&gt;

&lt;h2&gt;
  
  
  MIT, with honest limits
&lt;/h2&gt;

&lt;p&gt;The project is released under the MIT license. It is not a promise of perfect conflict resolution: API quotas, token expiry, renamed or deleted lists, transient failures, and provider-specific fields are real constraints. Back up important data and test with a small task set first.&lt;/p&gt;

&lt;p&gt;If this is useful, a &lt;a href="https://github.com/simonchai-tw/tasks-todo-sync" rel="noopener noreferrer"&gt;soft star on GitHub&lt;/a&gt; helps others find it. Feedback is welcome: &lt;a href="https://github.com/simonchai-tw/tasks-todo-sync" rel="noopener noreferrer"&gt;repo and setup notes&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
