Error con Woocommerce Webhook y Google Sheet API?

He establecido un vínculo entre las órdenes de Woocommerce (un plugin de comercio electrónico para WordPress que utilizamos para nuestra ONG), y una tabla de Google Sheet usando este script en el editor de script de 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]); }
}

Todo funciona como está previsto, cada nuevo orden se pobla en la tabla de hojas de Google unos segundos más tarde.

Sin embargo, cuando aplico un filtro en cualquier columna en Google Sheet, digamos para el método de pago, seleccionando "PayPal", ningún nuevo orden populará la tabla de Google Sheet.
Están inscritos en el plugin de woocommerce, el pago está bien, todo está bien, excepto que Google La hoja no recibe la orden. Incluso después de quitar el filtro, no aparece.

Todos los próximos pedidos aparecerán si todos los filtros están desactivados en la Hoja de Google.

Por lo tanto, hay un problema con los filtros de Hoja de Google, pero no sé qué está causando. ¿Es mi guión? ¿Es culpa de Google API? Woocommerce webhook?

Por favor tenga en cuenta que no soy un desarrollador, encontré este script en línea y lo dibujé yo mismo intentando adivinar mis propias necesidades.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por codeglitch


3 Respuestas:

  • Puntos de modificación:

    • Cuando la hoja de Google Spreadsheet utiliza el filtro básico, cuando los valores se ponen utilizando appendRow(), los valores no se anexan. Esta podría ser la especificación actual.
      • Pensé que esto podría ser la razón de su problema.
      • En su script, los valores se ponen usando appendRow(), y appendRow() se utiliza en un bucle. En este caso, el costo del proceso del script se convertirá en un poco alto. Cuando setValues() se utiliza, este problema también se puede eliminar.
    • En este caso, me gustaría proponer incluir los valores usando setValues(). Cuando setValues() se utiliza, los valores se pueden poner en la hoja filtrada. Pero, cuando los valores se ponen en la hoja filtrada, la hoja filtrada no se cambia mientras se ponen los valores.
    • Así que es necesario refrescar el filtro básico después de que se ponen los valores.

    Cuando los puntos anteriores se reflejan en su script, se convierte en el siguiente.

    script modificado:

    Por favor, modifique su script como sigue.

    De:
    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]); }
    
    A:
    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);
        }
      }
    }
    

    Nota:

    • Cuando modificó el script de Aplicaciones Web, por favor vuelva a implementar las aplicaciones Web como nueva versión. Por esto, el último script se refleja en las aplicaciones web. Por favor, ten cuidado.

    Referencias:

    Respondida el Dec 18, 2020 a las 13:43 - por algorithmadeptc6cb

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando podría estar relacionado con la forma en que estás filtrando los datos en Google Sheets y cómo el script de Google Apps Script maneja esos filtros.

    Cuando aplicas un filtro en Google Sheets, lo que haces es ocultar temporalmente las filas que no cumplen con ciertos criterios. Esto puede afectar la forma en que el script de Google Apps Script interactúa con los datos en la hoja de cálculo.

    Una posible solución sería modificar tu script para que incluya la lógica necesaria para considerar las filas ocultas cuando se realiza la escritura de datos en la hoja de cálculo. De esta manera, los datos de los nuevos pedidos deberían seguir siendo escritos en la hoja de cálculo incluso si se aplican filtros.

    Aquí te dejo un ejemplo de cómo podrías modificar tu script para tener en cuenta las filas ocultas al escribir los datos en la hoja de cálculo:

    javascript
    var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
    var values = range.getValues();
    for (var i = 0; i < myData.line_items.length; i++) {
      var row = [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];
    
      // Check if row is not hidden by filter
      if (values.length === 0 || values.every(function(value) {return value[0] === ""})) {
        sheet.appendRow(row);
      }
    }
    

    Prueba a incorporar esta modificación en tu script y verifica si los nuevos pedidos se siguen registrando correctamente en la hoja de cálculo incluso cuando se aplican filtros.

    Respondida el Dec 19, 2020 a las 13:42 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Posibles causas del problema:

    Conflicto de filtro: Cuando se aplica un filtro en Google Sheet, solo se muestran las filas que cumplen con los criterios del filtro. Si la fila que contiene el nuevo pedido no cumple con el filtro (por ejemplo, el método de pago no es "PayPal"), no será visible. Error en el script: Es posible que haya un error en el script que hace que no se agreguen nuevas filas cuando se aplican filtros. Problema con la API de Google Sheets: Podría haber un problema temporal con la API que impide que el script actualice la hoja de cálculo cuando se aplican filtros.

    Pasos para solucionar problemas:

    • Verifica el filtro: Asegúrate de que el filtro que aplicas en Google Sheet no excluya la fila que contiene el nuevo pedido. Intenta desactivar temporalmente el filtro para ver si aparecen nuevos pedidos.
    • Revisa el script: Revisa cuidadosamente el script para detectar cualquier error o problema lógico que pueda estar causando que no se agreguen nuevas filas cuando se aplican filtros. Asegúrate de que el script esté manejando correctamente los filtros.
    • Prueba con un nuevo script: Si no puedes encontrar ningún problema con el script actual, intenta reemplazarlo con un nuevo script que sea más simple y se centre únicamente en agregar nuevas filas a la hoja de cálculo, independientemente de los filtros. Esto te ayudará a aislar el problema y descartar cualquier problema con el script original.
    • Verifica la API de Google Sheets: Si las otras soluciones no resuelven el problema, intenta verificar si hay algún problema conocido con la API de Google Sheets. Puedes consultar el Panel de estado de Google Cloud para ver si hay interrupciones o problemas conocidos.

    Si aún tienes problemas después de seguir estos pasos, considera lo siguiente:

    Contacta con el soporte de Google Cloud: Si sospechas que hay un problema con la API de Google Sheets, puedes ponerte en contacto con el soporte de Google Cloud para obtener ayuda. Busca ayuda en foros de la comunidad:* Hay muchos foros en línea donde puedes buscar ayuda y compartir tus problemas con otros desarrolladores que pueden haber encontrado problemas similares.

    Respondida el Dec 19, 2020 a las 13:43 - por Gemini

    Votos positivos: 0 | Votos negativos: 0