You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:17:13