我创建了一个脚本,将从Excel复制的时间转换为正确的格式。
因为当我将它们粘贴到Google表格中时,其12.30、09.34、07.40或08.00最终将分别为12.3、9.34、7.4和8。
某些表事件包含时间格式,例如1230、934或740,因此我也必须解决此问题。
这是我的代码。
function onEdit(event) {
if (event.range.getColumn() == 3 ) {
for(var i = 1; i<= range.getNumRows() ; i++){
var r = range.getCell(i, 1);
var rvalue = r.getValue();
var rvalues = rvalue.toString();
var rvalength = rvalues.length;
if (rvalue != ""){
if (rvalength == 3) {
if (parseInt(rvalues.substring(0,2))>24) {
r.setValue(rvalues.substring(0,1)+"."+rvalues.substring(1,3));
}
else
{
r.setValue(rvalues.substring(0,2)+"."+rvalues.substring(2,3));
}
}
else if ( rvalength == 4 ) {
r.setValue(rvalues.substring(0,2)+"."+rvalues.substring(2,4));
}
else if ( rvalength == 2 ) {
r.setValue("."+rvalues);
}
r.setNumberFormat("00.00");
}
}
}
}
当它是一个小表时,它可以很好地工作,但是当它变成200x500的表时,它就停止了。
执行日志显示状态为“超时”,持续时间始终为30-33秒。
我听说Google App脚本有6分钟的超时时间,所以我不知道为什么我的代码总是在30秒钟左右超时。
我不认为原因是因为我的代码,但我认为也可以对其进行优化以获得更好的性能,我只是不知道怎么做。
答案 0 :(得分:2)
简单的触发器,例如len(v)
cannot run for longer than 30 seconds.
您可以尝试将其转换为可安装的触发器,尽管除非他人首先授权脚本,否则这对于其他人可能不是自动起作用。 (要对其进行转换,基本上重命名该函数并遵循these instructions ...事件源应为“电子表格”,事件类型应为“编辑时”。)
或者,考虑到需要清理的数据格式的可变性,您可能希望改为从custom menu调用该函数,而不是依赖于编辑触发器。您可以在电子表格中选择表格,然后在Spreadsheet.getActiveRange()
返回的范围内执行功能。
关于优化...如果您做对了,并且可以明显地优化了脚本,则可以使其运行得更快,并且可以在30秒的限制内完成。请查看最佳做法的batch operations部分。根据我在代码中看到的内容,您将特别想利用以下优势:
答案 1 :(得分:0)
因此,我让它首先根据需要读取和操作数据作为数组。然后使用setValues()将所有内容一次放入工作表中,而不是一个个地“读取->计算->写入”每个单元格。结果是,即使1000x1000的表现在也只需1-2秒即可运行。
这是代码:
function onEdit(event) {
var sheet = SpreadsheetApp.getActiveSheet();
var range = event.range;
var numRows = range.getNumRows();
var numCols = range.getNumColumns();
var datValue = new Array(numRows);
var numFormat = new Array(numRows);
for(var x = 0; x< numRows ; x++){
datValue[x] = new Array(numCols);
numFormat[x] = ["00.00"];
for(var y = 0; y< numCols ; y++){
var evalue = range.getCell(x+1,y+1).getValue();
if ( range.getCell(x+1,y+1).getColumn() == 3 ){
if ( evalue > 99 ) {
datValue[x][y] = evalue/100;
}
else {
datValue[x][y] = evalue;
}
}
}
}
var range2 = sheet.getRange(range.getRow(), 3, numRows,1);
range2.setNumberFormats(numFormat);
range.setValues(datValue);
}
编辑:进一步的优化,仅对第3列的值进行运算,而不是对所有粘贴的值进行
function onEdit(event) {
var sheet = SpreadsheetApp.getActiveSheet();
var range = event.range;
var numRows = range.getNumRows();
var numCols = range.getNumColumns();
var datValue = new Array(numRows);
var numFormat = new Array(numRows);
for(var x = 0; x< numRows ; x++){
numFormat[x] = ["00.00"];
for(var y = 0; y< numCols ; y++){
var evalue = range.getCell(x+1,y+1).getValue();
if ( range.getCell(x+1,y+1).getColumn() == 3 ){
if ( evalue > 99 ) {
datValue[x] = [evalue/100];
}
else {
datValue[x] = [evalue];
}
}
}
}
var range2 = sheet.getRange(range.getRow(), 3, numRows,1);
range2.setNumberFormats(numFormat);
range2.setValues(datValue);
}