wordpress - 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 网络钩子?
请注意,我不是开发人员,我在网上找到了这个脚本,并根据自己的需要尝试和猜测对其进行了调整。
解决方案
修改点:
- 当 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 应用程序中。请注意这一点。
参考:
推荐阅读
- python - 在 scikit-learn 中选择特征子集进行训练
- javascript - 我正在尝试复制条带格式或仅适用于可见数据,Google Sheets Script
- asp.net - Razor 中数组的唯一字段名称
- pandas - 读取文件,其中分隔符在文件本身内使用 read_csv 更改
- angular - 无论如何要恢复在 ag-grid-community V20 中引入的多标题组显示更改?
- python - 如何处理 Cv2/.dylibs/QTGui 和 LibQcocoa/LibQt5Print Support 中实现的类?
- python - 重复表单数据到 Django 表单
- postgresql - 尝试创建表忽略或未执行 postgresql
- mysql - 如果不存在则插入不插入
- regex - 要捕获的正则表达式:word {word} word