javascript - 优化Google应用程序脚本以实现自动增量列

标签 javascript google-apps-script google-sheets google-sheets-api google-sheets-formula

有两种方法可以添加自动增量列。通过自动递增,我的意思是如果 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);
  }
}

最佳答案

这是我对自动增量的愿景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);
}

但是您必须打开代码片段才能了解详细信息,因为如果没有锁,这将无法工作。

关于javascript - 优化Google应用程序脚本以实现自动增量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58405672/

相关文章:

javascript - JSON.parse 在尝试解析转义双引号时抛出语法错误

javascript - if else 语句未按预期工作

date - 从 Apps 脚本 V8 和旧版中的 google 工作表检索到不同的日期值

javascript - 如何根据某些 Id 将值插入到对象中

javascript - AWS Cognito 强制刷新 session

google-apps-script - 提交谷歌表单后自定义确认页面

google-apps-script - 修改某些电子表格时实时更新html内容

google-apps-script - Google 电子表格 - 根据用户类型显示工作表

excel - 如何将Google Analytics(分析)数据导出到Google表格或Excel文件?

javascript - 在主函数内运行 2 个函数