Another option is to edit the stylesheet notebook itself. First we programmatically extract this (any better ways to do this would be appreciated):
notebookObjectStylesheet[nb_NotebookObject,
Optional[Automatic, Automatic]] :=
notebookObjectStylesheet[nb,
MatchQ[
CurrentValue[nb, StyleDefinitions], _String | _FrontEnd`FileName]
];
notebookObjectStylesheet[nb_NotebookObject,
savedSheet : True | False] :=
notebookObjectStylesheet[nb, savedSheet] =
With[{
sdefs =
Replace[
CurrentValue[nb, StyleDefinitions], {
s : _String | _FrontEnd`FileName :>
FrontEndExecute@
FrontEnd`FindFileOnPath[
If[! StringQ[s], ToFileName@s, s],
"StyleSheetPath"
]
}]},
SelectFirst[FrontEndExecute@FrontEnd`ObjectChildren[$FrontEnd],
If[StringQ@sdefs,
Quiet@NotebookFileName[#] === sdefs,
NotebookGet[#] === sdefs
] &
]
];
Then we can use it like so:
default = notebookObjectStylesheet[EvaluationNotebook[]]
NotebookObject[FrontEndObject[LinkObject["k98bv_shm", 3, 1]], 4]
That's the default stylesheet notebook.
Now we can write some editing helper functions:
getCellsForStyle[nb_, styleNames_] :=
Select[Cells[nb],
MatchQ[
Cell[StyleData[Sequence @@ Flatten@{styleNames}], ___]
]@*NotebookRead
];
applyCellStyleEdits[cells_] :=
With[{groups = GroupBy[cells, ParentNotebook]},
KeyValueMap[
CheckAll[
With[{nb = #, cs = #2},
FrontEndExecute@
FrontEnd`NotebookSuspendScreenUpdates[nb];
Map[
Function[
SelectionMove[#, All, Cell,
AutoScroll -> False
];
FrontEndTokenExecute[nb, "ToggleShowExpression"]~Do~2;
],
cells
];
FrontEndExecute@
FrontEnd`NotebookResumeScreenUpdates[nb]
],
FrontEndExecute@
FrontEnd`NotebookResumeScreenUpdates[nb]
] &,
groups
];
];
editCellsForStyle[nb_, styleNames_, edits_?OptionQ] :=
With[{cs = getCellsForStyle[nb, styleNames]},
SetOptions[#, edits] & /@ cs;
applyCellStyleEdits[cs]
]
And use it like so:
editCellsForStyle[default, "Input",
FontColor -> Purple
]

And we reset it like so:
editCellsForStyle[default, "Input",
FontColor -> Inherited
]
One nice thing about this, though, is the changes are temporary. We'd have to call NotebookSave
on the edited style sheet to get them to be saved permanently.
For instance, I can do something ridiculous like this:
editCellsForStyle[default, "Input",
FontSize -> 5
]

But when I quit the front end and restart:
FrontEndTokenExecute@"FrontEndQuitNonInteractive"
Everything is back to normal:

Moreover, if we want to then delete some collection of styles, it's as simple as this:
deleteCellsForStyle[nb_, styleNames_, edits_?OptionQ] :=
NotebookDelete@getCellsForStyle[nb, styleNames]