如何用Google Apps Script为Google表单提交行添加递增编号
修正Google Apps Script实现表单提交行自动递增编号
我有一个关联Google Sheet的Google表单,希望给每一条新提交的行在A列添加基于现有最大值的递增编号——新提交行直接获得A列当前最大值的下一个序号。但编写的代码会把编号加到提交行的前一行,而非提交行本身。
原代码如下:
function onFormSubmit(e) { var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); // Replace with the target sheet name var uniqueNumberColumnIndex = 0; // Column A // Calculate the row index of the form response var rowIndex = e.range.getRow(); // Find the maximum unique number in column A var maxUniqueNumber = Math.max.apply(null, targetSheet.getRange(2, uniqueNumberColumnIndex + 1, targetSheet.getLastRow(), 1).getValues().flat()); // Increment the maximum unique number by 1 to get the next unique number maxUniqueNumber++; // Insert a new row at the calculated row index targetSheet.insertRowBefore(rowIndex); // Store the unique number in column A of the new form response row targetSheet.getRange(rowIndex, uniqueNumberColumnIndex + 1).setValue(maxUniqueNumber); }
问题现象:提交两行新数据后,编号会出现在提交行的前置单独行中,而非提交行的A列。
修正方案及代码
错误核心是代码手动在提交行前插入了新行,而表单提交本身会自动新增行,导致编号被写入错误的行。修正后的代码如下:
function onFormSubmit(e) { var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); var uniqueNumberColumnIndex = 0; // 对应A列 var rowIndex = e.range.getRow(); // 获取A列现有数据(从第2行开始,跳过表头) var columnAValues = targetSheet.getRange(2, uniqueNumberColumnIndex + 1, targetSheet.getLastRow() - 1, 1).getValues().flat(); // 处理空列情况,计算当前最大值 var maxUniqueNumber = columnAValues.length > 0 ? Math.max.apply(null, columnAValues) : 0; maxUniqueNumber++; // 直接在提交行的A列写入编号 targetSheet.getRange(rowIndex, uniqueNumberColumnIndex + 1).setValue(maxUniqueNumber); }
关键修改说明
- 移除
insertRowBefore(rowIndex):表单提交会自动在表格末尾添加新行,无需手动插入行。 - 优化最大值计算:当A列无现有数据(首次提交)时,避免
Math.max返回-Infinity的错误,默认设为0。 - 直接写入目标行:将编号直接写入表单提交对应的行(
rowIndex指向的A列),确保编号与提交数据对应。
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

