I looked into scripting since I'll need to use it for other tasks anyway and this is the solution I was able to throw together, using layer bounds just as you recommended. It's not perfect but works well for me and can hopefully be utilized by others. 🙂
// Check if a layer is in the left half of the canvas
function isLayerInLeftHalf(layer) {
var bounds = layer.bounds;
var centerX = bounds[0] + (bounds[2] - bounds[0]) / 2;
// alert(layer.toString().concat(", ",centerX));
var canvasWidth = activeDoc.width;
return centerX < canvasWidth / 2;
}
// Add layer to appropriate LayersList
function makeLayersLists(layers, leftLayersList, rightLayersList){
for (var i = 0; i < layers.length; i++) {
// If layer is a group, search recursively
if(layers[i].typename == 'LayerSet'){
makeLayersLists(layers[i].layers,leftLayersList,rightLayersList);
}
else if (layers[i].name != 'Background') {
if (isLayerInLeftHalf(layers[i])) {
leftLayersList.push(layers[i]);
}
else{
rightLayersList.push(layers[i]);
}
}
}
}
function groupLayers(){
var layers = activeDoc.layers;
const leftLayersList = [];
const rightLayersList = [];
makeLayersLists(layers,leftLayersList,rightLayersList);
// Create groups
var leftLayerGroup = activeDoc.layerSets.add();
leftLayerGroup.name = "left";
var rightLayerGroup = activeDoc.layerSets.add();
rightLayerGroup.name = "right";
// Create dummy layers in groups to help ensure layer order stays same after move
var tempLayerLeft = leftLayerGroup.artLayers.add();
var tempLayerRight = rightLayerGroup.artLayers.add();
// Move each layer from the lists into the appropriate group (before tempLayer)
for (var i=0; i<leftLayersList.length; i++){
leftLayersList[i].move(tempLayerLeft, ElementPlacement.PLACEBEFORE);
}
for (var i=0; i<rightLayersList.length; i++){
rightLayersList[i].move(tempLayerRight, ElementPlacement.PLACEBEFORE);
}
// Remove dummy layers
tempLayerLeft.remove();
tempLayerRight.remove();
}
var activeDoc = app.activeDocument;
groupLayers();