无法将发送至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); } }
关键修复点与注意事项
- 兼容多种请求格式:同时支持Twilio默认的
application/x-www-form-urlencoded和JSON格式,避免因请求类型不匹配导致的解析错误。 - 指定工作表名称:替换代码中的
Sheet1为你实际使用的工作表名称,防止因激活工作表切换导致的数据写入错误。 - 重新部署WebApp:修改代码后必须重新部署:
- 点击Google Apps Script右上角「部署」→「新建部署」
- 选择类型为「Web应用」,权限设置为「任何人,甚至匿名」(Twilio的webhook为匿名请求)
- 复制新生成的部署URL,更新到Twilio沙箱的
When a message comes inwebhook设置中
- Postman测试规范:
- 测试表单请求:选择
form-data或x-www-form-urlencoded,添加From、Body、MessageStatus参数 - 测试JSON请求:选择
raw→JSON,构造如下请求体:{"From": "whatsapp:+123456789", "Body": "测试消息", "MessageStatus": "received"}
- 测试表单请求:选择
- Twilio配置验证:确认沙箱webhook的请求方法为POST,URL为最新的WebApp部署地址,请求格式保持默认的
application/x-www-form-urlencoded即可。
内容的提问来源于stack exchange,提问作者Alex Mukwaya
相关产品推荐
相关产品推荐

