Google Sheets IoT数据记录器循环写入功能故障排查求助
解决ESP32数据循环写入Google Sheets的问题(环形缓冲区)
代码问题分析
你的代码存在两个核心错误:
- 行号获取逻辑错误:
var lastrow = sheet.getRange(sheet.getLastRow(),1).activate写法完全错误,activate()是选中单元格的方法,无法获取行号,正确获取最后一行行号应直接使用sheet.getLastRow()。 - 写入逻辑错误:
appendRow()是在表格末尾追加新行,无法实现覆盖指定行的环形缓冲区效果,你需要直接定位到目标行写入数据。
假设你的表格第1行为表头(如日期、Sensor1、Sensor2),数据行范围是第2到第6行,写满后回到第2行覆盖旧数据。
修正后的代码
var sheet_id = "1SrNCSoqTT2wG__RKSHn51kYcknz8GWy7W9_MTecpKYI"; var sheet_name = "Datalog"; var START_ROW = 2; // 数据起始行(跳过表头) var END_ROW = 6; // 数据结束行 function doGet(e){ // 解析请求参数,添加默认值避免参数缺失报错 var sensor1 = Number(e.parameter.sensor1) || 0; var sensor2 = Number(e.parameter.sensor2) || 0; var date = String(e.parameter.date) || new Date().toLocaleString(); var ss = SpreadsheetApp.openById(sheet_id); var sheet = ss.getSheetByName(sheet_name); var props = PropertiesService.getScriptProperties(); // 获取当前要写入的行号,首次运行默认从START_ROW开始 var currentRow = parseInt(props.getProperty("currentRow")) || START_ROW; // 写入数据到指定行 sheet.getRange(currentRow, 1, 1, 3).setValues([[date, sensor1, sensor2]]); // 更新下一次写入的行号:写满END_ROW后回到START_ROW,否则行号+1 currentRow = currentRow >= END_ROW ? START_ROW : currentRow + 1; props.setProperty("currentRow", currentRow); // 返回写入结果,方便ESP32端验证 return ContentService.createTextOutput("Data written to row " + (currentRow === START_ROW ? END_ROW : currentRow - 1)); }
关键改进点
- 使用
PropertiesService记录当前写入行号,避免依赖getLastRow()(空行或删除数据会导致行号判断失效) - 用
getRange().setValues()直接覆盖指定行,实现环形缓冲区逻辑 - 增加参数默认值,避免因请求参数缺失导致代码报错
- 返回明确的写入结果,便于ESP32端确认数据是否写入成功
HTTP触发器调试方法
- 模拟请求测试:在脚本编辑器中新建测试函数,手动模拟
e参数:
function testDoGet() { var e = { parameter: { sensor1: "25.5", sensor2: "60", date: new Date().toLocaleString() } }; doGet(e); }
点击运行按钮直接执行,随后查看表格数据是否正确写入。
查看执行日志:每次触发
doGet后,点击脚本编辑器右上角的「执行记录」,可查看每一步的执行详情。若需要更详细的日志,可在代码中添加Logger.log("当前写入行号:" + currentRow);,再到执行记录中查看日志内容。手动URL测试:部署Web应用后,复制触发URL,在浏览器中手动拼接参数测试,例如:
https://script.google.com/macros/s/你的部署ID/exec?sensor1=26&sensor2=65&date=2024-05-20%2010:30:00
查看返回内容和表格数据是否匹配预期。
内容的提问来源于stack exchange,提问作者jrive
相关产品推荐
相关产品推荐

