LightDark
Resumen del Problema
Estoy intentando crear una función de seguimiento de pedidos en mi sitio web alojado en Namecheap que busque en una hoja de cálculo de Google cuando un usuario ingresa un número de pedido y devuelva la información correspondiente.
Lo Que Funciona
- La aplicación web de Apps Script funciona correctamente cuando se accede directamente a través de su URL en Safari.
- La funcionalidad de búsqueda funciona como se esperaba cuando abro el archivo HTML que contiene la URL de apps script en Safari.
Lo Que No Funciona
- Cuando se integra en mi sitio web de Namecheap, el JavaScript parece ser tratado como una cadena en lugar de ser ejecutado.
- Cuando intento incrustar solo el enlace de Apps Script en Namecheap, recibo un error 403 de Google («Necesitas acceso»).
Lo Que He Intentado
He intentado varias variaciones de mi función doGet()
para resolver problemas de CORS/acceso:
Variación 1: JSONP con encabezados CORS
function doGet(e) {
const orderNumber = e.parameter.orderNumber;
const callback = e.parameter.callback || 'callback'; // Nombre de callback predeterminado si no se proporciona
if (!orderNumber) {
return ContentService.createTextOutput(callback + '(' + JSON.stringify({ success: false, message: "No se proporcionó número de pedido" }) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT); // Devuelve el formato JSONP de JavaScript
}
const result = searchOrder(orderNumber);
const output = ContentService.createTextOutput(callback + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT);
output.setHeader("Access-Control-Allow-Origin", "*");
output.setHeader("Access-Control-Allow-Methods", "GET, POST");
output.setHeader("Access-Control-Allow-Headers", "Content-Type");
return output;
}
Variación 2: Enfoque JSONP puro
function doGet(e) {
const orderNumber = e.parameter.orderNumber;
const callback = e.parameter.callback || 'callback'; // Callback predeterminado si no se proporciona
if (!orderNumber) {
return ContentService.createTextOutput(callback + '(' + JSON.stringify({ success: false, message: "No se proporcionó número de pedido" }) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT); // Devuelve el formato JSONP de JavaScript
}
const result = searchOrder(orderNumber);
return ContentService.createTextOutput(callback + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
Variación 3: Enfoque JSON puro (sin JSONP, sin callback)
function doGet(e) {
const orderNumber = e.parameter.orderNumber;
if (!orderNumber) {
return ContentService.createTextOutput(JSON.stringify({ success: false, message: "No se proporcionó número de pedido" }))
.setMimeType(ContentService.MimeType.JSON); // Devuelve formato JSON simple
}
const result = searchOrder(orderNumber);
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}
Configuraciones de Despliegue
- El script está desplegado como una aplicación web que se ejecuta como yo.
- El acceso está configurado como «Cualquiera».
- Incluso intenté cambiar el acceso de la hoja de cálculo de Google a «Cualquiera», pero eso no resolvió el problema.
Otra Información
- El soporte de Namecheap sugirió que necesitaba poner en lista blanca mi IP de servidor, pero tenía la impresión de que esto no es posible con Google Apps Script.
Pregunta
¿Cómo puedo integrar exitosamente mi aplicación web de Google Apps Script con mi sitio web de Namecheap para habilitar la funcionalidad de seguimiento de pedidos? ¿Hay alguna manera de resolver el error de acceso 403 o prevenir que el JavaScript sea tratado como una cadena?