Soy nuevo en el uso de Google Scripts y estoy tratando de hacer una conexión a una base de datos MySQL (5.5.65-MariaDB) que está alojada en un servidor externo (que no es de Google) que ejecuta CentOS Linux 7.7.1908 Core.
Estoy siguiendo la guía aquí: https://developers.google.com/apps-script/guides/jdbc#other_databases
En mi script he usado la siguiente función:
// export_sheet_data.gs function writeOneRecord() { var conn = Jdbc.getConnection('jdbc:mysql://HOST_NAME.com:3306/DB_NAME', 'DB_USER', 'DB_PASSWORD'); var stmt = conn.prepareStatement('INSERT INTO entries ' + '(guestName, content) values (?, ?)'); stmt.setString('andy', 'First Guest'); stmt.execute(); } Obviamente, HOST_NAME , DB_NAME , DB_USER y DB_PASSWORD son cadenas (ingresadas literalmente, no variables) que corresponden a los valores apropiados: nombre de host de mi servidor externo, nombre de la base de datos, nombre de usuario de la base de datos y contraseña de la base de datos.
Cuando ejecuto esto en la consola de Scripts (Ejecutar> Ejecutar función> writeOneRecord() ) dice
Ejecutando la función writeOneRecord()
durante aproximadamente 10 segundos.
Luego falla con
Excepción: no se pudo establecer una conexión con la base de datos. Compruebe la cadena de conexión, el nombre de usuario y la contraseña.
Si hago clic en "Detalles", realmente no explica esto. Dice
Excepción: no se pudo establecer una conexión con la base de datos. Compruebe la cadena de conexión, el nombre de usuario y la contraseña. (línea 54, archivo "export_sheet_data")
He hecho lo siguiente:
DB_NAME , existe en mi servidor.HOST_NAME coincide con mi servidor. También lo probé con la dirección IP externa .DB_USER y DB_PASSWORD ) son correctos.No aparece nada en mi registro de firewall en el servidor al que me estoy conectando sobre esto.
Verifiqué que estoy usando Jdbc.getConnection correctamente.
¿De qué otra manera puedo depurar esto? No parece haber nada en la consola de Google Scripts que pueda ayudar.
¿Está utilizando VPS Linux?
He tenido el mismo problema y no pude solucionarlo. Parece ser un error de la implementación de GAS JDBC con una combinación de controladores de red personalizados utilizados dentro de VPS y/o una implementación específica de MYSQL.
Para algunas combinaciones de Linux/Mysql pude conectarme a Linux Mysql, para algunas no.
El error en mi caso fue "Obtuve un error al leer el paquete de comunicación" (registros de mysql), muy difícil de rastrear el error de mysql.
Si revisa los registros de mysql en su servidor y ese es este error, creo que lo mejor que puede hacer es seguir la versión simplificada de los consejos de @TheAddonDepot: escriba un pequeño código de nodejs para ejecutar sql por usted e instálelo como servicio de Linux (escuche http en puerto personalizado )- hay muchos ejemplos para eso. Sería más fácil dedicar varias horas a esto, porque no creo que este problema se resuelva en un futuro cercano.
No lo he probado, pero algo como esto debería encajar en tu caso.
var http = require('http'); var url = require('url'); var mysql = require('mysql'); var con = mysql.createConnection({ host: "localhost", user: "yourusername", password: "yourpassword", database: "mydb" }); con.connect(function(err) { if (err) throw err; console.log("Connected to mysql!"); }); http.createServer(function (req, res) { var q = url.parse(req.url, true).query; var result; let stmt = `INSERT INTO entries (guestName, content) values (?, ?)`; let values = [q.guestName, q.content]; console.log('Request', q); // execute the insert statment connection.query(stmt, values, (err, results, fields) => { if (err) { res.writeHead(400, {'Content-Type': 'application/json'}); console.error(err.message); result = {error:err}; } else { res.writeHead(200, {'Content-Type': 'application/json'}); console.log('Insert Id:' + results.insertId); result = {success:true, id:results.insertId}; } }); res.end(JSON.stringify(result)); }).listen(7733);y llámalo desde GAS como
UrlFetchApp.fetch('http://your-server-ip:7733/?guestName=' + encodeURIComponent(guestName) + '&content=' + encodeURIComponent(content));Alternativamente, puede intentar cambiar la versión de Linux/Mysql pero es más complicado, y no estoy seguro de que la combinación de cambios funcione exactamente porque en mi caso el error fue en Debian 18.04
Tuve algunas dificultades para acceder a las bases de datos MySql en los sitios web y encontré que este enfoque funciona para mí.
var address=getDBData('address');//I keep the actuall data in a spreadsheet var user=getDBData('user'); var userPwd=getDBData('pass'); var db=getDBData('db'); var dbUrl='jdbc:mysql://' + address + '/' + db; s+='<table>'; s+='<tr><th>Database Name: ' + db + '</th></tr>'; s+='<tr><th>' + qry + '</th></tr></table>'; try { var conn=Jdbc.getConnection(dbUrl, user, userPwd); }La dirección que parece funcionar a menudo es la dirección IP de la cuenta de alojamiento.