# Migrate OneDrive to Google Drive

> The same trade-offs as the other direction, mirrored: format conversion is now opt-in rather than forced.

Source: https://migratly.dev/migrate/onedrive-to-gdrive/

Migratly migrates OneDrive to Google Drive by reading both APIs live, deriving the mapping between them, and
presenting it for approval before anything is written. This pair covers **8 entity types**
and **21 field mappings**: 7 carry across intact, 10 are flagged as lossy,
partial, dropped or needing another route, and 3 need a decision from you. The OneDrive side is
read-only for the whole run.

## How the structure changes

- The folder tree is recreated first, parent before child.
- Office files stay as Office files by default — conversion to Google-native formats is opt-in, because it is lossy and irreversible.
- Comments only survive on files that were converted to Google-native format.
- A personal Drive cannot be created through the API, so the target is either an existing My Drive or a new shared drive, chosen before the run.
- OneDrive shared links flatten into Drive permissions — anonymous, organisation and per-user scopes do not all have an equivalent.

## Entity map

| OneDrive | Google Drive | Wave | Fields |
|---|---|---|---|
| Drive | Drive | 0 | 2 |
| User | User | 0 | 3 |
| Folder | Folder | 1 | 3 |
| File | File | 2 | 6 |
| Comment | Comment | 3 | 2 |
| Permission | Permission | 3 | 2 |
| Version | Revision | 3 | 1 |
| SharedLink | Permission | 4 | 2 |

## Field coverage

### Drive → Drive

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `name` | `name` | Workaround | Drive cannot create new personal drives via API. Source OneDrive personal → user's My Drive. SharePoint document library → new Shared Drive (requires Workspace admin). |
| `driveType` | no equivalent | Internal | Used to decide target type: 'personal' → My Drive, 'business'/'documentLibrary' → Shared Drive. |

### User → User

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `id` | no equivalent | Lossy | Drive identifies users by email; Microsoft Graph user id (Azure AD object ID) is opaque to Drive. |
| `userPrincipalName` | `emailAddress` | Full | Email is the join key — both workspaces must have matching identities. |
| `displayName` | `displayName` | Full |  |

### Folder → Folder

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `name` | `name` | Full |  |
| `parentReference.id` | `parents` | Full |  |
| `createdDateTime` | `createdTime` | Partial | Drive accepts createdTime on create only via service-account/domain-wide delegation. |

### File → File

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `name` | `name` | Full |  |
| `file.mimeType` | `mimeType` | Partial | Office formats (docx/xlsx/pptx) can optionally convert to Google Docs equivalents — must be opted in. |
| `size` | no equivalent | Internal | Used to choose between multipart (<5MB) and resumable upload (≥5MB). |
| `parentReference.id` | `parents` | Full |  |
| `lastModifiedDateTime` | `modifiedTime` | Partial | Drive accepts modifiedTime on create with the modifiedTime field but only on Shared Drives or service-account uploads. |
| `createdBy.user` | no equivalent | Workaround | Cannot impersonate creator on Drive unless using domain-wide delegation. |

### Comment → Comment

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `body.content` | `content` | Partial | Drive comments only persist on Google-native formats (docs/sheets/slides). If files were uploaded as Office without conversion, comments cannot be reattached. |
| `author.user.email` | no equivalent | Workaround | Cannot post a comment as another user — author name prepended to comment text. |

### Permission → Permission

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `grantedToIdentities[0].user.email` | `emailAddress` | Full |  |
| `roles[0]` | `role` | Partial | Graph roles (read/write) → Drive roles (reader/writer). 'owner' transfer is not supported via API in either direction. |

### Version → Revision

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `id` | no equivalent | Internal | Drive auto-creates a revision per content update; full history requires sequential uploads. |

### SharedLink → Permission

| OneDrive field | Google Drive field | Coverage | Notes |
|---|---|---|---|
| `scope` | `type` | Partial | OneDrive SharedLink scopes (anonymous/organization/users) → Drive permission types (anyone/domain/user). |
| `link.webUrl` | no equivalent | Internal | Drive auto-generates the share URL — original URL preserved in audit log only. |

## FAQ

**Are Word and Excel files converted to Google Docs during migration?**

Only if you ask for it. The default keeps the original Office format, because converting is lossy in ways that cannot be undone after the source is gone.

**Do OneDrive comments carry over to Google Drive?**

Comments survive only on files converted to Google-native format. Comments on files left in Office format cannot be attached and are reported before the run.

**Where do the files land in Google Drive?**

Either an existing My Drive or a new shared drive. Google does not allow creating a personal drive through the API, so the destination is a decision made during planning rather than at runtime.

---

Start a migration: https://app.migratly.dev/
