Just a tip, codes have priorities. Start with the low number and work your way up. For example, if you have a misfire then you possibly have a rich condition because of un-burned fuel which may be setting the O2 code. The ECM cannot compensate for the un-burned fuel so it throws an O2 code. Or maybe it is lean because injector is not firing, is plugged or restricted and it throws an O2 code. So the fault might be an injector problem and the symptom is a misfire with an O2 code. Replace the O2 sensors but you aren't fixing the fault so you still get an O2 code.
It could potentially be worse, valve trouble, cam lobe worn, broken rings, cracked piston, coolant in cylinder, etc... Those will often have other symptoms like milky oil, excessive blow-by and oil consumption, popping through intake or exhaust. Could even be a cracked spark plug or defective plug. It happens. New doesn't always mean good. What does the #4 plug look like? Black and/or wet is rich, white is lean, medium brown is ideal. What do the other plugs look like? Inspect the porcelain closely. Very easy to crack a plug during install. Is there a line that won't wipe away in the porcelain, or an edge you can catch with fingernail?
Did you try rotating the coils to see if fault follows the coil?
Compression good? No sensor or coil will fix low compression.
The O2 sensor are really just sending info to ECM to do the fine tuning. They can't compensate for big variations. The ECM has inputs and outputs. The outputs are just that, turn on a solenoid (injector for example), switch, relay, etc,... but the ecm, depending on vintage, generally has no way of knowing if the solenoid, switch, or relay actually performed it's job so it has downstream sensors that may be throwing codes due to what is occurring upstream. The codes will appear in order of priority on your scan tool. Go from A to Z and don't skip over anything in the middle. Do it any other way and you may be wasting time and money.
Secondary firing voltage? That's in a different lesson.