2012-11-28 13 views
29

Mam zakres komórek wybranych w Arkuszu kalkulacyjnym Google (aktywny zakres).Arkusze kalkulacyjne Google: zmieniaj zakres, dodaj ciąg do każdego

Chcę iterować po każdej komórce w tym zakresie i dodać ciąg do końca. Ciąg znaków jest zawsze taki sam i może zostać zakodowany na stałe w funkcji.

Wygląda na to, że jest to naprawdę prosta sprawa, ale od jakiegoś czasu mam problem z kodem i nie mogę zrobić nic użytecznego, a dokumenty naprawdę nie pomagają.

Oto, co mam teraz. Nie koduję JS (znam VBA, za wszystko, co 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 najbardziej ceniona.

Odpowiedz

59

Można 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); 
    } 
    } 
} 
+0

Brilliant! Dziękuję bardzo! – ezuk

11

Lub alternatywnie użyć setValues() który zapisuje wszystkie wartości w tym samym czasie. Wydaje się, że również 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) 
2

Oto funkcja ogólnego przeznaczenia, która wykonuje iteracje na wartościach zakresu. Można go również użyć do wykonania funkcji reduce (co jest przydatne w twoim przypadku). Może również wyrwać się z pętli, jeśli chcesz tylko znaleźć pierwszy element.

Można go bardzo łatwo zmienić, aby zaakceptować 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) 
+0

Gdzie można znaleźć definicję wyjątku BreakException? – trex005

+1

lol, dobry punkt @ trex005. Dodałem definicję i opis do odpowiedzi. –