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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:01:11