优化用于实现自动增量列的google app脚本

问题描述 投票:0回答:1

我有两种添加自动增量列的方法。通过自动递增,我的意思是,如果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);
  }
}
javascript google-apps-script google-sheets google-sheets-api google-sheets-formula
1个回答
0
投票

我有自动递增https://github.com/contributorpw/google-apps-script-snippets/tree/master/snippets/spreadsheet_autoincrement的愿景

这的主要功能是

/**
 *
 * @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);
}

但是您必须打开代码片段以获取详细信息,因为如果没有锁,这将无法正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.