Google表格自动递增ID /主键

时间:2019-04-03 16:25:51

标签: google-apps-script google-sheets

在此Google工作表功能中,主键会在更改时自动添加到第一列。此功能的问题在于,尽管添加了新行,但该行中的其他单元格为空,但下面的行也获得了主键。

如何修改此功能,以便仅在右侧第一个单元格(单元格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
    }
  }
}

4 个答案:

答案 0 :(得分: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++);
    }
  }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

{
  "status": 200,
  "error": null,
  "message": null,
  "result": {
    "data": [{
        "SuraID": 116,
        "ChapterID": 2,
        "SuraName": "The bufallow",
        "Sajda": 0,
        "Ayah": 286,
        "Latin": "Al-Baqara",
        "AyahText": [{
            "id": 6283,
            "text": "O children of Israel, remember the favours I bestowed on you. So keep your pledge to Me, and I will mine to you, and be fearful of Me, ",
            "found": "1"
          },
          {
            "id": 6290,
            "text": "Remember, O children of Israel, the favours I bestowed on you, and made you exalted among the nations of the world. ",
            "found": "1"
          }
        ]
      }
      "totalFound": 598,
      "prev_page_url": "2",
      "next_page_url": 3,
      "totalPages": 27,
      "percentage": 0.38390180331131357
    }

答案 3 :(得分:0)

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

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

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

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