首页 > 解决方案 > 将数据复制并粘贴到下一个空行

问题描述

我有一个系统生成的电子表格,当订单号中有多个项目时,它会输入空白单元格。例如,如果订单 1 有三个项目,我将有三行完全填满,但只有一个带有日期。标题是这样的:

Order Number | User | Date | Item

我附上了来自示例数据集的示例图像:

数据集图片

我尝试了以下代码,它很好地完成了这项工作,但我无法完成任务,因为每次运行脚本时执行都会超时(它在行号 1,000 附近停止)。我的电子表格有大约 3,000 行并且增长缓慢。我阅读了一些有关尝试使代码更高效的说明,但对我来说它已经非常有效(至少将其与 VBA 进行比较)。任何帮助表示赞赏!

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var last = sheet.getLastRow();// get last row number
 
  for (i = 2; i < last; i++) { 
    var info = sheet.getRange(i, 3);
    Logger.log(info);
 
    if (info.isBlank()) {
      var data = sheet.getRange(i-1, 3).getValues(); //copy value from cell above with date
      sheet.getRange(i, 3).setValues(data); //paste value on empty cell
    } 
  }
}

标签: javascriptloopsgoogle-apps-scriptoptimizationgoogle-sheets

解决方案


我认为您的问题的原因是getValues并且setValues在循环中使用。这样一来,处理成本会很高。鲁本的回答已经提到了这一点。那么为了降低成本,在你的情况下,用下面的流程修改怎么样?

  1. 使用 检索“C”列中的值getValues
  2. 创建一个数组以将值放入电子表格。
  3. 使用 . 将创建的数组放入电子表格setValues

当上述流程反映到您的脚本时,它变成如下。

修改后的脚本:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var last = sheet.getLastRow();// get last row number

  // I modified below script.
  var range = sheet.getRange("C2:C" + last);

  // 1. Retrieve values from the column "C".
  var values = range.getValues();

  // 2. Create an array for putting values to Spreadsheet.
  var temp = "";
  var v = values.map(([c]) => [c.toString() != "" ? temp = c : temp]);

  // 3. Put the created array to the Spreadsheet.
  range.setValues(v);
}

参考:


推荐阅读