2012-11-28 11 views
29

Ho un intervallo di celle selezionato in un foglio di calcolo di Google (attiverange).Fogli di lavoro Google: Iterate su intervallo, aggiungi una stringa a ogni

Voglio ripetere su ogni cella in quell'intervallo e aggiungere una stringa alla fine. La stringa è sempre la stessa e può essere codificata nella funzione.

Sembra una cosa molto semplice, ma ho lavorato con il codice per un'ora e non riesco a ottenere nulla di utile e i documenti non mi aiutano.

Ecco cosa ho ora. Non codifico JS (conosco VBA, per tutto ciò che aiuta ..).

function appendString() { 
    var range = SpreadsheetApp.getActiveSheet().getActiveRange(); 
    for (var i = 0; i < range.length; i++) { 
    var currentValue = range[i].getValue(); 
    var withString = currentValue + " string"; 
    range[i].setValue(withString); 
    } 
} 

Qualsiasi aiuto sarebbe più apprezzato.

risposta

59

si può provare qualcosa di simile:

function appendString() { 
    var range = SpreadsheetApp.getActiveSheet().getActiveRange(); 
    var numRows = range.getNumRows(); 
    var numCols = range.getNumColumns(); 
    for (var i = 1; i <= numRows; i++) { 
    for (var j = 1; j <= numCols; j++) { 
     var currentValue = range.getCell(i,j).getValue(); 
     var withString = currentValue + " string"; 
     range.getCell(i,j).setValue(withString); 
    } 
    } 
} 
+0

Brilliant! Grazie mille! – ezuk

11

Oppure, in alternativa utilizzare setValues() che scrive i tutti i valori allo stesso tempo. Sembra anche essere più veloce.

var range = SpreadsheetApp.getActiveSheet().getActiveRange(); 
var numRows = range.getNumRows(); 
var numCols = range.getNumColumns(); 
var writeValues = [] 
for (var i = 1; i <= numRows; i++) { 
    var row = [] 
    for (var j = 1; j <= numCols; j++) { 
    var currentValue = range.getCell(i,j).getValue(); 
    var withString = currentValue + " string"; 
    row.push(withString) 
    } 
    writeValues.push(row) 
} 
range.setValues(writeValues) 
2

Ecco una funzione molto generale che itera sui valori di un intervallo. Può anche essere usato per fare una funzione reduce (che è utile nel tuo caso). Può anche uscire dal ciclo se vuoi solo trovare il primo di un elemento.

Può essere facilmente modificato per accettare un'istanza di intervallo effettiva anziché l'array di valori.

function range_reduce(rangeValues,fn,collection) { 
    collection = collection || []; 
    var debug_rr = "<<"; 
    for(var rowIndex = 0, row=undefined; rowIndex<rangeValues.length && (row = rangeValues[rowIndex]); rowIndex++) { 
    for(var colIndex = 0, value=undefined; colIndex<row.length && (value = row[colIndex]); colIndex++) { 
     try { 
     collection = fn(collection, value, rowIndex, colIndex); 
     } catch (e) { 
     if(! e instanceof BreakException) { 
      throw e; 
     } else { 
      return collection; 
     } 
     } 
    } 
    } 
    return collection; 
} 

// this is a created, arbitrary function to serve as a way 
// to break out of the reduce function. Your callback would 
// `throw new BreakException()` and `rang_reduce` would stop 
// there and not continue iterating over "rangeValues". 
function BreakException(); 

Nel tuo caso:

var range = SpreadsheetApp.getActiveSheet().getActiveRange() 
var writeValues = range_reduce(range.getValues(), function(collection, value, row, col) { 
    collection[row] || collection.push([]); 
    collection[row].push(value + " string"); 
}); 
range.setValues(writeValues) 
+0

Dove possiamo trovare la definizione di BreakException? – trex005

+1

lol, buon punto @ trex005. Ho aggiunto la definizione e la descrizione nella risposta. –

Problemi correlati