The option "If the task fails, restart" is misleading, a failed task is when Task Scheduler is not able to run one of the action correctly, not when the script itself runs and return an error code.
A very clever workaround suggested here can be used instead of additional task querying for events:
The issue is the actions are only considered to fail if they cannot be started. This is pretty dumb, but the scheduler doesn't care about the results of the actions.
One workaround is to add an action at the end to run something like "ok.exe" and then have your other actions either create "ok.exe" (good result) or delete it. (bad result)
This way when the Task Scheduler goes to run the last action it will fail to start it (if you had removed it, because your previous action failed). This will cause the Task Scheduler to go ahead and Queue up your Task for a restart based on the restart settings on the Scheduled Task.
PS: To create a dummy ok.exe, I usually just copy c:\windows\system32\clip.exe c:\mytask\ok.exe
-- Tolga
So what is suggested is to create a final action for the task that will call a dummy .exe file. If the .exe file is not found, this will correctly cause the failure for the task and trigger the restart option. As .exe file he uses clip.exe from Windows system folder, this is nice I think because is very small and won't do any action if called on it's own.
Caution
I've tried with empty .cmd and .bat files but this will not trigger correctly the fail trigger. It must be a .exe file apparently.

Of course a mechanism to rename/move the ok.exe file in case your target script/job fails is needed.
I've pointed the Task Scheduler to use the wrapper script below with success. Edit the path to ok.exe as needed, I've copied it in the same directory as this wrapper script:
@echo off
:: This will reset the .exe name to make sure the .exe is available if error is
:: not triggered. See `:trigger_error`.
if exist ok.exe.nope (
rename ok.exe.nope ok.exe
)
:: This script is used as batch runner by Task Scheduler.
:: MAKE SURE THE SCRIPT WILL RETURN AN ERROR CODE !=0
echo Here is my script!
:: If script above exited with an error, rename the `ok.exe` file. This will
:: cause a failure for Task Scheduler following action attempting to run
:: `ok.exe`, thus triggering the restart conditions.
:: See https://social.technet.microsoft.com/Forums/Lync/en-US/4545361c-cc1f-4505-a0a1-c2dcc094109a/restarting-scheduled-task-that-has-failed#e4e3ff74-2d42-4d58-a930-a7838a0762ff
:trigger_error
if %errorLevel% NEQ 0 (
rename ok.exe ok.exe.nope
)