Here is a working solution for dynamically merging consecutive row cells in every column.
The solution also works for toggling the shade and will only toggle the shade when a 'full' row starts, which is, when there is no merging between consecutive rows.
Also, you have to wrap the tr in the table header in a thead as that can cause problems with document.querySelectorAll('tbody tr') event tbody is specified in the query.
I slightly modified the table to show the shading and merging:

function myFunction() {
const previousRow = {};
const colsChanged = {};
let dark = false;
Array.from(document.querySelectorAll('tbody tr')).forEach((tr, rowIdx) => {
Array.from(tr.children).forEach((td, colIdx) => {
if (rowIdx > 0 && previousRow[colIdx].text === td.innerText) {
previousRow[colIdx].elem.setAttribute('rowspan', ++previousRow[colIdx].span);
colsChanged[colIdx] = false;
td.remove();
} else {
previousRow[colIdx] = { span: 1, text: td.innerText, elem: td, dark };
colsChanged[colIdx] = true;
}
});
const rowChanged = Object.values(colsChanged).every(Boolean);
dark = rowChanged && rowIdx > 0 ? !dark : dark;
if (dark) {
tr.classList.add('dark');
}
});
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
th {
background: #a9a9a9;
}
td,
th {
border: 1px solid black;
text-align: center;
padding: 8px;
font-family: monospace;
font-size: 17px;
}
.dark {
background-color: #dddddd;
}
<body onload="myFunction()">
<table>
<thead>
<tr>
<th>Company</th>
<th>Contact</th>
<th>Country</th>
</tr>
</thead>
<tbody>
<tr>
<td>Alfreds Futterkiste</td>
<td>Maria Anders</td>
<td>Germanyindgo</td>
</tr>
<tr>
<td>Alfreds Futterkiste</td>
<td>Maria Anders</td>
<td>Germany</td>
</tr>
<tr>
<td>Centro comercial Moctezuma</td>
<td>Francisco Chang</td>
<td>Mexico</td>
</tr>
<tr>
<td>Ernst Handel</td>
<td>Francisco Chang</td>
<td>Austria</td>
</tr>
<tr>
<td>Ernst Handel</td>
<td>Helen Bennett</td>
<td>UK</td>
</tr>
<tr>
<td>Laughing Bacchus Winecellars</td>
<td>Yoshi Tannamuri</td>
<td>Canada</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti 1</td>
<td>Giovanni Rovelli 1</td>
<td>Italy</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti 2</td>
<td>Giovanni Rovelli 2</td>
<td>Italy</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti 3</td>
<td>Giovanni Rovelli 3</td>
<td>Italy</td>
</tr>
</tbody>
</table>
</body>
According to the comments below, if you want to merge cells to the right only if the corresponding cells were merged in the first column, here is a modification to do it.
a leftMerged variable is used to keep track of whether the first cell on the current line was merged to the previous one, and if so, this enables us to merge the following cells to the right if necessary. The variable is reset to false at the beginning of each line.

function myFunction() {
const previousRow = {};
const colsChanged = {};
let leftMerged = false;
let dark = false;
Array.from(document.querySelectorAll('tbody tr')).forEach((tr, rowIdx) => {
Array.from(tr.children).forEach((td, colIdx) => {
if (rowIdx > 0 && (colIdx === 0 || leftMerged) && previousRow[colIdx].text === td.innerText) {
previousRow[colIdx].elem.setAttribute('rowspan', ++previousRow[colIdx].span);
colsChanged[colIdx] = false;
td.remove();
if (colIdx === 0) {
leftMerged = true;
}
} else {
previousRow[colIdx] = { span: 1, text: td.innerText, elem: td, dark };
colsChanged[colIdx] = true;
}
});
const rowChanged = Object.values(colsChanged).every(Boolean);
dark = rowChanged && rowIdx > 0 ? !dark : dark;
if (dark) {
tr.classList.add('dark');
}
leftMerged = false;
});
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
th {
background: #a9a9a9;
}
td,
th {
border: 1px solid black;
text-align: center;
padding: 8px;
font-family: monospace;
font-size: 17px;
}
.dark {
background-color: #dddddd;
}
<body onload="myFunction()">
<table>
<thead>
<tr>
<th>Company</th>
<th>Contact</th>
<th>Country</th>
<th>Col4</th>
<th>Col5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Alfreds Futterkiste</td>
<td>Maria Anders</td>
<td>Germanyindgo</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Alfreds Futterkiste</td>
<td>Maria Anders</td>
<td>Germany</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Centro comercial Moctezuma</td>
<td>Francisco Chang</td>
<td>Mexico</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Ernst Handel</td>
<td>Francisco Chang</td>
<td>Austria</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Ernst Handel</td>
<td>Helen Bennett</td>
<td>UK</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Laughing Bacchus Winecellars</td>
<td>Yoshi Tannamuri</td>
<td>Canada</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti 1</td>
<td>Giovanni Rovelli 1</td>
<td>Italy</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti 1</td>
<td>Giovanni Rovelli 2</td>
<td>Italy</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti 3</td>
<td>Giovanni Rovelli 3</td>
<td>Italy</td>
<td>1</td>
<td>2</td>
</tr>
</tbody>
</table>
</body>
Alfredsis already removed?