HTML表单提交至Google Sheet:实现跳过空行写入数据
解决Google Apps Script写入表单数据到空白行后的问题
你的问题出在两个地方:表头获取代码错误,以及**getLastRow()会包含有格式或曾编辑过的空白行**,导致写入位置异常。以下是修正后的完整代码:
const sheetName = 'datapokokbaru' const scriptProp = PropertiesService.getScriptProperties() function initialSetup () { const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet() scriptProp.setProperty('key', activeSpreadsheet.getId()) } function doPost (e) { const lock = LockService.getScriptLock() lock.tryLock(10000) try { const doc = SpreadsheetApp.openById(scriptProp.getProperty('key')) const sheet = doc.getSheetByName(sheetName) // 修复:正确获取第一行的表头(替换原错误的filter代码) const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] // 关键:找到第一列最后一个非空行(适配你的arrayformula唯一编号列) const lastNonEmptyRows = sheet.getRange('A:A').getValues().flat().filter(cell => cell.toString().trim() !== "") const nextRow = lastNonEmptyRows.length + 1 const newRow = headers.map(function(header) { return header === 'timestamp' ? new Date() : e.parameter[header] }) sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]) return ContentService .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow })) .setMimeType(ContentService.MimeType.JSON) } catch (e) { return ContentService .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e })) .setMimeType(ContentService.MimeType.JSON) } finally { lock.releaseLock() } }
关键修改说明:
- 修复表头获取:原代码中
sheet.filter(...)是错误的——sheet是Sheet对象,不是数组,无法直接使用filter方法。改用getRange获取第一行的所有表头列,这才是正确的方式。 - 精准定位最后非空行:
- 我们通过获取A列(你的唯一编号列)的所有值,过滤掉空单元格,得到非空行的数量。
- 因为表头在第1行,所以
lastNonEmptyRows.length就是最后一个有内容的行号,加1就是新数据要写入的行位置。 - 这种方式不受表格中空白格式行的影响,能准确找到真正的最后数据行。
如果你的唯一编号不在A列,只需把代码中的'A:A'替换为对应列的范围(比如'B:B')即可。
内容的提问来源于stack exchange,提问作者Abdurrasyiid Alaik Sander
相关产品推荐
相关产品推荐

