Perdonar por retomar este tema.... https://www.webempresa.com/foro/packs-webempresa/enlazar-woocommerce-con-google-sheets#post-476469
Pero me he dado cuenta que al actualizar la hoja de google, no amplia la lista de pedidos, sino que queda limitada a 10 clientes...lo suyo es que la importación de datos fuera de los últimos 100 pedidos, por ejemplo.... otra cosa podría ser, que no se borrara la hoja antes de poner los datos importados y los datos se fueran añadiendo a los que ya están en la hoja...
No sé que opción puede resultar mejor para que esa cantidad no se limite y los pedidos se vayan acumulando en la hoja ?
Perdonar por abrir otro tema, pero no he conseguido escribir en el otro. A ver si podéis fusionar este tema con el anterior.
Gracias
Contenido solo visible a usuarios registrados
Hola Antonio.
El problema está en que WooCommerce sólo devuelve por defecto 10 resultados por solicitud.
Vamos a ver si podemos solucionarlo con esto:
function importarPedidos() {
var urlBase = 'https://tuweb.com/wp-json/wc/v3/orders';
var consumerKey = 'TU_CONSUMER_KEY';
var consumerSecret = 'TU_CONSUMER_SECRET';
var auth = "Basic " + Utilities.base64Encode(consumerKey + ":" + consumerSecret);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Si la hoja está vacía, escribimos los encabezados
if (sheet.getLastRow() === 0) {
sheet.appendRow(['ID Pedido', 'Número de Factura', 'Fecha del Pedido', 'Estado', 'Nombre del Cliente', 'Teléfono', 'Email', 'Método de Pago', 'Total', 'Nombre del Producto', 'Cantidad', 'Precio Unitario']);
}
var existingOrders = new Set(); // Para evitar duplicados
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
var orderIds = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
orderIds.forEach(function(row) {
existingOrders.add(row[0]); // Guardamos los IDs de pedidos existentes
});
}
var page = 1;
var perPage = 100; // WooCommerce permite hasta 100 pedidos por solicitud
var hasMoreOrders = true;
while (hasMoreOrders) {
var response = UrlFetchApp.fetch(urlBase + '?per_page=' + perPage + '&page=' + page, {
"method": "get",
"headers": { "Authorization": auth }
});
var orders = JSON.parse(response.getContentText());
if (orders.length === 0) {
hasMoreOrders = false; // Si no hay más pedidos, detenemos la paginación
break;
}
orders.forEach(function(order) {
if (!existingOrders.has(order.id)) { // Solo agregamos pedidos nuevos
var invoiceNumber = "";
if (order.meta_data) {
order.meta_data.forEach(function(meta) {
if (meta.key === "_wcpdf_invoice_number") {
invoiceNumber = meta.value;
}
});
}
order.line_items.forEach(function(item) {
sheet.appendRow([
order.id, // ID del Pedido
invoiceNumber, // Número de Factura
order.date_created, // Fecha del Pedido
order.status, // Estado
order.billing.first_name + ' ' + order.billing.last_name, // Nombre del Cliente
order.billing.phone, // Teléfono
order.billing.email, // Email
order.payment_method_title, // Método de Pago
order.total, // Total del Pedido
item.name, // Nombre del Producto
item.quantity, // Cantidad
item.price // Precio Unitario
]);
});
}
});
page++; // Pasamos a la siguiente página
}
}
Revisa si con eso se soluciona y nos comentas.
Un Saludo
Pues parece que funciona, se ha tirado un rato cuando lo he ejecutado la primera vez y ha cargado los pedidos hechos...
vamos a ver como va funcionando ahora con las actualizaciones
muchas gracias
hola Antonio.
Ok, dejo el hilo abierto por si necesitas retomarlo.
Un Saludo
has hecho bien en dejar el hilo abierto....
No sé que ha ocurrido, pero no se me actualiza la página
Te dejo imagen de como tengo configurado su actualización...
Y probado añadiendo alguna otra con otros parámetros y no arranca.
al hacer la prueba del script da ok...
Alguna idea... ?
Hola Antonio.
Nos importa ? la semana pasada me dijiste que se importaba bien.
Ten en cuenta que para que se importe tienes que tener la hoja de calcula abierta y solo esa hoja de cálculo.
Puedes probar a seleccionar en tipo de evento que se realice por ejemplo cada 30 minutos y ejecutarlo.
También puedes probar desde otro navegador distinto por si fuera problema de cache de navegador.
Es un código Estándar y en principio lo probé y funcionaba, ahora mismo lo volvi a probar y veo que funciona bien.
Este código es un poco mas eficiente, podrias probarlo:
function importarPedidos() {
var urlBase = 'https://tuweb.com/wp-json/wc/v3/orders';
var consumerKey = 'TU_CONSUMER_KEY';
var consumerSecret = 'TU_CONSUMER_SECRET';
var auth = "Basic " + Utilities.base64Encode(consumerKey + ":" + consumerSecret);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Si la hoja está vacía, escribimos los encabezados
if (sheet.getLastRow() === 0) {
sheet.appendRow(['ID Pedido', 'Número de Factura', 'Fecha del Pedido', 'Estado', 'Nombre del Cliente', 'Teléfono', 'Email', 'Método de Pago', 'Total', 'Nombre del Producto', 'Cantidad', 'Precio Unitario']);
}
var existingOrders = new Set(); // Para evitar duplicados
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
var orderIds = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
orderIds.forEach(function(row) {
existingOrders.add(row[0]); // Guardamos los IDs de pedidos existentes
});
}
var page = 1;
var perPage = 50; // Reducimos el tamaño del lote para evitar sobrecarga
var hasMoreOrders = true;
var last30Days = new Date();
last30Days.setDate(last30Days.getDate() - 30);
var last30DaysISO = last30Days.toISOString();
var newData = [];
while (hasMoreOrders) {
var response = UrlFetchApp.fetch(urlBase + '?per_page=' + perPage + '&page=' + page + '&date_modified_min=' + encodeURIComponent(last30DaysISO), {
"method": "get",
"headers": { "Authorization": auth }
});
var orders = JSON.parse(response.getContentText());
if (orders.length === 0) {
hasMoreOrders = false;
break;
}
orders.forEach(function(order) {
if (!existingOrders.has(order.id)) { // Solo agregamos pedidos nuevos
var invoiceNumber = "";
if (order.meta_data) {
order.meta_data.forEach(function(meta) {
if (meta.key === "_wcpdf_invoice_number") {
invoiceNumber = meta.value;
}
});
}
order.line_items.forEach(function(item) {
newData.push([
order.id, // ID del Pedido
invoiceNumber, // Número de Factura
order.date_created, // Fecha del Pedido
order.status, // Estado
order.billing.first_name + ' ' + order.billing.last_name, // Nombre del Cliente
order.billing.phone, // Teléfono
order.billing.email, // Email
order.payment_method_title, // Método de Pago
order.total, // Total del Pedido
item.name, // Nombre del Producto
item.quantity, // Cantidad
item.price // Precio Unitario
]);
});
}
});
page++;
}
// Escribimos los datos en la hoja de una sola vez
if (newData.length > 0) {
sheet.getRange(sheet.getLastRow() + 1, 1, newData.length, newData[0].length).setValues(newData);
}
}
.- El código Importa solo los pedidos de los últimos 30 días en lugar de todos, evitando sobrecarga.
.- Agrega pedidos nuevos sin borrar los anteriores, asegurando que siempre tengas un historial.
.- Escribe en la hoja en lotes, lo que es mucho más rápido
.- Usa paginación (per_page=50), para no exceder el tiempo de ejecución de Google Apps Script.
Un Saludo
Ahora corre el Scrpt sin errores... pero sigue sin actualizar la página....
Que tal Antonio,
El código que cita mi compañero parece funcionar correctamente, sin embargo, en tu caso el error que estas recibiendo en la ejecución puede estar relacionado en una sobrecarga en dicha solicitud
En este caso puedes probar validar varios aspectos como el aumentar los parámetros de PHP al máximo https://guias.webempresa.com/preguntas-frecuentes/cambiar-la-version-php/
Otra forma de abordarlo seria añadir un "delay" de un segundo por ejemplo entre cada solicitud para que el destino no se vea sobrecargado, la modificación seria algo como lo siguiente
function importarPedidos() {
var urlBase = 'https://tuweb.com/wp-json/wc/v3/orders';
var consumerKey = 'TU_CONSUMER_KEY';
var consumerSecret = 'TU_CONSUMER_SECRET';
var auth = "Basic " + Utilities.base64Encode(consumerKey + ":" + consumerSecret);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
if (sheet.getLastRow() === 0) {
sheet.appendRow(['ID Pedido', 'Número de Factura', 'Fecha del Pedido', 'Estado', 'Nombre del Cliente', 'Teléfono', 'Email', 'Método de Pago', 'Total', 'Nombre del Producto', 'Cantidad', 'Precio Unitario']);
}
var existingOrders = new Set();
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
var orderIds = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
orderIds.forEach(function(row) {
existingOrders.add(row[0]);
});
}
var page = 1;
var perPage = 50;
var hasMoreOrders = true;
var last30Days = new Date();
last30Days.setDate(last30Days.getDate() - 30);
var last30DaysISO = last30Days.toISOString();
var newData = [];
while (hasMoreOrders) {
try {
var response = UrlFetchApp.fetch(urlBase + '?per_page=' + perPage + '&page=' + page + '&date_modified_min=' + encodeURIComponent(last30DaysISO), {
"method": "get",
"headers": { "Authorization": auth }
});
Logger.log(response.getResponseCode()); // Registra el código de respuesta
var orders = JSON.parse(response.getContentText());
if (orders.length === 0) {
hasMoreOrders = false;
break;
}
orders.forEach(function(order) {
if (!existingOrders.has(order.id)) {
var invoiceNumber = "";
if (order.meta_data) {
order.meta_data.forEach(function(meta) {
if (meta.key === "_wcpdf_invoice_number") {
invoiceNumber = meta.value;
}
});
}
order.line_items.forEach(function(item) {
newData.push([
order.id,
invoiceNumber,
order.date_created,
order.status,
order.billing.first_name + ' ' + order.billing.last_name,
order.billing.phone,
order.billing.email,
order.payment_method_title,
order.total,
item.name,
item.quantity,
item.price
]);
});
}
});
page++;
Utilities.sleep(1000); // Retardo de 1 segundo entre cada petición
} catch (e) {
Logger.log("Error: " + e.toString());
hasMoreOrders = false;
}
}
if (newData.length > 0) {
sheet.getRange(sheet.getLastRow() + 1, 1, newData.length, newData[0].length).setValues(newData);
}
}
Hay que destacar que el error 503 puede ser tanto del lado de tu web como del lado del destino del proceso, para conocer mas sobre el código del error puedes echarle un vistazo al siguiente articulo https://www.webempresa.com/blog/error-503-que-significa-como-solucionarlo.html
Por último, pero no menos importante, el código tal como tambien ha citado mi compañero es funcional, sin embargo, si lo que requieres es un ajuste que sea especial emte a medida de tus necesidades, para estos casos sugerimos elevar la solicitud a nuestros colaboradores que con gusto podrán ver tu caso con mayor detalle https://www.webempresa.com/directorio-colaboradores.html
Saludos!
Gracias por la ayuda, con el "delay" tampoco actualiza... voy darle un vistazo a ese error 503, por si el fallo estuviera ahí...
Saludos
Hola Antonio,
Quedamos atentos a lo que puedas validar, por otro lado hay dos comentarios que llaman mi atención
Por un lado puedes remitirnos cual es la descripción el error que se cita en la captura?
Ahora corre el Scrpt sin errores... pero sigue sin actualizar la página....
Concuerda con que el código si que funciona pero el error se presenta del lado del receptor, en este caso la hoja de Sheets, es necesario profundizar en que puede estar sucediendo
Saludos!
No se me ocurrió acceder para ver que era lo que pasaba, fallo mio...
Ahora, con tu script, hace el pedido de los datos, pero no actualiza la hoja....
He estado dando vueltas al error 503... y no parece que tenga nada raro... he probado con la linea
@ini_set( 'display_errors', 1 );
en el wp-config.php y no me ha saltado ningún error...
Podría ser algún tipo de permiso que se deberia de dar.... ?
Voy a hacer una cosa.... voy a crear una hoja con un nombre nuevo, a ver que hace...
vale, con otro navegador, he creado otra hoja de google, le he puesto el script de Bruno, sin automatizar, y ha realizado la importación... lo que no he probado ha sido a crear un nuevo pedido a ver si se actualizaba.
Puede que el fallo resida en alguna falta de permiso de la hoja... digo, yo....
Hola Antonio,
Genial! según las pruebas y lo que comentas es posible que la hoja como tal tenga restricciones, valida que el modo de compartir del sheet permita tanto visualizar como editar la hoja en cuestión
Concuerda con que el código si que funciona pero el error se presenta del lado del receptor, en este caso la hoja de Sheets, es necesario profundizar en que puede estar sucediendo
Citando lo mencionado en mi comentario anterior damos por hecho que el código funciona
Valida el modo de compartir la hoja de Google como el error que ha arrojado la ejecución y nos comentas
Saludos!
Dejo por aquí esta información por si le sirven a alguien.
Tengo ahora 2 hojas de sheets :
- Una con el script que hizo Pepe, pero el limitado a solo 8 registros de pedidos, esta hoja se actualiza cada vez que la abro, sin pegas...
- la segunda, con el código de Bruno, no hace caso,,,, quizás sea por que lleva mucha cantidad de pedidos...
las dos con el mismo ajuste de actualización, que dejo aquí....
No sé si se podría ajustar la importación a solo los últimos 100 pedidos, por ejemplo, y de esa forma no recargar la solicitud de datos