5

Ho questa forma di un foglio di lavoro:Raccogli tutti i valori univoci da una colonna e li emette in un'altra colonna ..?

A B C D 
abc abc abc 1 
def ghi jkl 1 
mno pqr stu 3 
vwx yza bcd 4 
mno pqr stu 5 
mno pqr stu 5 
vwx yza bcd 5 
mno pqr stu 1 

Dove prime 3 colonne sono solo dati di tipo stringa. La colonna D ha numeri interi con numeri ripetuti. La mia domanda è come uscita una quinta colonna in questo modo:

A B C D E 
abc abc abc 1 1 
def ghi jkl 1 3 
mno pqr stu 3 4 
vwx yza bcd 4 5 
mno pqr stu 5 
mno pqr stu 5 
vwx yza bcd 5 
mno pqr stu 1 

emettere solo il numeri unici dalla colonna D.

ho immaginato in esecuzione un'istruzione if/else in un ciclo for o while che controlla ogni cella in "D" e memorizza qualsiasi valore non precedentemente "visto" in un array. Poi l'output l'array nella colonna E.

Mi chiedevo se esiste un modo più efficace per farlo. Anche quanto sopra è solo un piccolo esempio. Molto probabilmente l'intervallo di dati è nell'intervallo 400. (ROW saggio. Le colonne sono solo 4 o 5, comprendente la nuova colonna di output.)

Grazie in anticipo.

P.S. Ho cercato questo qui ma sto solo ricevendo domande relative all'eliminazione di righe duplicate. Se c'è una domanda che ti chiede già, per favore collegami ad essa.

risposta

2

ecco un modo di fare che ... probabilmente non l'unico, ma probabilmente non è male ...

ho aggiunto un paio di ceppi per vedere i risultati intermedi del registratore.

function keepUnique(){ 
    var col = 3 ; // choose the column you want to use as data source (0 indexed, it works at array level) 
    var sh = SpreadsheetApp.getActiveSheet(); 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var data=ss.getDataRange().getValues();// get all data 
    Logger.log(data); 
    var newdata = new Array(); 
    for(nn in data){ 
    var duplicate = false; 
    for(j in newdata){ 
     if(data[nn][col] == newdata[j][0]){ 
     duplicate = true; 
     } 
    } 
    if(!duplicate){ 
     newdata.push([data[nn][col]]); 
    } 
    } 
    Logger.log(newdata); 
    newdata.sort(function(x,y){ 
    var xp = Number(x[0]);// ensure you get numbers 
    var yp = Number(y[0]); 
    return xp == yp ? 0 : xp < yp ? -1 : 1;// sort on numeric ascending 
}); 
    Logger.log(newdata); 
sh.getRange(1,5,newdata.length,newdata[0].length).setValues(newdata);// paste new values sorted in column of your choice (here column 5, indexed from 1, we are on a sheet)) 
    } 

EDIT:

seguito Theodros risposta, la formula di foglio di calcolo è davvero una soluzione elegante, non ho mai pensarci ma dovrei !!! ;-)

=SORT(UNIQUE(D1:D)) 

dà esattamente lo stesso risultato ...

+0

grazie ancora. Questo codice ha funzionato perfettamente e rapidamente. Una domanda è qual è quella sintassi per il "ciclo for" ..? (La parte 'nn in data'.) ho sempre pensato che si doveva fare qualcosa di simile: '(nn = 0; nn <= data.length; nn ++)' ho cercato di trovare la documentazione per questo formato, ma continuare a colpire un muro. Il tuo formato ridurrebbe molti miei script precedenti. Grazie ancora! :) – PhysLabTsar

+0

questo è solo un modulo di shortend, di solito include la dichiarazione var come questa: 'for (var nn in data) {...' ma il 'modo normale fa più o meno lo stesso, in questo caso sarebbe stato 'for (var nn = 0; nn google-fogli di calcolo con la funzione UNIQUE.
Here is the doc to all available functions.
(Potete trovare UNIQUE nella categoria Filter)

Molto probabilmente si desidera inserire nella cella E1:

=UNIQUE(D1:D) 

Questo popolerà colonna E con i valori univoci da tutti colonna D preservando l'ordine . Inoltre, aggiornerà e rifletterà in modo dinamico tutte le modifiche apportate alla colonna D.

Per fare che da dentro google-apps-script:

SpreadsheetApp.getActiveSheet() 
.getRange("E1").setFormula("=UNIQUE(D1:D)"); 
+0

Hmm ... Sembra diabolicamente troppo semplice! Grazie! Scommetto che qualcosa come il codice di Serge sopra è in definitiva dietro questa funzione "UNICA". – PhysLabTsar

Problemi correlati