Non ho ben capito esattamente il funzionamento del tasto download, intanto immagino che la funzione StingToArray() sia creata da te, e potresti risparmiare risorse utilizzando la funzione degli string facendo data.split( "-" ); il trattino puo essere sostituito da stringa o espressione regolare e restituisce una array di string come immagino tu abbia bisogno.
poi nella prima riga del secondo for puoi sostituire il document.getElementById() con semplicemente table che e' la variabile che hai gia iniziallizato per risparmiare tempo, e come ulteriore suggerimento , potresti portare tutto tutto fuori dei cicli for dal momento che in questa funzione table non viene mai usata, e avresti la lista di righe inizializzata una volta per tutte.
poi ho visto che element2 non e' stato dichiarato esplicitamente e viene immediatamente usato e dai valori che hai usato per settarlo immagino che si tratti di un di un elemento input in modo che possa essere editabile quando si clicca sul pulsante modifica. anzi continuando a leggere si vede proprio dal richiamo della variabile che element2 e' proprio un input.
Pero' da qui mi sorge un dubbio sul fatto che ogni campo di input riceve un id settato attraverso array[j] e quindi piu' cello avranno stesso id in caso di omonimia per cognome o per nome, e tantissimi id identici per sesso e anche qualcuna per data di nascita. dal momento che id e' essattamente identico a value potresti eliminare l'asegnazione del'attributo id e nella funzione onclick richiamare direttamente this.value;
venendo nella parte cruciale non ho ben capito cosa intendi per ritornare il valore nella pagina HTML che chiamo la js, ogni modifica che js modifica un elemento dell'html questo e modificato immediatamente di conseguenza non c'e neccessita' di un passaggio ulteriore, ne e' la prova la visualizzazione della tua tabella che immagino sia a righe vuote prima di essere popolato dallo script.
function addCol(tableID,data,type,value,position,offsetPos)
{
var array=data.split('-'); // magari lo modifichi opportunamente per i tuoi dati, se invece usi un sistema piu complesso ti conviene continuare con la tua funzione
// eventualmente asegni un id direttamente a tbody se non ti stravolge ecessivamente il resto dello script
var row = document.getElementById(tableID).getElementsByTagName('tbody')[0].getElementsByTagName('tr');
var id;
for(j=array.length-1;j>=0;j--)
{
for(i=0+offsetPos;i<table.rows.length;i++)
{
var cell1 = row[i].insertCell(position);
// immagino che element2 sia gia dichiarato da qualche parte altrimenti
// var element2 = document.createElement('input');
element2.type = type;
element2.value=array[j];
element2.name=i;
// elimino la riga di asegnazione all'attributo id per evitare piu id con lo stesso valore che e' illegale ma eventualmente
//element2.id=array[j] + '-' + i; in questo modo avrai idi univoci a meno che non incontri un qualchuno che ha il nome e cognome identico
cell1.appendChild(element2);
//questo associa l evento all elemento 'input' di quella riga
var cell=row[i].getElementsByTagName('input');
// cell[0].onclick = function()
// {
// var td=this.id;
// come faccio a ritornare questo valore nell pagina HTML che
// chiama questo JS????
// qua stampo a video il bottone cliccato e la sua riga...
// alert("id2: "+this.id+' '+this.name);
// };
// ora di questa parte non sono molto pratico in quanto sono agli inizi con gli eventi
cell[0].onclick = function(evento) {
var td = evento.target.value; // e' piu consigliabile usare target o currentTarget dell'oggetto event per creare meno confusione, delle volte this non punta a quello che si vorrebbe
// non reisco a capire cosa intendi come ritornare questo valore se vuoi semplicemente visualizzarlo in quelche punto o cos'altro
// tutti i valori sono gia passati alla pagine nel browser nel momento in cui hai fatto appendChild(element2) quindi richiamabile allo stesso modo da questo script.
alert('id2: '+this.id+' '+this.name);
}
}
}
}
ho provato a renderlo piu pulito.
Come punto finale con condivido il modo in cui popoli la tabella facendolo a colonna, personalmente sono abituato a farlo per riga, ma questo poco cambia alla macchina, per se dovesse succedere che salta un campo non avresti piu i dati coerenti e tutte le informazione successiva viene traslato seguendo l'errore. E ricontrollando bene credo che hai sbagliato qualcosa nella logica delle for annidate, e immagino che questa funzione sia richiamata anch'esso all'interno di un altro ciclo che cicla le colonne e quindi praticamente sarebbero 3 cicli for annidati( piu' cicli annidati hai e piu' e' difficle il controllo ) a una prima analisi senza esecuzione credo che la tua tabella abbia tutte le celle delle colonne con lo stesso valore.