迭代范围,附加串给每个(Iterate over range, append string to e

2019-07-04 05:06发布

我有一个谷歌表(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);
  }
}

Answer 1:

你可以尝试这样的事情:

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);
    }
  }
}


Answer 2:

或者选择使用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)


Answer 3:

下面就来更新航次的职位 ,采用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);


Answer 4:

这里是一个迭代在一定范围内的值非常通用的功能。 它也可以用来做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)


Answer 5:

我喜欢的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);
}

随着箭头函数的代码会改善,但他们没有在谷歌 - 应用程序 - 脚本支持呢。



Answer 6:

谷歌表
您可以轻松地做到这一点与查找和替换。

  • 选择你的范围

  • 找:

     ^(.*)$ 
  • 更换:

     $1AppendString 
  • 马克使用正则表达式

  • 点击全部替换。

我在这里看不到使用脚本的任何优势,但是,如果你要,你也可以发出查找替换通过表API请求。



文章来源: Iterate over range, append string to each