将文本更改为固定位数(添加零)- 提高速度

Change text to fixed number of digits (add zeroes) - enhance speed

晚安,

我一直在使用此函数来确保 A 列中的所有值都具有 5 位数字(如果小于 5 则加零)或者如果单元格中没有值则保留空白。

只要行数少,它就可以正常工作。 我的行数已增加到近 10,000 行,因此需要很长时间才能完成。

任何人都可以帮助我加快速度以获得并获得绿色 Col1 中的结果吗? (所有值都是文本)

function set5Digits () {
var app = SpreadsheetApp.getActive();
var ws = app.getSheetByName("Sheet1"); 
var values = ws.getDataRange().getValues();

  for (var i = 2; i < values.length; i++) {
      var n = ws.getRange("a"+ i).getValue();
      var format = 0;
      var length = n.toString().length;
      var result = "";
            
      if(length<5 && length>0){    
        format = 5;                
        var z = format - length;

            for(var x = 0; x < z; x++){
              result = result + "0";
            }
      ws.getRange("a" + i).setNumberFormat('@').setValue(result+n.toString());

      }
  }
}
 

访问sheet很慢,因此,随着行数的大量增加,脚本的总运行时间显着增加。 因此,最好将所有数据一次读入一个数组,然后处理它们(这样很快),然后将处理后的数组卸载到 sheet.

试一试:

function set5Digits() {
  var app = SpreadsheetApp.getActive();
  var ws = app.getSheetByName("Sheet1");
  var lr = ws.getLastRow();
  var values = ws.getRange(2, 1, lr).getValues();
  var len = values.length;
  var res = [];
  var format = 5;
  for (var i = 0; i < len; i++) {
    var n = values[i];
    var length = n.toString().length;
    var result = "";

    if (length >= format) {
      res.push([n.toString()]);
    } else if (length == 0) {
      res.push([""]);
    } else {
      var z = format - length;
      for (var x = 0; x < z; x++) {
        result = result + "0";
      }
      res.push([result + n.toString()]);
    }
  }
  ws.getRange(2, 1, len, 1).setNumberFormat('@').setValues(res);
}
function set5Digits() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("Sheet1");
  const vs = sh.getRange(2, 1, sh.getLastRow() - 1, 1).getValues();
  let c = sh.getRange(2, 1, sh.getLastRow() - 1, 1).getValues();
  vs.forEach((r, i) => {
    c[i][0] = Number(r[0]).toFixed(5).toString();
  });
  sh.getRange(2, 1, sh.getLastRow() - 1, 1).setNumberFormat('00000X').setHorizontalAlignment('right');
  sh.getRange(2, 1, c.length, c[0].length).setValues(c);
}