Google表格脚本,几秒钟后30秒后超时

我创建了一个脚本,将从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,4));
        }
        else if ( rvalength == 2 ) {
          r.setvalue("."+rvalues);
        }
        r.setNumberFormat("00.00");
      }
    }
  }
}

当它是一个小表时,它可以很好地工作,但是当它变成200x500的表时,它就停止了。 执行日志显示状态为“超时”,持续时间始终为30-33秒。
我听说Google App脚本有6分钟的超时时间,所以我不知道为什么我的代码总是在30秒钟左右超时。

我不认为原因是因为我的代码,但我认为也可以对其进行优化以获得更好的性能,我只是不知道怎么做。

maduso 回答:Google表格脚本,几秒钟后30秒后超时

简单的触发器,例如len(v) cannot run for longer than 30 seconds.

您可以尝试将其转换为可安装的触发器,尽管除非他人首先授权脚本,否则这对于其他人可能不是自动起作用。 (要对其进行转换,基本上重命名该函数并遵循these instructions ...事件源应为“电子表格”,事件类型应为“编辑时”。)

或者,考虑到需要清理的数据格式的可变性,您可能希望改为从custom menu调用该函数,而不是依赖于编辑触发器。您可以在电子表格中选择表格,然后在Spreadsheet.getActiveRange()返回的范围内执行功能。

关于优化...如果您做对了,并且可以明显地优化了脚本,则可以使其运行得更快,并且可以在30秒的限制内完成。请查看最佳做法的batch operations部分。根据我在代码中看到的内容,您将特别想利用以下优势:

,

我已经根据Diego 's answer

优化了代码

因此,我让它首先根据需要读取和操作数据作为数组。然后使用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).getColumn() == 3 ){
        if ( evalue > 99 ) {
            datValue[x] = [evalue/100];
        }
        else {
        datValue[x] = [evalue];
        }
      }
    }
  }
  var range2 = sheet.getRange(range.getRow(),1);
  range2.setNumberFormats(numFormat);
  range2.setValues(datValue);
}
本文链接:https://www.f2er.com/3111319.html

大家都在问