解决Google App Script无返回&订单延迟同步至谷歌表格问题
问题修复方案
一、解决WooCommerce日志错误「The script completed but did not return anything」
该错误是因为doPost函数未返回HTTP响应,WooCommerce Webhook要求请求完成后必须收到明确响应(如200状态码),否则判定为异常。同时原脚本存在JSON解析的语法错误,需一并修正:
修改后的完整doPost函数:
//this is a function that fires when the webapp receives a POST request function doPost( e ) { try { // 移除原代码中多余的[],避免JSON解析错误 var myData = JSON.parse(e.postData.getDataAsString()); var order_number = myData.number; var order_created = myData.date_created; var billing_company = myData.billing.company; var notes = myData.customer_note; var sheet = SpreadsheetApp.getActiveSheet(); var values = []; for ( var i = 0; i < myData.line_items.length; i++ ) { var product_sku = myData.line_items[ i ].sku; var product_name = myData.line_items[ i ].name; var product_qty = myData.line_items[ i ].quantity; values.push( [ product_name, billing_company, product_qty, notes, order_created, order_number, product_sku ] ); } // 仅当有数据时执行写入,避免空行 if(values.length > 0) { sheet.getRange( sheet.getLastRow() + 1, 1, values.length, values[0].length ).setValues( values ); } // 刷新表格筛选器 var filter = sheet.getFilter(); if ( filter ) { var range = filter.getRange(); for ( var i = range.getColumn(), maxCol = range.getLastColumn(); i <= maxCol; i++ ) { var filterCriteria = filter.getColumnFilterCriteria( i ) if ( filterCriteria ) { filter.setColumnFilterCriteria( i, filterCriteria ); } } } // 返回成功响应,告知WooCommerce请求已处理完成 return ContentService.createTextOutput(JSON.stringify({status: "success"})).setMimeType(ContentService.MimeType.JSON); } catch(error) { // 捕获错误并返回信息,方便调试 return ContentService.createTextOutput(JSON.stringify({status: "error", message: error.toString()})).setMimeType(ContentService.MimeType.JSON); } }
核心修改点:
- 移除
JSON.parse外层的[]:原写法会把请求字符串包裹成数组解析,导致后续属性读取失败 - 添加
try-catch块:捕获执行错误并返回详情,便于排查问题 - 新增响应返回:通过
ContentService返回JSON格式的成功/错误状态,满足Webhook的响应要求
二、解决订单需手动刷新才同步的问题(兼容Siteground Optimizer)
Siteground Optimizer的缓存会拦截Webhook请求,需通过以下配置排除相关路径和请求类型:
1. 排除Webhook相关URL
在Siteground Optimizer的缓存设置中,找到「排除URL」选项,添加:
/?wc-api=WC_Webhook(WooCommerce Webhook默认触发路径)- 你的谷歌脚本Web App完整URL(如
https://script.google.com/macros/s/xxxx/exec)
2. 禁用POST请求缓存
进入插件的动态缓存设置,勾选「不缓存POST请求」,确保WooCommerce发送的Webhook POST请求不会被缓存拦截。
3. 验证Webhook配置
在WooCommerce后台「设置 > 高级 > Webhook」中,编辑同步订单的Webhook:
- 设置「交付方式」为
POST - 设置「有效负载版本」为
WP REST API v2 - 点击「测试」按钮,确认谷歌表格能收到测试数据,同时WooCommerce日志无报错
额外注意事项
- 确保谷歌脚本Web App部署时,「执行权限」设置为「任何人,甚至匿名」,否则WooCommerce的请求会被拒绝
- 修改配置后可手动清除Siteground Optimizer的缓存,再测试新订单同步情况
内容的提问来源于stack exchange,提问作者ArBaldryan
相关产品推荐
相关产品推荐

