Javascript 将数据复制并粘贴到下一个空行中
我有一个系统生成的电子表格,当订单号中有多个项目时,它会输入空白单元格。例如,如果订单1有三个项目,我将有三行完全填写,但只有一行有日期。标题如下所示:Javascript 将数据复制并粘贴到下一个空行中,javascript,loops,google-apps-script,optimization,google-sheets,Javascript,Loops,Google Apps Script,Optimization,Google Sheets,我有一个系统生成的电子表格,当订单号中有多个项目时,它会输入空白单元格。例如,如果订单1有三个项目,我将有三行完全填写,但只有一行有日期。标题如下所示: Order Number | User | Date | Item 我附加了一个样本数据集中的示例图像: 我尝试了下面的代码,该代码可以很好地完成任务,但我无法完成任务,因为每次运行脚本时执行都会超时(它会在第1000行左右停止)。我的电子表格大约有3000行,并且增长缓慢。我读了一些关于如何提高代码效率的说明,但对我来说,它已经非常有效了
Order Number | User | Date | Item
我附加了一个样本数据集中的示例图像:
我尝试了下面的代码,该代码可以很好地完成任务,但我无法完成任务,因为每次运行脚本时执行都会超时(它会在第1000行左右停止)。我的电子表格大约有3000行,并且增长缓慢。我读了一些关于如何提高代码效率的说明,但对我来说,它已经非常有效了(至少与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
}
}
}
函数myFunction(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getActiveSheet();
var last=sheet.getLastRow();//获取最后一行号
对于(i=2;i
问题在于getRange
和其他类似的电子表格服务(Class SpreadsheetApp
)速度“非常”慢
使用getDataRange()
然后getValues()
在包含所有数据范围值的数组上迭代,一次读取整个数据范围,而不是每次读取一个范围
相关的
问题在于
getRange
和其他类似的电子表格服务(Class SpreadsheetApp
)速度“非常”慢
使用getDataRange()
然后getValues()
在包含所有数据范围值的数组上迭代,一次读取整个数据范围,而不是每次读取一个范围
相关的
我认为您出现问题的原因是循环中使用了getValues
和setValues
。这样,工艺成本就会很高。这一点我已经提过了。因此,为了降低成本,在您的情况下,如何使用以下流程进行修改
使用getValues
从列“C”中检索值
创建用于将值放入电子表格的数组
使用setValues
将创建的数组放入电子表格
当上述流程反映到脚本中时,它将变成如下所示
修改脚本:
参考资料:
我认为您出现问题的原因是循环中使用了getValues
和setValues
。这样,工艺成本就会很高。这一点我已经提过了。因此,为了降低成本,在您的情况下,如何使用以下流程进行修改
使用getValues
从列“C”中检索值
创建用于将值放入电子表格的数组
使用setValues
将创建的数组放入电子表格
当上述流程反映到脚本中时,它将变成如下所示
修改脚本:
参考资料:
试试这个:
function myFunction() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet()
var shsr=2;//data start row
var vs=sh.getRange(shsr,3,sh.getLastRow()-shsr+1,1).getValues();
vs.forEach(function(r,i){if(!r[0]){vs[i][0]=vs[i-1][0];}});
sh.getRange(shsr,3,sh.getLastRow()-shsr+1,1).setValues(vs);
}
试试这个:
function myFunction() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet()
var shsr=2;//data start row
var vs=sh.getRange(shsr,3,sh.getLastRow()-shsr+1,1).getValues();
vs.forEach(function(r,i){if(!r[0]){vs[i][0]=vs[i-1][0];}});
sh.getRange(shsr,3,sh.getLastRow()-shsr+1,1).setValues(vs);
}
我认为,当针对OP的情况提出一个示例修改脚本时,它可能有助于理解修改点。因此,我建议将其作为几个修改之一。谢谢您的评论@Tanaike。当已经有很多类似的问题并且OP没有简要描述他们的搜索/研究工作时,我很犹豫是否要这么做。无论如何,我很高兴你贴出了答案:)谢谢你的回复。我能理解。我认为,当用户能够获得解决用户问题的方向时,可能会导致作为用户的教育。所以我提出了这个建议。当然,当我能找到解决这个问题的清晰的重复问题时,我会建议把它转介给你。鲁本,谢谢你的材料。我要读你贴的文章。事实上,我对javascript和Google Sheets(通常对小任务使用一些Python或VBA)还不熟悉,我不知道getRange
和其他电子表格服务背后的缓慢过程。我试图搜索类似的问题,但发现自己正在阅读关于提高代码效率的文章,这对新用户来说是一个很大的进步。我认为,当针对OP的情况提出一个修改脚本示例时,可能有助于了解修改点。因此,我建议将其作为几个修改之一。谢谢您的评论@Tanaike。当已经有很多类似的问题并且OP没有简要描述他们的搜索/研究工作时,我很犹豫是否要这么做。无论如何,我很高兴你贴出了答案:)谢谢你的回复。我能理解。我认为,当用户能够获得解决用户问题的方向时,可能会导致作为用户的教育。所以我提出了这个建议。当然,当我能找到解决这个问题的清晰的重复问题时,我会建议把它转介给你。鲁本,谢谢你的材料。我要读你贴的文章。事实上,我对javascript和Google Sheets(通常对小任务使用一些Python或VBA)还不熟悉,我不知道getRange
和其他电子表格服务背后的缓慢过程。我试着搜索类似的问题,但发现自己读到了关于提高代码效率的文章,这对新用户来说是一大步。它工作得非常好!谢谢你的参考资料。@Haddocks谢谢你的回复。我很高兴你的问题得到了解决。它工作得很好!谢谢你的参考资料。@Haddocks谢谢你