我有一个谷歌表(activerange)选定的单元格区域。 我想在这个范围内的每一个细胞迭代,并添加一个字符串的结束。 该字符串始终是相同的,并且可以硬编码到函数。
这似乎是一个很简单的事情,但我一直在与现在的代码搞乱了一个小时,不能得到任何有用的事情发生,而文档真的没有帮助。
这是我现在有。 我不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)
下面就来更新航次的职位 ,采用range.getValues()来获取所有值,并省略临时数组。 因为应该甚至更快range.getCell().getValue()
在二维循环被省略。 请注意,从指标开始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);
这里是一个迭代在一定范围内的值非常通用的功能。 它也可以用来做reduce
它的功能(这是你的情况很有用)。 它也可以打破循环如果你只是想找到的第一个元素。
它可以很容易地改变,以接受实际范围实例,而不是值的数组。
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)
我喜欢的JavaScript 1.6 forEach
方法,在老同学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都是从零开始的。 而不是一个为主,像老派的解决方案。 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);
}
随着箭头函数的代码会改善,但他们没有在谷歌 - 应用程序 - 脚本支持呢。
谷歌表
您可以轻松地做到这一点与查找和替换。
选择你的范围
找:
^(.*)$
更换:
$1AppendString
马克使用正则表达式
点击全部替换。
我在这里看不到使用脚本的任何优势,但是,如果你要,你也可以发出查找替换通过表API请求。