Iterować ponad zakres, dołączać łańcuch do każdego
Mam zakres komórek wybranych w arkuszu kalkulacyjnym Google (activerange).
Chcę iterować nad każdą komórką w tym zakresie i dodać ciąg znaków na końcu. Ciąg znaków jest zawsze taki sam i może być zakodowany na twardo w funkcji.
Wydaje się to bardzo proste, ale od godziny grzebałem w kodzie i nie mogę uzyskać niczego użytecznego, a dokumenty naprawdę nie pomagają.
Oto, co mam teraz. Nie koduję JS (znam VBA, dla wszystkich to pomaga..).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);
}
}
Każda pomoc będzie mile widziana. 4 answers
Możesz spróbować czegoś takiego:
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);
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 12:53:32
Lub alternatywnie użyć setValues () , która zapisuje wszystkie wartości w tym samym czasie. Wydaje się, że wykonuje też szybciej.
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-19 14:07:18
Tutaj jest bardzo ogólna funkcja, która iteracje nad wartościami zakresu. Może być również użyty do wykonania na nim funkcji reduce
(co jest przydatne w Twoim przypadku). Może również wyrwać się z pętli, jeśli kiedykolwiek chcesz znaleźć tylko pierwszy element.
Można ją bardzo łatwo zmienić, aby przyjąć rzeczywistą instancję Range zamiast tablicy wartości.
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();
W Twoim przypadku:
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 12:49:12
Oto update do Voy ' s post , używa range.getValues () Aby pobrać wszystkie wartości i pominąć tymczasową tablicę. powinno być jeszcze szybsze, ponieważ {[1] } jest pominięte w pętli dwuwymiarowej. Zauważ, że indeksy zaczynają się od 0
w tym fragmencie. Ja też uważam to za bardziej czytelne.
var cells = range.getValues();
var numRows = range.getNumRows();
var numCols = range.getNumColumns();
for (var i = 0; i < numRows; i++) {
for (var j = 0; j < numCols; j++) {
cells[i][j] += " string";
}
}
range.setValues(cells);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 19:59:11