【发布时间】:2019-10-16 04:13:55
【问题描述】:
有两种方法可以添加自动增量列。通过自动增量,我的意思是如果 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);
}
}
【问题讨论】:
-
尊重,但诚实,我不明白你想做什么。你没有说脚本是如何被触发的,你没有给出“auto_inc_sheets”的范围,你没有说工作表通常需要多长时间重新计算等等。你会熟悉Minimal, Reproducible Example 你会请编辑您的问题以提供最小可重现示例?请分享您的电子表格副本(不包括私人或机密信息),包括成功结果的示例。
-
您的代码运行缓慢的原因是您使用了对外部服务的多次调用(任何 SpreadsheetApp 方法都算在内,请参阅 Apps 脚本最佳实践:developers.google.com/apps-script/guides/support/best-practices)如果您想在两次调用之间等待, 你可以使用 SpreadsheetApp.flush(); developers.google.com/apps-script/reference/spreadsheet/…
标签: javascript google-apps-script google-sheets google-sheets-api google-sheets-formula