我使用一个函数来检查列的长度,并在每个单元格中插入唯一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()也接受字符串,这是我不想要的,而且我不知道如何从我的范围中过滤字符串。数据列应该只接受空闲的单元格,忽略字符串,并随着数字的增加而继续。
在这里你可以看到完整的函数:
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);
}感谢您的帮助
发布于 2013-04-15 17:45:47
我经常使用的两个数字验证是:parseInt(val) == val和val.toString().match(/[0-9\-\.]/i) > -1),前者是值检查,后者是字符串检查。
在下面的代码中,我使用的不是double for{}循环,而是数组函数。For循环同样有效,我只是更喜欢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中提到的替代方法
https://stackoverflow.com/questions/16010921
复制相似问题