#wordpress #google-apps-script #google-sheets
#wordpress #google-apps-script #google-sheets
Вопрос:
Я установил связь между заказами 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 Sheet.
Итак, есть проблема с фильтрами Google Sheet, но я не знаю, что ее вызывает. Это мой скрипт? Это ошибка Google API? Woocommerce webhook?
Пожалуйста, обратите внимание, что я не разработчик, я нашел этот скрипт в Интернете и сам его переделал, попробовав и угадав для своих нужд.
Ответ №1:
Точки модификации:
- Когда лист электронной таблицы 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);
}
}
}
Примечание:
- Когда вы изменили сценарий веб-приложений, пожалуйста, повторно разверните веб-приложения как новую версию. Таким образом, последний скрипт отображается в веб-приложениях. Пожалуйста, будьте осторожны с этим.
Ссылки:
Комментарии:
1. Привет, @Tanaike, большое спасибо, ваш вклад сделал свое дело! Просто чтобы вы знали, новые данные добавляются даже в отфильтрованном виде, но это даже лучше! Спасибо!
2. @Okkx Спасибо за ответ. Я рад, что ваша проблема была решена. И вам спасибо.