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

Я установил связь между заказами 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?

Обратите внимание, что я не разработчик, я нашел этот скрипт в Интернете и сам настроил его для своих нужд.

Как убрать количество товаров в категории WooCommerce
Как убрать количество товаров в категории WooCommerce
По умолчанию WooCommerce показывает количество товаров рядом с категорией, как показано ниже.
1
0
350
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Точки модификации:

  • Когда лист Google Spreadsheet использует базовый фильтр, когда значения помещаются с помощью 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);
    }
  }
}

Примечание:

  • Когда вы изменили сценарий веб-приложений, повторно разверните веб-приложения как новую версию. При этом последний сценарий отражается в веб-приложениях. Пожалуйста, будьте осторожны с этим.

Использованная литература:

Привет @Tanaike, большое спасибо, твой вклад помог! Просто чтобы вы знали, новые данные добавляются даже в фильтрованном виде, но это даже лучше! Спасибо!

Okkx 21.12.2020 11:40

@Okkx Спасибо за ответ. Я рад, что ваша проблема была решена. И тебе спасибо.

Tanaike 21.12.2020 12:47

Другие вопросы по теме