Had the same problem and this is the script I came up with (tested, and works just as you would expect):
DECLARE @Target_Filegroup sysname = N'XXX';
-----------------------------------------------------------------------------------------
;WITH [IX] AS(
SELECT
[Schema] = SCHEMA_NAME(so.[schema_id]) COLLATE DATABASE_DEFAULT,
[Object_Name] = so.[name] COLLATE DATABASE_DEFAULT,
[Object_Type] = so.[type],
[Is_Published] = so.[is_published],
[Is_Schema_Published] = so.[is_schema_published],
[IX_Name] = ix.[name] COLLATE DATABASE_DEFAULT,
[IX_Type] = ix.[type],
[IX_Type_Desc] = ix.[type_desc] COLLATE DATABASE_DEFAULT,
[Is_PK] = ix.[is_primary_key],
[Is_Unique] = ix.[is_unique],
[IX_Data_Space] = ds.[name] COLLATE DATABASE_DEFAULT,
[Is_UC] = ix.[is_unique_constraint],
[FF] = ix.[fill_factor],
[Is_Padded] = ix.[is_padded],
[Is_Disabled] = ix.[is_disabled],
[Is_Hypothetical] = ix.[is_hypothetical],
[Allow_Row_Locks] = ix.[allow_row_locks],
[Allow_Page_Locks] = ix.[allow_page_locks],
[Has_Filter] = ix.[has_filter],
[Filter] = ix.[filter_definition] COLLATE DATABASE_DEFAULT,
--[auto_created] = ix.[auto_created],
--[optimize_seq_key] = ix.[optimize_for_sequential_key],
[Indexed_Columns] = STUFF(( SELECT [text()] = CONCAT(', ', QUOTENAME(COL_NAME(ic.[object_id],ic.[column_id])))
FROM sys.index_columns ic
WHERE ic.[object_id] = so.[object_id]
AND ic.[index_id] = ix.[index_id]
AND ic.[is_included_column] = 0
ORDER BY ic.[key_ordinal]
FOR XML PATH('')
), 1, 2, '') COLLATE DATABASE_DEFAULT,
[Indexed_Columns_Order] = STUFF(( SELECT [text()] = CONCAT(', ', QUOTENAME(COL_NAME(ic.[object_id],ic.[column_id])), CASE [is_descending_key] WHEN 1 THEN ' DESC' ELSE ' ASC' END)
FROM sys.index_columns ic
WHERE ic.[object_id] = so.[object_id]
AND ic.[index_id] = ix.[index_id]
AND ic.[is_included_column] = 0
ORDER BY ic.[key_ordinal]
FOR XML PATH('')
), 1, 2, '') COLLATE DATABASE_DEFAULT,
[Included_Columns] = STUFF(( SELECT [text()] = CONCAT(', ', QUOTENAME(COL_NAME(ic.[object_id],ic.[column_id])))
FROM sys.index_columns ic
WHERE ic.[object_id] = so.[object_id]
AND ic.[index_id] = ix.[index_id]
AND ic.[is_included_column] = 1
ORDER BY ic.[key_ordinal]
FOR XML PATH('')
), 1, 2, '') COLLATE DATABASE_DEFAULT
FROM sys.objects so
LEFT JOIN sys.indexes ix ON so.[object_id] = ix.[object_id]
LEFT JOIN sys.data_spaces ds ON ix.[data_space_id] = ds.[data_space_id]
WHERE so.[type] IN ('U', 'V')
AND so.[is_ms_shipped] = 0
AND ix.[type] IS NOT NULL --| so we get heaps, and indexed views
)
SELECT
[Schema], [Object_Name], [Object_Type],
--[Is_Published], [Is_Schema_Published],
[IX_Name],
[IX_Data_Space],
[IX_Move_SQL] = CASE WHEN [IX_Data_Space] <> @Target_Filegroup AND [IX_Type] IN (1,2) THEN CONCAT(
'CREATE ', CASE [Is_Unique] WHEN 1 THEN 'UNIQUE ' END, [IX_Type_Desc], ' INDEX ', QUOTENAME([IX_Name]),
' ON ', QUOTENAME([Schema]), '.', QUOTENAME([Object_Name]), ' (', [Indexed_Columns_Order], ')',
CASE WHEN [Included_Columns] IS NOT NULL THEN CONCAT(' INCLUDE (', [Included_Columns], ')') END,
CASE WHEN [Has_Filter] = 1 THEN CONCAT(' WHERE ', [Filter]) END,
' WITH (PAD_INDEX=', CASE [Is_Padded] WHEN 1 THEN 'ON' ELSE 'OFF' END,
', FILLFACTOR=', CASE WHEN [FF] = 0 THEN '100' ELSE CAST([FF] as varchar(3)) COLLATE DATABASE_DEFAULT END,
', ALLOW_ROW_LOCKS=', CASE [Allow_Row_Locks] WHEN 1 THEN 'ON' ELSE 'OFF' END,
', ALLOW_PAGE_LOCKS=', CASE [Allow_Page_Locks] WHEN 1 THEN 'ON' ELSE 'OFF' END,
', DROP_EXISTING=ON ',')',
' ON ', QUOTENAME(@Target_Filegroup), ';')
END COLLATE DATABASE_DEFAULT
FROM [IX]
ORDER BY [Object_Type] ASC, [Schema] ASC , [Object_Name] ASC;