No Good Way to Clean up Unwanted ex-Teams Channel Folders
Some years ago, I wrote about why Teams leaves the SharePoint folder intact when it deletes a channel. In a nutshell, this is to avoid data loss. The deletion of a channel can be reversed for up to 21 days afterward, and it’s important to be able to restore the complete channel including its files in the Teams channel folder during the 21-day retention period.
But then the question of what happens after the retention period arises. The channel is gone and irrecoverable, but its folder lingers on in SharePoint as a reminder of a now-gone collaborative space. The natural thing for administrators is to clean up the unwanted folder, but that’s not possible because the Delete option is missing from the folder menu. Figure 1 shows an example. There’s no Delete or Move to options in the menu for a folder connected to a Teams channel.
Figure 1: You can delete some Teams channel folders
In a Microsoft technical community discussion, some suggest using the Move to option to move the complete folder to somewhere else, like a personal OneDrive account, and delete it from there. Others put their faith in the Move-PnPFolder cmdlet, and some other innovative solutions are offered.
The point is that administrators want to remove the unwanted folders belonging to deleted channels and don’t understand why Teams makes this difficult to do.
Teams Takes Control
After playing around with several channel deletion scenarios in my tenant, it seems to me that when Teams creates a channel folder, it updates the folder properties to remove the options to delete and move the folder. This wasn’t always the case. An unpublicized change seems to have made the change sometime late in 2019. I’ve been able to delete folders belonging to old channels, even immediately after deleting the channel in Teams by following the same approach as used to delete SharePoint folders that have no relationship with Teams:
Removing all subfolders (delete or move the items).
Deleting the channel folder.
An example is in Figure 2. In this case, the deletion was of a channel created in November 2016, which is right at the start of the Teams era. The connection with SharePoint Online was looser and this is probably what allowed the deletion to happen. You can see that the menu for this folder includes both Delete and Move to options.
Figure 2: No Delete or Move to options for this Teams channel folder
As time went by, Teams became more proscriptive in how it dealt with SharePoint Online. For instance, you can’t modify the settings of the sites used for Teams shared and private channels because Teams will overwrite what you do with settings from the host team.
Prevent Accidents
But I think the reason why Teams doesn’t allow site administrators to delete these folders is to avoid the possibility of data loss both during normal operation and while a deleted channel is in a soft-deleted and restorable state. Removing the Delete option stops an accident happening that leads to data loss and removing the Move to option prevents someone moving files that might be required to restore a deleted channel.
Break the Connection with Teams
What’s missing is a step in the code Teams uses to permanently remove a deleted channel. When the 21-day retention period lapses, Teams cleans up by removing the channel from its soft-deleted cache. It would be good if it also reset the properties of the channel folder to break any connection to Teams and to allow site administrators to manage the folder as normal. In other words, restore the Delete and Move to options in the folder menu and stop telling people they must manage the folder through Teams.
I don’t mind Teams wanting to keep its channel folders under control, but there’s a time to let go, and it’s obvious that Teams hangs on too long in this instance.
Learn how to exploit the data available to Microsoft 365 tenant administrators through the Office 365 for IT Pros eBook. We love figuring out how things work.
7 Replies to “Teams and its Unwanted SharePoint Online Channel Folders”
One thing I want to control is prevent folders and files creation and sync the root of Sharepoint site when it’s a Team. Because when you sunc from Sharepoint it’s different from Teams and may be users syncs in differents ways. Additional if I creates channels I want they use this channel instead the root folder and later nobody cant find the data. Teams must be mandatory.
{"id":null,"mode":"button","open_style":"in_modal","currency_code":"EUR","currency_symbol":"\u20ac","currency_type":"decimal","blank_flag_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":100,"top_media_type":"featured_image","featured_image_url":"https:\/\/office365itpros.com\/wp-content\/uploads\/2022\/11\/cover-141x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Virtual Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"Office 365 for IT Pros","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"Office 365 for IT Pros","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for supporting the work of Office 365 for IT Pros!","payment_confirmation_title":"Office 365 for IT Pros","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
One thing I want to control is prevent folders and files creation and sync the root of Sharepoint site when it’s a Team. Because when you sunc from Sharepoint it’s different from Teams and may be users syncs in differents ways. Additional if I creates channels I want they use this channel instead the root folder and later nobody cant find the data. Teams must be mandatory.
Renaming the folder brings the delete option back. Far and away the easiest way I have found to delete lingering folders.
Renaming the folder brings the delete option back. Far and away the easiest way I have found to delete lingering folders.
=> When I rename the folder, it automatically changed back to the original name
Thanks for the breakdown, Tony.
I can neither remove, rename, or move folders from deleted channels after 21 days.
It would be greeaaat if someone can post a solution.
Did you report the problem to Microsoft support? That’s the best way to get some help. They can see what’s happening in your tenant…