Ampliar limite de c...
Avisos
Vaciar todo

Ampliar limite de clientes en Hoja Google  

Página 1 / 2
 
Antonio
 Antonio
Usuario experto

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

Citar
Respondido : 27/02/2025 9:51 am
Pepe
 Pepe
Soporte CMS Webempresa Admin

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

ResponderCitar
Respondido : 27/02/2025 10:15 am

Cursos Gratuitos WordPress

Antonio
 Antonio
Usuario experto

@pepesoler

 

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

ResponderCitar
Respondido : 27/02/2025 11:13 am
Pepe
 Pepe
Soporte CMS Webempresa Admin

hola Antonio.

Ok, dejo el hilo abierto por si necesitas retomarlo.

 

Un Saludo 

ResponderCitar
Respondido : 27/02/2025 11:41 am

optimiza-automaticamente-todas-las-imagenes-de-tu-wordpress

Antonio
 Antonio
Usuario experto

@pepesoler

 

has hecho bien en dejar el hilo abierto....

 

No sé que ha ocurrido, pero no se me actualiza la página

Screenshot 20250303 165648

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... ?

ResponderCitar
Respondido : 03/03/2025 4:04 pm
Pepe
 Pepe
Soporte CMS Webempresa Admin

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

Esta publicación ha sido modificada el hace 4 semanas por Pepe
ResponderCitar
Respondido : 03/03/2025 4:13 pm

Antonio
 Antonio
Usuario experto

@pepesoler

 

Me salta un error en la ejecución...

 

Screenshot 20250303 175024
ResponderCitar
Respondido : 03/03/2025 4:51 pm
Antonio
 Antonio
Usuario experto

Ahora corre el Scrpt sin errores... pero sigue sin actualizar la página....

ResponderCitar
Respondido : 03/03/2025 5:36 pm

Gestor de Contraseñas - VPN Conexión Segura - Gestor 2FA (Segundo Factor de Autenticación

Bruno
 Bruno
Soporte CMS Webempresa Moderator

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!

Esta publicación ha sido modificada el hace 4 semanas por Bruno
ResponderCitar
Respondido : 03/03/2025 5:42 pm
Antonio
 Antonio
Usuario experto

@bruno-vichetti

 

Gracias por la ayuda, con el "delay" tampoco actualiza... voy darle un vistazo a ese error 503, por si el fallo estuviera ahí...

 

Saludos

ResponderCitar
Respondido : 03/03/2025 5:51 pm

wpdoctor-revisa-la-salud-de-tu-wordpress

Bruno
 Bruno
Soporte CMS Webempresa Moderator

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?

image

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!

 

ResponderCitar
Respondido : 03/03/2025 6:33 pm
Antonio
 Antonio
Usuario experto

@bruno-vichetti

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....

Screenshot 20250303 194437

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...

 

ResponderCitar
Respondido : 03/03/2025 6:50 pm

Cursos Gratuitos WordPress

Antonio
 Antonio
Usuario experto

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.... 

ResponderCitar
Respondido : 03/03/2025 7:10 pm
Bruno
 Bruno
Soporte CMS Webempresa Moderator

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!

ResponderCitar
Respondido : 03/03/2025 7:30 pm

optimiza-automaticamente-todas-las-imagenes-de-tu-wordpress

Antonio
 Antonio
Usuario experto

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

ResponderCitar
Respondido : 05/03/2025 8:55 am
Página 1 / 2