【问题标题】:Optimizing google app script for implementing auto-increment columns优化谷歌应用脚​​本以实现自动增量列
【发布时间】: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


【解决方案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);
}

但是你必须打开sn-p来查看详细信息,因为没有锁这是行不通的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2022-01-26
    • 2018-03-18
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多