javascript - 将数据复制并粘贴到下一个空行
问题描述
我有一个系统生成的电子表格,当订单号中有多个项目时,它会输入空白单元格。例如,如果订单 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
}
}
}
解决方案
我认为您的问题的原因是getValues
并且setValues
在循环中使用。这样一来,处理成本会很高。鲁本的回答已经提到了这一点。那么为了降低成本,在你的情况下,用下面的流程修改怎么样?
- 使用 检索“C”列中的值
getValues
。 - 创建一个数组以将值放入电子表格。
- 使用 . 将创建的数组放入电子表格
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);
}
参考:
推荐阅读
- excel - 如何使用更多 Target.Address(范围)
- sql-server - DAX 在 ssas 表格模型的开始日期列中查找日期
- java - 在 Firebase 数据库中读取孩子时遇到问题
- javascript - HTML/JavaScript:单击按钮后在表格中添加新行
- php - 不考虑约束
- dialogflow-es - dialogflow v2在fullfillment中提取参数
- html - .class with display: none -> .class:focus with display: block; 导致链接不起作用
- react-native - 如何使用 JWT 保护端到端服务
- powerapps - PowerApp 应用程序的画布布局中没有项目显示
- sql - 在 google cloud firestore 中执行 JOIN 查询