Ошибка с Woocommerce Webhook и Google Sheet API?

#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 Спасибо за ответ. Я рад, что ваша проблема была решена. И вам спасибо.