How to move calender from one account to another, when both are Microsoft Outlook accounts.
You can move or copy a calendar between two Outlook accounts, but the method depends on whether you’re using desktop Outlook (Windows/Mac) or Outlook on the Web. Here are the main ways:
🔹 Method 1: Export/Import via .ICS (Desktop Outlook)
- Open Outlook (desktop app).
- Go to File → Open & Export → Import/Export.
- Choose Export to a file → Outlook Data File (.pst).
- Select the Calendar you want to export, then save the file.
- Switch to the other Outlook account (add it to the same Outlook profile if needed).
- Go back to File → Open & Export → Import/Export → Import from another program or file → Outlook Data File (.pst).
- Select the .pst you just created and import the calendar into the second account.
✅ This keeps all your events, including recurring meetings.
🔹 Method 2: Save as .ICS (Single Calendar Export)
- Open the Calendar in Outlook.
- Right-click → Save Calendar.
- Save it as an .ics file.
- Log in to the other Outlook account → Calendar → Add Calendar → From file.
- Upload the .ics file.
✅ Works in both web and desktop versions, but may lose some advanced formatting/attachments.
🔹 Method 3: Share & Accept (Ongoing Sync-Like)
If you want both accounts to stay in sync:
- In the source account, go to Calendar → Share Calendar.
- Enter the email of your other Outlook account and give Can edit permission.
- Open the invite in the second account and accept.
✅ Now both accounts can see/edit the same calendar.
⚠️ This doesn’t move it, but gives you full access across accounts.
🔹 Method 4: Drag & Drop (Desktop Outlook only)
If both accounts are added in the same Outlook desktop profile:
- Go to Calendar view.
- Select the source calendar.
- Drag events from one calendar and drop them onto the other.
- Repeat or select multiple items with Ctrl+A.
✅ Quick for selective copying, not entire calendars at once.
👉 Andrew, do you want to completely move the calendar (so it only exists in the second account), or do you just want the second account to see/use it as well?
Got it 👍 — you want to completely move your Outlook calendar from your NHS account (andrewthornett@nhs.net
) to your personal domain account (andrew@thornett.net
).
Here’s the cleanest way to do it:
✅ Step 1: Export your NHS calendar
On the Outlook desktop app (best for full export, web won’t export recurring events properly):
- Open Outlook (with your NHS account signed in).
- Go to File → Open & Export → Import/Export.
- Select Export to a file → Outlook Data File (.pst) → Next.
- Select your Calendar folder under your NHS account.
- Tick Include subfolders if available.
- Choose a location and name (e.g.
NHS-Calendar.pst
). - Finish and (if prompted) set a password (you can leave it blank).
✅ Step 2: Import into your personal Outlook
- Add your
andrew@thornett.net
account to Outlook if it’s not already there. - Go to File → Open & Export → Import/Export.
- Select Import from another program or file → Outlook Data File (.pst).
- Browse to the file you just exported.
- Choose Do not import duplicates (unless you want them).
- Select your personal account’s Calendar as the destination.
- Complete the import.
Now all events (including recurring, invites, attachments) are in your personal calendar.
✅ Step 3 (Optional): Clean up NHS account
Once you’ve confirmed everything came across properly:
- Delete the old NHS calendar items if you no longer want them there, or
- Simply remove the NHS account from Outlook.
⚠️ Important Notes:
- If you had meeting invites in the NHS account, the “organiser” will still show as your NHS address. People won’t see them as coming from your new address unless you re-send them.
- If your NHS IT restricts PST export, you may need to use the Save Calendar → .ICS method instead (less complete but still workable).
Do you want me to give you the .ICS method for Outlook Web as a backup, in case NHS IT blocks PST export on your work machine?
Perfect — here’s the .ICS method that works even if you only have Outlook on the Web for your NHS account and can’t use .pst
export.
🔹 Step 1: Export NHS calendar to .ICS
- Log into Outlook Web with your NHS account (
andrewthornett@nhs.net
). - Go to Calendar.
- In the left panel, right-click your calendar → Publish calendar (sometimes “Share & export”).
- Choose:
- Can view all details (to keep full event info).
- Format: ICS.
- Copy the ICS link that appears.
- Some NHS setups don’t allow publishing — if you don’t see this option, you’ll need to Save calendar instead:
- Go to File → Save Calendar (desktop) OR … menu → Print → Save as PDF/ICS (web).
- Some NHS setups don’t allow publishing — if you don’t see this option, you’ll need to Save calendar instead:
🔹 Step 2: Import into your personal Outlook (andrew@thornett.net
)
- Log into your personal Outlook account.
- Go to Calendar → Add calendar → Subscribe from web / From file.
- If you have the ICS link, paste it into “Subscribe from web”.
- This will keep it synced (read-only).
- If you downloaded a .ics file, choose Add calendar → From file → Upload.
- If you have the ICS link, paste it into “Subscribe from web”.
🔹 Step 3: Convert to a normal calendar
- If you used the link, the calendar is only subscribed. To make it a true calendar you own:
- Import the
.ics
file instead of subscribing. - All events will be copied into your personal account’s calendar.
- Import the
⚠️ Limitations of the .ICS method:
- Recurring meetings may not import perfectly (sometimes split into individual entries).
- Attachments won’t transfer.
- Meeting organiser stays as your NHS address.
👉 Andrew, would you like me to write you a step-by-step guide specifically for NHSmail Outlook Web (since NHS sometimes hides the “publish calendar” option), so you’ve got both a “safe” method and a “backup hack”?
Alright Andrew — here’s a step-by-step, NHSmail-specific guide for moving your calendar when NHS IT locks things down. NHSmail Outlook Web sometimes hides the “publish calendar” option, so I’ll give you the two routes: the official way (if available) and a workaround if it’s disabled.
📅 Moving Calendar from NHSmail to Personal Outlook
✅ Method 1: Export via ICS (if publishing is enabled)
- Sign in at https://outlook.office365.com with your
andrewthornett@nhs.net
account. - Go to Calendar.
- In the left panel, hover over your calendar → … (More) → Sharing and permissions.
- If your tenant allows it, you’ll see Publish calendar.
- Choose Can view all details.
- Select format ICS.
- Copy the ICS link.
Import into personal Outlook:
- Sign into your
andrew@thornett.net
Outlook. - Go to Calendar → Add calendar → Subscribe from web.
- Paste the ICS link → Name it → Save.
🔹 This gives you a read-only live feed from NHS to personal account.
✅ Method 2: Manual Export (if Publish is blocked)
If “Publish calendar” is missing (common in NHS settings), you need to download an ICS file:
- Still in NHS Outlook Web → go to Calendar.
- Top right → ⚙️ Settings → View all Outlook settings.
- Go to Calendar → Shared calendars.
- Under Publish a calendar, select your calendar.
- If your admin blocks this, the option may be greyed out.
- If available, choose Can view all details → Download
.ics
.
If you can’t see either option, you’ll need to do this with desktop Outlook installed on an NHS-connected machine, then File → Save Calendar → .ics.
Import into personal Outlook:
- Sign in to
andrew@thornett.net
. - Go to Calendar → Add calendar → From file.
- Browse to your
.ics
file → Import into your personal calendar.
🔹 This creates a permanent copy inside your personal account (not just a subscription).
⚠️ Important caveats
- Recurring meetings may expand into individual entries.
- Attachments and meeting links (Teams/Zoom) usually don’t transfer.
- Events will still show your NHS address as organiser — you’ll need to re-invite people if you want them managed from
andrew@thornett.net
.
👉 Do you want me to also give you a PowerShell export method (using NHSmail’s Office 365 backend), in case both “Publish” and “Save calendar” are blocked by policy? That’s more technical, but it guarantees a full export.
Great — here’s a PowerShell-only route that pulls your NHS calendar straight from Microsoft Graph and writes a clean .ics file you can import into andrew@thornett.net
.
PowerShell export (Graph) → .ICS
What this does
- Authenticates as you to your NHS mailbox
- Reads every event (optionally within a date range)
- Writes a standards-compliant iCalendar (.ics) file, including:
- Start/end times (UTC)
- Subject, body (stripped to text), location
- Attendees & organiser
- Recurrence rule where present (RRULE)
Works without desktop Outlook or PST. You just need PowerShell 7+ (recommended) and permission to consent to the Graph scopes below.
1) One-time setup
Open an elevated PowerShell and run:
# Install the Microsoft Graph modules (first time only)
Install-Module Microsoft.Graph -Scope CurrentUser
# (Optional) Update if you already had them
Update-Module Microsoft.Graph
2) Connect to Graph as your NHS account
# Sign in as andrewthornett@nhs.net and grant calendar read access
Connect-MgGraph -Scopes "Calendars.Read","User.Read"
Select-MgProfile -Name beta # beta helps with some recurrence fields; remove if blocked
If your NHS tenant blocks user consent, ask IT to grant these delegated scopes to users or to run this for you.
3) Run the export script
Paste all of this into PowerShell. It will create NHS-Calendar-export.ics
in your Documents folder.
You can also set a date window so you don’t export decades of data.
# ===== Config =====
$UserId = "andrewthornett@nhs.net" # NHS mailbox
$OutFile = Join-Path $HOME "Documents\NHS-Calendar-export.ics"
$StartDate = (Get-Date "2000-01-01T00:00:00Z") # adjust or leave wide
$EndDate = (Get-Date).AddYears(5) # adjust as needed
$PageSize = 100
# ===== Helpers =====
function Escape-IcsText {
param([string]$Text)
$t = ($Text -replace "`r`n", "\n" -replace "`r", "\n" -replace "`n", "\n")
$t = $t -replace "\\", "\\\\" -replace ";","\;" -replace ",","\,"
return $t
}
function To-IcsDateTime {
param([datetime]$dt)
# Always write UTC Zulu timestamps
$utc = $dt.ToUniversalTime()
return $utc.ToString("yyyyMMdd'T'HHmmss'Z'")
}
function Build-RRule {
param($Recurrence)
if (-not $Recurrence) { return $null }
$p = $Recurrence.pattern
$r = $Recurrence.range
# FREQ
$freqMap = @{
"daily"="DAILY"; "weekly"="WEEKLY"; "absoluteMonthly"="MONTHLY"; "relativeMonthly"="MONTHLY";
"absoluteYearly"="YEARLY"; "relativeYearly"="YEARLY"
}
$freq = $freqMap[$p.type]
if (-not $freq) { return $null }
$parts = @("FREQ=$freq")
if ($p.interval) { $parts += "INTERVAL=$($p.interval)" }
if ($p.type -eq "weekly" -and $p.daysOfWeek) {
$dow = ($p.daysOfWeek | ForEach-Object {
switch ($_){ "monday"{"MO"} "tuesday"{"TU"} "wednesday"{"WE"} "thursday"{"TH"} "friday"{"FR"} "saturday"{"SA"} "sunday"{"SU"} default {""} }
}) -join ","
if ($dow) { $parts += "BYDAY=$dow" }
}
if ($p.type -like "relative*" -and $p.@odata.type -or $p.firstDayOfWeek) {
# Graph exposes relative positions in patternIndex (first, second, third, fourth, last)
if ($p.index -and $p.daysOfWeek) {
$idxMap = @{ "first"="1"; "second"="2"; "third"="3"; "fourth"="4"; "last"="-1" }
$idx = $idxMap[$p.index]
$dow = ($p.daysOfWeek | ForEach-Object {
switch ($_){ "monday"{"MO"} "tuesday"{"TU"} "wednesday"{"WE"} "thursday"{"TH"} "friday"{"FR"} "saturday"{"SA"} "sunday"{"SU"} default {""} }
}) -join ","
if ($idx -and $dow) { $parts += "BYDAY=$idx$dow" }
}
}
# Range: either COUNT or UNTIL
if ($r.numberOfOccurrences) {
$parts += "COUNT=$($r.numberOfOccurrences)"
} elseif ($r.endDate) {
# endDate is local-date; treat as end of day in UTC
$until = (Get-Date $r.endDate).Date.AddDays(1).AddSeconds(-1)
$parts += "UNTIL=$(To-IcsDateTime $until)"
}
return "RRULE=" + ($parts -join ";")
}
# ===== Start writing file =====
"BEGIN:VCALENDAR" | Out-File -FilePath $OutFile -Encoding UTF8
"VERSION:2.0" | Out-File -FilePath $OutFile -Append
"PRODID:-//NHS Export Script//EN" | Out-File -FilePath $OutFile -Append
"CALSCALE:GREGORIAN" | Out-File -FilePath $OutFile -Append
"METHOD:PUBLISH" | Out-File -FilePath $OutFile -Append
# Graph returns events via the calendarView endpoint with a time window
$startIso = $StartDate.ToUniversalTime().ToString("o")
$endIso = $EndDate.ToUniversalTime().ToString("o")
$nextLink = "https://graph.microsoft.com/v1.0/users/$UserId/calendarView?startDateTime=$startIso&endDateTime=$endIso&`$top=$PageSize"
while ($nextLink) {
$page = Invoke-MgGraphRequest -Method GET -Uri $nextLink
foreach ($e in $page.value) {
$uid = if ($e.iCalUId) { $e.iCalUId } else { [guid]::NewGuid().ToString() }
$dtStart = To-IcsDateTime([datetime]$e.start.dateTime)
$dtEnd = To-IcsDateTime([datetime]$e.end.dateTime)
"BEGIN:VEVENT" | Out-File $OutFile -Append
"UID:$uid" | Out-File $OutFile -Append
"DTSTAMP:$(To-IcsDateTime (Get-Date))" | Out-File $OutFile -Append
"DTSTART:$dtStart" | Out-File $OutFile -Append
"DTEND:$dtEnd" | Out-File $OutFile -Append
if ($e.subject) { "SUMMARY:$(Escape-IcsText $e.subject)" | Out-File $OutFile -Append }
if ($e.location.displayName) { "LOCATION:$(Escape-IcsText $e.location.displayName)" | Out-File $OutFile -Append }
# Organiser
if ($e.organizer.emailAddress.address) {
"ORGANIZER:mailto:$($e.organizer.emailAddress.address)" | Out-File $OutFile -Append
}
# Attendees
if ($e.attendees) {
foreach ($a in $e.attendees) {
$role = if ($a.type) { $a.type.ToUpper() } else { "REQ-PARTICIPANT" }
"ATTENDEE;CN=$(Escape-IcsText $a.emailAddress.name);ROLE=$role:mailto:$($a.emailAddress.address)" | Out-File $OutFile -Append
}
}
# Recurrence (basic RRULE)
$rr = Build-RRule $e.recurrence
if ($rr) { $rr | Out-File $OutFile -Append }
# Body (plain text)
$bodyText = if ($e.bodyPreview) { $e.bodyPreview } elseif ($e.body.content) { $e.body.content } else { "" }
if ($bodyText) { "DESCRIPTION:$(Escape-IcsText $bodyText)" | Out-File $OutFile -Append }
# Sensitivity/Busy status
if ($e.sensitivity) { "CLASS:$($e.sensitivity.ToUpper())" | Out-File $OutFile -Append }
if ($e.showAs) { "X-MICROSOFT-SHOWAS:$($e.showAs.ToUpper())" | Out-File $OutFile -Append }
"END:VEVENT" | Out-File $OutFile -Append
}
$nextLink = $page.'@odata.nextLink'
}
"END:VCALENDAR" | Out-File -FilePath $OutFile -Append
Write-Host "`nExport complete:`n$OutFile"
Result: NHS-Calendar-export.ics
containing your events (with recurrence where available).
4) Import into your personal Outlook
In andrew@thornett.net
(Outlook on the Web):
- Calendar → Add calendar → From file → Upload your
NHS-Calendar-export.ics
→ choose your main calendar → Import.
Or in desktop Outlook:
- File → Open & Export → Import/Export → Import an iCalendar (.ics).
Notes & gotchas
- Recurring meetings: The script maps Graph recurrence to a standard RRULE for most patterns (daily/weekly/monthly/yearly, intervals, BYDAY, COUNT/UNTIL). Exotic patterns may flatten to series instances depending on Graph data.
- Attachments/Teams links: ICS doesn’t embed files. Meeting links and dial-ins usually survive in the DESCRIPTION field, but file attachments won’t.
- Organizer: Events you organised will still list your NHS address as organiser. If you need to manage those from your personal account, re-create or forward them from
andrew@thornett.net
. - Consent policies: If your tenant blocks consenting to Graph scopes, an admin must grant Calendars.Read for users or run the export for you.
Optional: Date-range exports
If you only want, say, 2018–present, just change:
$StartDate = Get-Date "2018-01-01T00:00:00Z"
$EndDate = Get-Date "2030-01-01T00:00:00Z"
Alternative (admin/eDiscovery PST → then import)
If you have Purview eDiscovery rights, exporting a PST of just the Calendar via Content Search / eDiscovery (Standard) and then importing into your personal account gives the most fidelity (incl. attachments). It’s web-UI driven rather than PowerShell, but shout if you want those exact clicks.