在此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
}
}
}
答案 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")
以避免函数和公式中出现意外结果。