将文本更改为固定位数(添加零)- 提高速度
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);
}
晚安,
我一直在使用此函数来确保 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);
}