我使用的函数检查列的长度并在每个单元格中插入unique-id。
var sh = SpreadsheetApp.getActiveSheet();
var dataincol = sh.getRange(1,8,sh.getMaxRows(),1).getValues(); //getRange row, column, numRows, numColumns
//thanks to Serge insas
我的问题是getValues()也接受字符串,我不想要的,我不知道如何从我的Range过滤字符串。 dataincol应该只使用空闲单元格,忽略字符串并继续增加数字。
在这里你可以看到完整的功能:
function fillRowNumber(){
var col = 1 ; // this for column A ! change to your needs
var sh = SpreadsheetApp.getActiveSheet();
var dataincol = sh.getRange(1,col,sh.getMaxRows(),1).getValues();
var maxval =0
for(n=0;n<dataincol.length;++n){
if(Number(dataincol[n][0])>maxval){ maxval=Number(dataincol[n][0])}
}
for(n=1;n<sh.getLastRow();++n){
if(dataincol[n-1][0] == ''){ dataincol[n-1][0]=maxval+1;++maxval}
}
sh.getRange(1,col,sh.getMaxRows(),1).setValues(dataincol);
}
感谢您的帮助
答案 0 :(得分:0)
我经常使用的两个数字验证是:parseInt(val) == val
这是一个值检查,val.toString().match(/[0-9\-\.]/i) > -1)
是字符串检查。
在下面的代码中,我使用了数组函数而不是{}循环的double。对于循环也是如此,我只是更喜欢EC5中的数组函数。
首先在列中构建一个数值的数组(保留索引,以防你想在线下用于其他任何东西 - 替代方法是过滤掉非数字值)
第二个修改dataincol以填充增加maxval的空格。
function fillRowNumber(){
var col = 1;
var sh = SpreadsheetApp.getActiveSheet();
var dataincol = sh.getRange(1, col, sh.getMaxRows(), 1).getValues();
var maxval = 0;
var map = dataincol.map(function(row) {
// fill an array with numbers where numbers exist in data otherwise 0
return (parseInt(row[0],10) == row[0]) ? row[0] * (row[0].toString().match(/[0-9\-\.]/i) > -1) : 0;
});
maxval = Math.max.apply(Math, map); // Mathmatical maximum
dataincol = dataincol.map(function(row, index) {
if (row[0] == '') {
maxval += 1; // increment maximum value
// if blank cell then add new maximum value
return (row[0] == '') ? [maxval] : [row[0]]; // if you add [&& index < sh.getLastRow()] to the conditional it restricts it to the original range of used cells not the maximum
} else {
// leave cell intact
return [row[0]];
}
});
sh.getRange(1, col, sh.getMaxRows(), 1).setValues(dataincol);
}
我不清楚你是想继续为整张表添加最大值,还是只在最初输入数据的范围内。请尝试代码注释line 18