迭代范围,将字符串附加到每个范围

ezu*_*zuk 46 google-sheets google-apps-script

我在Google表格(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);
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 84

你可以尝试这样的事情:

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Voy*_*Voy 20

或者使用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)
Run Code Online (Sandbox Code Playgroud)


Ste*_*amm 10

编辑 2020 年 3 月:您现在可以使用现代 ECMAScript。如果您启用 V8 运行时,这将起作用:

function appendString() {
  const range = SpreadsheetApp.getActiveSheet().getActiveRange();
  const values = range.getValues();
  const modified = values.map(row => row.map(currentValue => currentValue + " string"));
  range.setValues(modified);
}
Run Code Online (Sandbox Code Playgroud)

如果您必须使用较旧的 Javascript 版本,您可以:

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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,rowId并且colId是从零开始的。在接受的答案中,索引是基于一个的。或者您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);
}
Run Code Online (Sandbox Code Playgroud)

  • `map` 在这种情况下似乎更合适:`range.setValues(values.map(function (row) { return row.map(function (val) { return val + theConstantValue; }); }))` (3认同)

gle*_*len 7

这是Voy 帖子的更新,使用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);
Run Code Online (Sandbox Code Playgroud)