【问题标题】:Google sheet Auto-incrementing ID/Primarykey谷歌表自动递增 ID/主键
【发布时间】:2019-04-03 16:25:50
【问题描述】:

在这个 google sheet 函数中,主键会在更改时自动添加到第一列。此函数的问题在于,当添加新行时,尽管该行中的其他单元格为空白,但下面的行也会获得主键。

如何修改此函数,以便仅在右侧第一个单元格(单元格 B)不为空时添加主键?

function myFunction() {

  var AUTOINC_COLUMN = 0;
  var HEADER_ROW_COUNT = 1;

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var worksheet   = spreadsheet.getSheetByName("Sheet1");
  var rows        = worksheet.getDataRange().getNumRows();
  var vals        = worksheet.getSheetValues(1, 1, rows+1, 2);

  for (var row = HEADER_ROW_COUNT; row < vals.length; row++) {
    try {
      var id = vals[row][AUTOINC_COLUMN];
      Logger.log(id);Logger.log((""+id).length ===0);
      if ((""+id).length === 0) {
        // Here the columns & rows are 1-indexed
        worksheet.getRange(row+1, AUTOINC_COLUMN+1).setValue(row);
      }
    } catch(ex) {
      // Keep calm and carry on
    }
  }
}

【问题讨论】:

  • 您的问题不清楚。您没有提供足够的信息。 主键在更改时自动添加到第一列 这是什么意思?您也不会说您的数据是数字还是文本。拥有电子表格的副本会很有帮助。然而,作为一个在黑暗中的刺,试试这个:在 id:var col2 = vals[row][1]; 之后添加一个变量,然后使用这个新行来评估它们if(id.length !=0 &amp;&amp; col2.length!=0){。因此,如果 id 不为空且 col2 不为空,则可以添加密钥。如果任一值是字符串,则简单更改为 id.toString().length 等。

标签: google-apps-script google-sheets


【解决方案1】:

我不会为此使用脚本,只需在 A2 中输入,然后一直复制下来。在单元格 A1 中放置一个 0(或 100,无论您希望它从哪里开始)。

=if(B2="","",A1+1)

【讨论】:

  • 简单而完美。谢谢
  • 如果前一行已被删除,则会产生引用错误
【解决方案2】:

只是想我会添加我的答案。我不会使用公式,因为如果您对工作表进行排序,它将重新计算(如果您在其他地方引用主键则不好)。另一种基于代码的解决方案假定记录只会添加到工作表的末尾,并且最后一行是最高的主键(即,如果您使用工作表,最终会出现重复的键)。

无论您在何处插入记录或如何对数据进行排序,此代码都将起作用。 它确实假定您永远不会删除具有最高主键的行(删除小于最高主键的行不会有问题)。

function auto_increment_column() {
  const AUTO_INCREMENT_SHEET = "Sheet1";

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AUTO_INCREMENT_SHEET);

  var nextIncrementValue = Math.max.apply(Math, sheet.getRange("A:A").getValues().flat().filter(e => !isNaN(parseFloat(e))))

  var rows = sheet.getRange("A:B");

  for(var i = 1; i <= rows.getNumRows(); i++) {
    var cellA = rows.getCell(i, 1);
    var cellB = rows.getCell(i, 2);

    if(cellA.getValue() === "" && cellB.getValue() !== "") {
      cellA.setValue(nextIncrementValue++);
    }
  }
}

【讨论】:

  • 这似乎正是我正在寻找的,但我不明白如何在我的工作表中提供此功能。我创建了一个 Apps 脚本项目并添加了代码……但 Google 的文档让我从那里迷惑不解。任何指导表示赞赏!
  • 有几种方法可以做到这一点。您可以在您的项目中设置一个可安装的 onedit 触发器,以便在编辑电子表格时运行该功能,使用 onEdit 简单触发器(这个有时可能很挑剔,因为它需要编辑用户授权脚本),使用 on load 触发器设置菜单项(您必须从菜单运行该功能。当工作表被编辑时,它不会是自动的),或者,最后,您可以从项目屏幕运行代码(这绝对是最不方便的)。
【解决方案3】:

您可能正在寻找这样的东西:

function auto_increment_col() {
  var AUTOINC_COLUMN = 1;
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var worksheet   = spreadsheet.getActiveSheet();
  var last_row        = worksheet.getLastRow();
  var last_inc_val = worksheet.getRange(last_row, AUTOINC_COLUMN).getValue();

  //if auto_inc column is blank and the column next to auto_inc column is not blank, then assume its a new row
  var is_new_row = last_inc_val == "" && worksheet.getRange(last_row, AUTOINC_COLUMN+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, AUTOINC_COLUMN).getValue();
    worksheet.getRange(last_row, AUTOINC_COLUMN).setValue(prev_inc_val+1);
  }
}

【讨论】:

    【解决方案4】:

    公式
    =ARRAYFORMULA(sequence(match(2,1/(B:B&lt;&gt;""),1),1,0,1))
    输入单元格 A1 将自动将 A 列增加到 B 列中包含某些值的最后一个单元格。

    我在表单响应页面的单元格 A1 中使用它,因为它是自动的。新行不可能超过我的自动增量计数,因为我没有将公式拖得足够远。

    上面的公式控制行、列、起始值和步长值。更多信息:infoinspired.com

    注意:使用
    =if(C2="","","value if false")等公式在B列中插入单元格值将始终被计算在内。
    " ""value if false" 都计算为一个包含某些内容的单元格。
    使用“”表示空白或空是不正确的。
    请改用=if(C2="",,"value if false") 以避免函数和公式中出现意外结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2013-09-28
      • 2017-02-10
      • 2011-04-26
      • 2010-12-09
      相关资源
      最近更新 更多