Какие таблицы будем обрабатывать:
const tables = document.querySelectorAll('селектор таблиц');
Собираем в массив заголовки столбцов, используем элементы этого массива для задания значений атрибута. Как определять, какое именно значение брать для конкретной ячейки? - очевидно же, у них одинаковые индексы:
for (const { tHead, tBodies } of tables) {
const labels = Array.prototype.map.call(
tHead.rows[0].cells,
th => th.textContent
);
for (const { rows } of tBodies) {
for (const { cells } of rows) {
for (const [ i, label ] of labels.entries()) {
cells[i].dataset.label = label;
}
}
}
}
или
tables.forEach(table => {
table.querySelectorAll('tbody td').forEach(function(td) {
td.setAttribute('data-label', this[td.cellIndex]);
}, Array.from(table.querySelectorAll('thead th'), th => th.innerText));
});