ESP32与Google Sheet通信问题:可写入但无法读取,求技术建议
解决ESP32读取Google Sheet数据的问题
看起来你的代码执行到一半就卡住了,只输出一次"GS1"就没了下文,大概率是WiFi连接没处理妥当或者HTTPS请求环节出了阻塞问题。我给你一步步拆解问题并给出修复方案:
1. 先补上WiFi连接的等待逻辑
你的setup()里直接调用WiFi.begin()后就初始化HTTPS客户端,但WiFi连接需要时间,很可能还没连上就执行了后续操作,直接导致后续步骤失败并卡住。先加上WiFi连接等待的逻辑:
void setup(){ Serial.begin(115200); // 先打开串口,方便调试输出 WiFi.begin(ssid, password); // 等待WiFi连接成功,避免后续操作提前执行 while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected successfully"); Serial.println("Local IP: " + WiFi.localIP().toString()); // 初始化HTTPS客户端 client = new HTTPSRedirect(httpsPort); client->setPrintResponseBody(true); client->setContentTypeHeader("application/json"); // 必须检查HTTPS连接是否成功 if (!client->connect(host, httpsPort)) { Serial.println("HTTPS connection to Google Script failed!"); while(1); // 连接失败时卡住,方便排查问题 } Serial.println("HTTPS connected to Google Script"); }
2. 修复loop中的GET请求逻辑
你的loop()里URL构造有多余的&,而且没有处理连接断开的情况,一旦连接中断就会直接卡住。另外要增加请求返回状态的检查:
void loop() { // 先检查WiFi和HTTPS连接是否正常,异常时自动重连 if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi disconnected, reconnecting..."); WiFi.reconnect(); while (WiFi.status() != WL_CONNECTED) delay(500); // 重新建立HTTPS连接 if (!client->connect(host, httpsPort)) { Serial.println("HTTPS reconnection failed"); delay(2000); return; } } // 修正URL格式,去掉多余的&,给id参数一个测试值 String url3 = String("/macros/s/") + GScriptId + "/exec?id=test_data"; Serial.println("GS1"); // 执行GET请求并验证结果 if (client->GET(url3, host)){ int httpCode = client->getResponseCode(); Serial.print("GET SUCCESS, HTTP code: "); Serial.println(httpCode); // 读取并打印响应体,方便查看返回的数据 String response = client->getResponseBody(); Serial.println("Response data: " + response); } else { Serial.println("GET FAILED"); // 尝试重新连接HTTPS client->connect(host, httpsPort); } Serial.println("GS2"); delay(4000); }
3. 检查Google Apps Script的配置
这是最容易忽略的关键环节,你的脚本必须正确处理GET请求并返回数据:
- 打开你的Google Apps Script,确保包含处理GET请求的函数,示例如下:
function doGet(e) { // 替换成你的Google Sheet ID和工作表名称 var sheet = SpreadsheetApp.openById("你的Sheet ID").getSheetByName("Sheet1"); var allData = sheet.getDataRange().getValues(); // 将表格数据转为JSON格式返回 return ContentService.createTextOutput(JSON.stringify(allData)) .setMimeType(ContentService.MimeType.JSON); }
- 部署脚本时,选择新部署,类型选"Web应用",执行权限设为"我自己",访问权限选"任何人,甚至匿名"(测试阶段先这么设置,后续再调整权限),然后复制部署后URL中
/macros/s/后面的字符串作为你的GScriptId填入ESP32代码。
4. 实用调试技巧
- 确保串口监视器的波特率和代码里的
Serial.begin(115200)一致; - 在关键步骤增加
Serial.println()输出,比如在client->GET()前后打印更多状态信息,定位具体卡住的环节; - 直接在浏览器中访问你的脚本URL(比如
https://script.google.com/macros/s/你的GScriptId/exec?id=test_data),如果浏览器都无法正常返回JSON数据,那问题肯定出在Google Apps Script的配置上。
内容的提问来源于stack exchange,提问作者user1430445
相关产品推荐
相关产品推荐

