I decided to help you out with this. Well, I took into consideration (or assumed) that in your map there could be more than one circle of power, and also that they do not count units globally - for example, a player not being able to use two circles of power in order to convert 3 units into goblin sappers (2 stand on circle A, and the last one stands on B).
So, I used 1 unit group for storing pre-placed circles of power, and 1 player group for all players (optional). Then, in my "loop trigger", I added the player group first and nested the Circle of Power group within it, and at last, another unit group is used for detecting nearby units too.
-
Convert Units at CoP
-

Events
-


Time - Every 1.00 seconds of game time
-

Conditions
-

Actions
-


Player Group - Pick every player in SQ_AllPlayers and do (Actions)
-



Loop - Actions
-




Set tmp_player = (Picked player)
-




Set tmp_pid = (Player number of tmp_player)
-




Unit Group - Pick every unit in SQ_CoP and do (Actions)
-





Loop - Actions
-






Set SQ_QueuedCounter = 0
-






Set tmp_point[0] = (Position of (Picked unit))
-






Custom script: set bj_wantDestroyGroup = true
-






Unit Group - Pick every unit in (Units within SQ_CircleAoE of tmp_point[0]) and do (Actions)
-







Loop - Actions
-








Set tmp_unit = (Picked unit)
-








If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-









If - Conditions
-










(Unit-type of tmp_unit) Equal to SQ_ConversionUnit
-










(tmp_unit is dead) Equal to False
-










(Owner of tmp_unit) Equal to tmp_player
-









Then - Actions
-










Set SQ_QueuedCounter = (SQ_QueuedCounter + 1)
-










Set SQ_QueuedUnit[SQ_QueuedCounter] = tmp_unit
-










If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-











If - Conditions
-












SQ_QueuedCounter Equal to SQ_ConversionRequirement
-











Then - Actions
-












Set tmp_point[1] = (tmp_player start location)
-












Unit - Create SQ_SpawnNumber SQ_SpawnUnit for tmp_player at tmp_point[1] facing Default building facing degrees
-












For each (Integer SQ_Loop) from 1 to SQ_QueuedCounter, do (Actions)
-













Loop - Actions
-














Unit - Kill SQ_QueuedUnit[SQ_Loop]
-














Special Effect - Create a special effect attached to the SQ_SFX_Attachment of SQ_QueuedUnit[SQ_Loop] using SQ_SFX_Sacrifice
-














Special Effect - Destroy (Last created special effect)
-












Set SQ_QueuedCounter = 0
-












Custom script: call RemoveLocation(udg_tmp_point[1])
-











Else - Actions
-









Else - Actions
-






Custom script: call RemoveLocation(udg_tmp_point[0])
This way you just do everything at once; That means, you'll know which player and which CoP is being enumerated, and then it's possible to perform your actions on them without worrying about hashtables or simulating 2D arrays.
I believe there are some things you might want to change from my trigger. For example, dealing with players that left the game, or perhaps circles of power that may be added/killed/removed from the game.
Overall, this trigger does its job, but I, personally, don't like it for having too much nested loops. Perhaps it'd be better using a table + a unit enters rect event? Oh well...