将活动单元格复制到其他包含字符串的单元格

时间:2018-08-31 14:59:14

标签: google-apps-script google-sheets google-sheets-macros

在Google表格中,我尝试创建一个脚本,该脚本将从活动单元格中获取值并将该值粘贴到包含字符串“ HR”的B列中的任何单元格中。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这还不错;您只需要围绕Apps脚本和Javascript的一些概念来提高效率即可。但是首先让我们从天真的方法开始!

function firstTry() {
  var activeSheet = SpreadsheetApp.getActiveSheet();  // whatever is open
  var activeCell = SpreadsheetApp.getCurrentCell();   // this is a single-cell range
  var activeCellValue = activeCell.getValue();        // could be a string, number, etc
  // Now let's look in column B for stuff to change
  for (var i = 1; i <= activeSheet.getLastRow(); i++) {
    var cell = activeSheet.getRange("B" + i);
    var val = cell.getValue();
    var valStr = String(val);                        // We could have gotten a number
    if (valStr.indexOf("HR") != -1) {
      cell.setValue(activeCellValue);
    }
  }
}

这可能会起作用,但效率不高:每次调用getValue()或setValue()都需要一些时间。最好一次获取所有值,然后在我们满意的时候粘贴修改后的B列:

function improvement() {
  var activeSheet = SpreadsheetApp.getActiveSheet();  // whatever is open
  var activeCell = SpreadsheetApp.getCurrentCell();   // this is a single-cell range
  var activeCellValue = activeCell.getValue();        // could be a string, number, etc
  // Now let's look in column B for stuff to change
  var rowsWithData = activeSheet.getLastRow() - 1;
  var colBRange = activeSheet.getRange(1,             // start on row 1
                                       2,             // start on column 2
                                       rowsWithData,  // this many rows
                                       1);            // just one column
  // Let's get the data as an array of arrays. JS arrays are 0-based, btw
  var colBData = colBRange.getValues();               
  for (var i = 0; i < colBData.length; i++) {
    var val = colBData[i][0];                         // row i, first column
    var valStr = String(val);                         // We might have gotten a number
    if (valStr.indexOf("HR") != -1) {
      colBData[i][0] = activeCellValue;               // modify copied data
    }
  }
  // Lastly, write column B back out
  colBRange.setValues(colBData);
}

您可以使用高级过滤器功能,而不是显式地遍历数据,但这会变得越来越不清楚。

注意事项,如OP在下面的注释中所指出的那样,像这样盲目地调用setValues将覆盖您拥有的所有公式。除了包括超链接之外,这没什么大不了的。您可以通过与getFormulas并行调用getValues来真正参与其中,然后根据原始内容决定是调用setValue还是setFormula每个单元格。