首页 > 解决方案 > Woocommerce Webhook 和 Google Sheet API 的错误?

问题描述

我已经在 Woocommerce 订单(我们用于非政府组织的 WordPress 电子商务插件)和在 Google Sheet 的脚本编辑器中使用此脚本的 Google Sheet 表之间建立了一个链接:

 //this is a function that fires when the webapp receives a GET request
function doGet(e) {
  return HtmlService.createHtmlOutput("request received");
}

//this is a function that fires when the webapp receives a POST request
function doPost(e) {
var myData = JSON.parse([e.postData.contents]);
var order_number = myData.number;
var order_created = myData.date_created;
var order_status = myData.status;
var order_total = myData.total;
var billing_first_name = myData.billing.first_name;
var billing_last_name  = myData.billing.last_name;
var billing_email = myData.billing.email;
var billing_phone = myData.billing.phone;
var shipping_first_name = myData.shipping.first_name;
var shipping_last_name = myData.shipping.last_name;
var shipping_address_1 = myData.shipping.address_1;
var shipping_address_2 = myData.shipping.address_2;
var shipping_postcode = myData.shipping.postcode;
var shipping_city = myData.shipping.city;
var shipping_country = myData.shipping.country;
var payment_method = myData.payment_method_title;
var currency = myData.currency;
var timestamp = new Date();

var sheet = SpreadsheetApp.getActiveSheet();
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 order_status       = myData.status;
var product_qty = myData.line_items[i].quantity;
var product_total = myData.line_items[i].total;
sheet.appendRow([order_created,order_number,order_status,payment_method,product_name,product_sku,product_qty,product_total,order_total,currency,billing_first_name,billing_last_name,billing_phone,billing_email,shipping_first_name,shipping_last_name,shipping_address_1,shipping_address_2,shipping_postcode,shipping_city,shipping_country]); }
}

一切都按预期工作,几秒钟后,每个新订单都会填充到 Google Sheet 表中。

但是,当我在 Google 表格中的任何列上应用过滤器时,假设付款方式选择“PayPal”,没有新订单将填充 Google 表格的表格。
他们在 woocommerce 插件中注册,付款正常,一切正常,除了 Google Sheet 没有收到订单。即使删除过滤器后,它也不会出现。

如果在 Google 表格中停用所有过滤器,则会显示所有下一个订单。

因此,Google Sheet 过滤器存在问题,但我不知道是什么原因造成的。是我的剧本吗?是 Google API 的错吗?Woocommerce 网络钩子?

请注意,我不是开发人员,我在网上找到了这个脚本,并根据自己的需要尝试和猜测对其进行了调整。

标签: wordpressgoogle-apps-scriptgoogle-sheets

解决方案


修改点:

  • 当 Google 电子表格的工作表使用基本过滤器时,当使用 放置appendRow()值时,不附加值。这可能是当前的规范。
    • 我认为这可能是您的问题的原因。
    • 在您的脚本中,这些值使用appendRow(), 并appendRow()在循环中使用。在这种情况下,脚本的处理成本会变得有点高。使用时setValues(),也可以消除此问题。
  • 在这种情况下,我想建议使用setValues(). 使用时setValues(),可以将值放入过滤表。但是,当将值放入过滤表时,过滤表在放入值时不会更改。
  • 因此需要在输入值后刷新基本过滤器。

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

请按如下方式修改您的脚本。

从:
var sheet = SpreadsheetApp.getActiveSheet();
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 order_status       = myData.status;
var product_qty = myData.line_items[i].quantity;
var product_total = myData.line_items[i].total;
sheet.appendRow([order_created,order_number,order_status,payment_method,product_name,product_sku,product_qty,product_total,order_total,currency,billing_first_name,billing_last_name,billing_phone,billing_email,shipping_first_name,shipping_last_name,shipping_address_1,shipping_address_2,shipping_postcode,shipping_city,shipping_country]); }
到:
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 order_status = myData.status;
  var product_qty = myData.line_items[i].quantity;
  var product_total = myData.line_items[i].total;
  values.push([order_created,order_number,order_status,payment_method,product_name,product_sku,product_qty,product_total,order_total,currency,billing_first_name,billing_last_name,billing_phone,billing_email,shipping_first_name,shipping_last_name,shipping_address_1,shipping_address_2,shipping_postcode,shipping_city,shipping_country]);
}

// Put values using "setValues".
sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);

// Refresh basic filter.
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);
    }
  }
}

笔记:

  • 当您修改 Web Apps 的脚本时,请将 Web Apps 重新部署为新版本。这样,最新的脚本就会反映到 Web 应用程序中。请注意这一点。

参考:


推荐阅读