Я установил связь между заказами 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 Sheet, скажем, для способа оплаты, выбирая «PayPal», новый заказ не будет заполнять таблицу Google Sheet.
Они зарегистрированы в плагине woocommerce, оплата проходит, все хорошо, только Google Sheet не получает заказ.
Даже после удаления фильтра он не появляется.
Все следующие заказы появятся, если все фильтры отключены в Google Таблице.
Итак, есть проблема с фильтрами Google Sheet, но я не знаю, в чем ее причина. Это мой сценарий? Это вина Google API? Вебхук Woocommerce?
Обратите внимание, что я не разработчик, я нашел этот скрипт в Интернете и сам настроил его для своих нужд.
appendRow()
, значения не добавляются. Это может быть текущая спецификация.
appendRow()
, а appendRow()
используется в цикле. В этом случае стоимость процесса скрипта станет немного выше. При использовании setValues()
эту проблему также можно устранить.setValues()
. Когда используется setValues()
, значения могут быть помещены в отфильтрованный лист. Но когда значения помещаются на отфильтрованный лист, отфильтрованный лист не изменяется, пока значения помещаются.Когда вышеуказанные пункты отражаются на вашем сценарии, он становится следующим.
Пожалуйста, измените ваш сценарий следующим образом.
From: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]); }
To:
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);
}
}
}
@Okkx Спасибо за ответ. Я рад, что ваша проблема была решена. И тебе спасибо.
Привет @Tanaike, большое спасибо, твой вклад помог! Просто чтобы вы знали, новые данные добавляются даже в фильтрованном виде, но это даже лучше! Спасибо!