Как насчёт того, чтобы сохранять общее количество ячеек в строках, а неиспользуемым ячейкам ставить display: none
<table border=1 id="table" style="cursor: pointer;">
<tr>
<td rowspan="3">0</td>
<td>1</td>
<td rowspan="3">2</td>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td style="display: none"></td>
<td id="td">5</td>
<td style="display: none"></td>
<td>6</td>
<td>7</td>
</tr>
<tr>
<td style="display: none"></td>
<td id="td">8</td>
<td style="display: none"></td>
<td>9</td>
<td>0</td>
</tr>
</table>
<script>
window.onload = function (e) {
var table = document.getElementById('table');
var len;
var index;
table.onclick = function(e) {
e = e || event;
var target = e.target || e.srcElement;
if (target.parentNode.tagName == 'TR') {
if (target.previousElementSibling == null) {
alert('нет предыдущей ячейки')
} else {
index = target.parentNode.rowIndex;
for (var i = index; i >= 0; i--) {
if (target.previousElementSibling.style.display != 'none') {
alert(target.previousElementSibling.innerHTML);
break;
} else {
index--;
target = table.rows[index].cells[target.cellIndex];
}
}
}
}
}
}
</script>