Googleスプレッドシートでセルの範囲を選択しています(アクティブ範囲)。その範囲内のすべてのセルを反復処理し、最後に文字列を追加します。文字列は常に同じであり、関数にハードコーディングできます。
それは本当に単純なことのように思えますが、私は今から1時間コードをいじっていて、何も役に立つことができず、ドキュメントは本当に助けになりません。
ここに私が持っているものがあります。私はJSをコーディングしていません(VBAを知っていますが、それは役に立ちます).
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);
}
}
次のようなものを試すことができます:
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);
}
}
}
または、代わりに setValues() を使用して、すべての値を同時に書き込みます。より速く実行するようです。
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)
Voy's post の更新です。 range.getValues() を使用してすべての値を取得し、一時配列を省略します。 range.getCell().getValue()
は2次元ループで省略されるため、さらに高速になります。このスニペットでは、インデックスは0
から始まることに注意してください。これも読みやすいと思います。
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);
私は、古い学校のforEach
ループよりもJavascript 1.6 for
メソッドの方が好きです。あなたはできる:
function appendString() {
var range = SpreadsheetApp.getActiveSheet().getActiveRange();
var values = range.getValues();
values.forEach(function(row, rowId) {
row.forEach(function(col, colId) {
values[rowId][colId] += " string";
});
});
range.setValues(values);
}
RowIdとcolIdはゼロベースであることに注意してください。そして、オールドスクールのソリューションのような1ベースではありません。 Javascript 1.6はmap
も提供します。これは検討する価値があります。
function appendString() {
var range = SpreadsheetApp.getActiveSheet().getActiveRange();
var values = range.getValues();
var modified = values.map(function (row) {
return row.map(function (col) {
return col + " string";
});
})
range.setValues(modified);
}
矢印関数を使用すると、コードは改善されますが、google-apps-scriptではまだサポートされていません。
以下は、範囲の値を反復処理する非常に汎用的な関数です。 reduce
関数を実行するためにも使用できます(これはあなたの場合に便利です)。また、要素の最初の要素のみを検索する場合は、ループから抜けることができます。
値の配列ではなく、実際のRangeインスタンスを受け入れるように非常に簡単に変更できます。
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();
あなたの場合:
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)
google-sheets
これは、検索と置換で簡単に行えます。
範囲を選択してください
見つける:
^(.*)$
交換:
$1AppendString
正規表現を使用するをマークする
すべて置換をクリック
ここでスクリプトを使用する利点は見当たりませんが、必要な場合は、sheets APIを使用して Find Replace リクエストを発行することもできます。