Potrebbe essere ottimizzato.
1) Questo selettore trova tutte le righe dell'intera pagina, indistintamente per le varie tabelle presenti:
codice:
var rows = document.getElementsByTagName('tr');
Nella pagina vedo infatti che ci sono varie tabelle: una per l'intestazione, una per le opzioni del form di inserimento nuovo inventario, altre nascoste, e poi quella interessata per la quale dovrebbe agire lo script. Quest'ultima inoltre ha delle tabelle annidate, per cui ogni riga di fatto è una tabella e ogni tabella ha chiaramente delle altre righe.
Quel selettore quindi restituisce una collezione di svariati <tr> che sono poi esaminati nel ciclo; ma la maggior parte di questi elementi non c'è motivo di esaminarli, anzi potrebbero generare dei falsi positivi (come penso sia accaduto inizialmente per la tua terza condizione).
Sarebbe meglio "aggiustare" il selettore per ottenere una collezione più pertinente di elementi.

Originariamente inviata da
Annuitcoeptis
P.S. Ho provato a sostituire il
TagName:
codice:
var rows = document.getElementsByTagName('tr.nopaddingleft');
Se questo funzionasse, potrebbe già andare meglio, ma il problema qui è il metodo usato; infatti getElementsByTagName() accetta solo il nome del tag e nient'altro, non puoi quindi passare una query in quel modo. Tuttalpiù sarebbe meglio usare querySelectorAll().
Giusto un consiglio: quando usi un particolare metodo, più che tirare a caso sperando funzioni, sarebbe bene consultare sempre la relativa documentazione, almeno fino a quando non acquisisci una certa dimestichezza che ti permette di usarlo con cognizione di causa.
In questo caso può quindi essere meglio usare querySelectorAll() passando magari una query per selezionare in modo più specifico solo gli elementi interessati.
Non so se "tr.nopaddingleft" possa andare bene, puoi dirmelo tu. Personalmente farei qualche log per capire se è adatto per i vari casi da considerare.
2) Evitare codice ridondante (parte 1).
Perché inserire 3 volte uno stesso identico ciclo?
Non sarebbe più sensato inserire le 3 condizioni tutte in uno stesso ciclo in modo che questo sia eseguito una sola volta?
codice:
for (let i = 0; i < rows.length; i++){
const rowContent = rows[i].textContent || rows[i].innerText;
// Qui le condizioni
// ...
}
3) Evitare codice ridondante (parte 2).
Ancora, per ciascuna delle tre diverse condizioni, quando verificate, viene eseguita una stessa identica azione.
In questo caso le tre condizioni possono essere accorpate in un unico "if" usando l'operatore || (OR).
Avrai quindi uno schema del genere:
codice:
if (
(condizione_1) ||
(condizione_2) ||
(condizione_3)
){
// Azioni
}
Le diverse condizioni saranno lette una di seguito all'altra. Se una di queste è verificata, nell'ordine di lettura, allora sarà eseguita l'azione.
In questo modo eviti di riscrivere la stessa azione più volte e rendi il codice più facile da gestire/modificare.
4) Vedo che recuperi il contenuto testuale di ciascuna riga attraverso la proprietà textContent e, come ripiego, con innerText.
codice:
var rowContent = rows[i].textContent || rows[i].innerText;
Ci sono motivi specifici perché stai usando una impostazione del genere?
Personalmente, in questo caso, userei solo innerText dal momento che questo restituisce solo il testo visibile e "leggibile dall'uomo", a differenza di textContent che restituisce anche il testo in elementi nascosti e in elementi non propriamente testuali (script, style).
In conclusione:
non fornisco una soluzione pronta (ad ogni modo hai già risolto da te) ma, se è tuo interesse, puoi seguire quanto indicato per cercare di ottimizzare lo script.
Buon proseguimento