我有两种添加自动增量列的方法。通过自动递增,我的意思是,如果B列具有值,则A列将增加一个数值,该数值将基于前一行的值而增加。
第一种方法很简单,就是在我的第一列中粘贴一个类似于下面的公式:
=IF(ISBLANK(B1),,IF(ISNUMBER(A1),A1,0)+1)
我完成此操作的第二种方法是通过GA脚本。但是我发现使用GA脚本的性能要慢得多并且容易出错。例如,如果我以该顺序快速将值粘贴到单元格b1到b10中,它有时会重置计数,并在某些行中再次从1开始。这是因为尚未计算前几行的值。我认为这是因为GA脚本可能异步并并行运行。我的问题是..是否有办法确保每次更改发生时,该脚本的执行都按顺序排队并执行?或者,有没有一种方法可以编写此脚本来对其进行优化?
function auto_increment_col() {
ID_COL = 1;
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
//only increment column 1 for sheets in this list
var auto_inc_sheets = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("auto_inc_sheets").getValues();
auto_inc_sheets = auto_inc_sheets.map(function(row) {return row[0];});
var is_auto_inc_sheet = auto_inc_sheets.indexOf(spreadsheet.getSheetName()) != -1;
if (!is_auto_inc_sheet) return;
var worksheet = spreadsheet.getActiveSheet();
var last_row = worksheet.getLastRow();
var last_inc_val = worksheet.getRange(last_row, ID_COL).getValue();
//if auto_inc column is blank and the column next to auto_inc column (col B) is not blank, then assume its a new row and increment col A
var is_new_row = last_inc_val == "" && worksheet.getRange(last_row, ID_COL+1).getValue() != "";
Logger.log("new_row:" + is_new_row + ", last_inc_val:" + last_inc_val );
if (is_new_row) {
var prev_inc_val = worksheet.getRange(last_row-1, ID_COL).getValue();
worksheet.getRange(last_row, ID_COL).setValue(prev_inc_val+1);
}
}
这的主要功能是
/**
*
* @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
*/
function autoincrement_(sheet) {
var data = sheet.getDataRange().getValues();
if (data.length < 2) return;
var indexCol = data[0].indexOf('autoincrement');
if (indexCol < 0) return;
var increment = data.map(function(row) {
return row[indexCol];
});
var lastIncrement = Math.max.apply(
null,
increment.filter(function(e) {
return isNumeric(e);
})
);
lastIncrement = isNumeric(lastIncrement) ? lastIncrement : 0;
var newIncrement = data
.map(function(row) {
if (row[indexCol] !== '') return [row[indexCol]];
if (row.join('').length > 0) return [++lastIncrement];
return [''];
})
.slice(1);
sheet.getRange(2, indexCol + 1, newIncrement.length).setValues(newIncrement);
}
但是您必须打开代码片段以获取详细信息,因为如果没有锁,这将无法正常工作。