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

无法将发送至Twilio的WhatsApp消息存储到Google Sheets求助

问题分析与解决方案

错误提示SyntaxError: Unexpected token 'S', "SmsMessage"... is not valid JSON表明你的代码尝试将x-www-form-urlencoded格式的请求体当作JSON解析,而Twilio发送的WhatsApp webhook默认使用表单格式,导致JSON解析失败。结合你的代码和测试场景,以下是具体修复方案:

修正后的Google Apps Script代码

function doPost(e) {
  // 指定目标工作表名称(替换为你实际使用的表名)
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  if (!sheet) {
    Logger.log("指定的工作表不存在");
    return ContentService.createTextOutput("Internal error: Sheet not found").setMimeType(ContentService.MimeType.TEXT);
  }

  try {
    let from, body, status;
    const contentType = e.postData.type;

    // 兼容JSON和表单两种请求格式
    if (contentType === "application/json") {
      const data = JSON.parse(e.postData.contents);
      from = data.From || "Unknown";
      body = data.Body || "No message content";
      status = data.MessageStatus || "No status";
    } else if (contentType === "application/x-www-form-urlencoded") {
      from = e.parameter.From || "Unknown";
      body = e.parameter.Body || "No message content";
      status = e.parameter.MessageStatus || "No status";
    } else {
      throw new Error(`不支持的请求格式: ${contentType}`);
    }

    // 记录解析到的参数
    Logger.log(`Parsed parameters - From: ${from}, Body: ${body}, Status: ${status}`);

    // 将数据写入Google Sheets
    sheet.appendRow([new Date(), from, body, status]);
    Logger.log("数据已成功写入Google Sheets");

    return ContentService.createTextOutput("Message received").setMimeType(ContentService.MimeType.TEXT);
  } catch (error) {
    Logger.log(`错误信息: ${error.message}`);
    Logger.log(`错误堆栈: ${error.stack}`);
    return ContentService.createTextOutput(`Error processing request: ${error.message}`).setMimeType(ContentService.MimeType.TEXT);
  }
}

关键修复点与注意事项

  1. 兼容多种请求格式:同时支持Twilio默认的application/x-www-form-urlencoded和JSON格式,避免因请求类型不匹配导致的解析错误。
  2. 指定工作表名称:替换代码中的Sheet1为你实际使用的工作表名称,防止因激活工作表切换导致的数据写入错误。
  3. 重新部署WebApp:修改代码后必须重新部署:
    • 点击Google Apps Script右上角「部署」→「新建部署」
    • 选择类型为「Web应用」,权限设置为「任何人,甚至匿名」(Twilio的webhook为匿名请求)
    • 复制新生成的部署URL,更新到Twilio沙箱的When a message comes in webhook设置中
  4. Postman测试规范:
    • 测试表单请求:选择form-data或x-www-form-urlencoded,添加From、Body、MessageStatus参数
    • 测试JSON请求:选择raw→JSON,构造如下请求体:
      {"From": "whatsapp:+123456789", "Body": "测试消息", "MessageStatus": "received"}
      
  5. Twilio配置验证:确认沙箱webhook的请求方法为POST,URL为最新的WebApp部署地址,请求格式保持默认的application/x-www-form-urlencoded即可。

内容的提问来源于stack exchange,提问作者Alex Mukwaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:44:52