WooCommerce订单推送至Google Sheets时Google Script触发报错如何解决
WooCommerce webhook同步Google Sheets报错修复方案
代码中存在的核心错误
- JSON解析写法错误:
JSON.parse([e.postData.contents])多了一层数组包裹,JSON.parse接收的参数必须是字符串,不需要加[],否则会导致解析失败。 - 变量未声明:代码中循环累加
total前没有初始化该变量,会抛出未定义错误。 - 数组长度调用错误:数组长度是属性不是方法,
myData.line_items.length()和myData.fee_lines.length()要去掉末尾的括号,改为.length,否则会报「不是函数」的错误。 - WooCommerce字段取值路径错误:订单的姓名数据存储在billing对象下,直接取
myData.first_name、myData.last_name会得到undefined,需要改为myData.billing.first_name和myData.billing.last_name。 - 空值无兜底:如果
address_2、customer_note等字段为空,拼接时会出现undefined,需要增加空值兜底处理。 - 语法冗余:appendRow参数末尾多余的逗号可能在部分运行环境下引发异常,建议删除。
额外配置检查项
- Google Apps Script部署时必须满足两个条件:执行身份选择「我(你的账号)」,访问权限设置为「任何人,甚至匿名用户」,否则WooCommerce的webhook请求会被权限拦截返回403。
- 每次修改代码后必须重新部署新版本的Web App,直接保存代码不会更新已部署的线上版本。
修复后的完整代码
// GET请求响应函数 function doGet(e) { return HtmlService.createHtmlOutput("request received"); } // POST请求响应函数(处理WooCommerce webhook数据) function doPost(e) { // 修复JSON解析写法 var myData = JSON.parse(e.postData.contents); var order_number = myData.number; var order_address = myData.billing.address_1 || ''; var item = ""; // 初始化total变量 var total = 0; var url = "https://fivestars-delivery.com/mon-compte//driver-dashboard/?orderid=" + order_number; // 修复数组长度调用方式 for (var i = 0; i < myData.line_items.length; ++i) { item += myData.line_items[i].product_id + "\n"; total += parseInt(myData.line_items[i].total || 0); } var fees = ""; // 修复数组长度调用方式 for (var i = 0; i < myData.fee_lines.length; ++i) { fees += (myData.fee_lines[i].amount || '') + " " + (myData.fee_lines[i].name || '') + " - " + (myData.fee_lines[i].total || '') + "\n"; } var discount = myData.discount_total || 0; // 修复姓名取值路径,增加空值兜底 var nomClient = (myData.billing.first_name || '') + " " + (myData.billing.last_name || ''); var order_total = myData.total || 0; var payment_method = myData.payment_method_title || ''; var phone = myData.billing.phone || ''; // 增加空值兜底 var note = (myData.billing.address_2 || '') + "\n" + (myData.customer_note || ''); var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 移除末尾多余逗号 sheet.appendRow([order_number, " ", " ", " ", order_address, " ", "Attente d'envoi", url, order_total, payment_method, nomClient, phone, note, item + fees + discount]); // 返回正常响应避免webhook判定推送失败 return ContentService.createTextOutput(JSON.stringify({"status":"success"})).setMimeType(ContentService.MimeType.JSON); }
验证建议
你可以先复制一份WooCommerce的订单JSON示例,用接口测试工具直接POST到你的Web App地址,同时查看Apps Script的「执行」日志,就能快速定位剩余的异常问题。
内容的提问来源于stack exchange,提问作者Tom Haneuse
相关产品推荐
相关产品推荐

