Google Sheets连接本地无密码MySQL失败,请求调试帮助
问题分析与解决方案
报错信息
Exception: Failed to establish a database connection. Check connection string, username and password. getDataFromDatabase @ Code.gs:8
核心问题
你的脚本运行在Google云端服务器上,代码里的localhost指向谷歌服务器本身,而非你本地的MySQL机器,云端无法直接访问本地数据库,这是连接失败的根本原因。
解决方案步骤
1. 配置MySQL允许远程访问
- 打开MySQL配置文件(Windows为
my.ini,Linux/macOS为my.cnf),找到bind-address项,修改为0.0.0.0(允许所有IP访问)或你的公网IP,修改后重启MySQL服务。 - 登录MySQL控制台,执行授权命令(适配无密码场景):
(安全提示:GRANT ALL PRIVILEGES ON my_database_test.* TO 'root'@'%' IDENTIFIED BY ''; FLUSH PRIVILEGES;%代表允许所有IP访问,建议替换为你的公网IP,限制仅该IP能远程连接)
2. 将本地MySQL暴露到公网
谷歌服务器需要能访问到你的本地MySQL,可通过以下方式之一实现:
- 端口映射:进入路由器管理后台,设置端口映射规则,将外部3306端口映射到本地机器的内网IP和3306端口。
- 内网穿透:使用ngrok等工具,执行命令
ngrok tcp 3306,工具会生成一个带端口的公网地址(如tcp://0.tcp.ngrok.io:12345)。
3. 修改脚本的连接地址
将代码中的address替换为可访问的公网地址:
- 端口映射场景:
var address = 'jdbc:mysql://你的公网IP:3306/my_database_test'; - ngrok穿透场景:
var address = 'jdbc:mysql://0.tcp.ngrok.io:12345/my_database_test';
4. 额外检查项
- 确保本地机器防火墙允许3306端口的外部访问。
- 先用本地MySQL客户端(如Navicat、MySQL Workbench)测试公网连接,确认正常后再运行脚本。
- 无密码远程访问存在安全风险,建议后续给数据库用户设置密码,或严格限制访问IP范围。
修正后的示例脚本
function getDataFromDatabase() { // 替换为你的公网连接地址 var address = 'jdbc:mysql://你的公网IP:3306/my_database_test'; var user = 'root'; var password = ''; // 建立数据库连接 var conn = Jdbc.getConnection(address, user, password); // 执行SQL查询 var stmt = conn.createStatement(); var rs = stmt.executeQuery('SELECT * FROM customers'); // 处理查询结果 var results = []; while (rs.next()) { results.push([rs.getString(1), rs.getString(2), rs.getString(3)]); // 根据实际列调整索引 } // 关闭连接资源 rs.close(); stmt.close(); conn.close(); // 返回结果到Google Sheets return results; }
内容的提问来源于stack exchange,提问作者Nino.Ninov
相关产品推荐
相关产品推荐

