如何将 Google 工作表连接到数据库
How to connect Google Sheets to Database
我正在尝试使用查询自动填充 google sheets 文件中 sheet 的一些原始数据。
看起来 sheets 没有像 Microsoft Excel 那样的内置功能。
我错过了什么吗?我发现了一个已停产且不再适用的附加组件,称为数据:https://www.dataeverywhere.com/use-database-sheets
是否有其他东西取代了它?
如前所述here, you can use the JDBC services of Google Apps Scripts。您必须编写一个脚本,用来自 JDBC 服务的数据填充您的电子表格。
此示例演示如何从数据库中读取大量记录,并根据需要循环遍历结果集。
// Replace the variables in this block with real values.
var address = 'database_IP_address';
var user = 'user_name';
var userPwd = 'user_password';
var db = 'database_name';
var dbUrl = 'jdbc:mysql://' + address + '/' + db;
// Read up to 1000 rows of data from the table and log them.
function readFromTable() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var start = new Date();
var stmt = conn.createStatement();
stmt.setMaxRows(1000);
var results = stmt.executeQuery('SELECT * FROM entries');
var numCols = results.getMetaData().getColumnCount();
while (results.next()) {
var rowString = '';
for (var col = 0; col < numCols; col++) {
rowString += results.getString(col + 1) + '\t';
}
Logger.log(rowString)
}
results.close();
stmt.close();
var end = new Date();
Logger.log('Time elapsed: %sms', end - start);
}
希望对您有所帮助!
如果您不想推出自己的解决方案,请查看 SeekWell。它允许您连接到数据库并直接在 Sheet 中编写 SQL 查询。
其他一些功能:
- 快速查看数据库中的所有 table 和列,并单击一下即可获取列的汇总统计信息
- 从边栏、大弹出窗口 window 或从单元格内查询
结果可以发送到特定单元格,从头开始 sheet 或直接发送到数据透视表 table
- 如果您需要重新执行旧查询,您的查询历史将被保存并可查看
- 您可以在“运行 Sheet”上保存一组查询,以便一次更新多个报告
免责声明:这是我做的。
这是示例代码,说明如何从 SQL 服务器实例读取数据并将它们插入 Google Sheet。该代码创建了一个菜单项来重新加载数据,并且每次都在保持格式的同时清除内容。
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Get Data', functionName: 'readData'}
];
spreadsheet.addMenu('My Functions', menuItems);
}
// Replace the variables in this block with real values.
var address = 'ip-address:port'; //ex. '10.1.1.1:1433'
var user = 'db-username';
var userPwd = 'db-password';
var db = 'db-name';
var dbUrl = 'jdbc:sqlserver://' + address + ';databaseName=' + db;
// if your server does not support SSL, write like below
// var dbUrl = 'jdbc:sqlserver://' + address + ';databaseName=' + db + '?useSSL=false';
function readData() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
var results = stmt.executeQuery('SELECT * FROM [dbo].[User]');
var metaData=results.getMetaData();
var numCols = metaData.getColumnCount();
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName("Sheet1");
//you can use the following line to get the active sheet
//var sheet = SpreadsheetApp.getActiveSheet();
sheet.clearContents();
var arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(metaData.getColumnName(col + 1));
}
sheet.appendRow(arr);
while (results.next()) {
arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(results.getString(col + 1));
}
sheet.appendRow(arr);
}
results.close();
stmt.close();
sheet.autoResizeColumns(1, numCols+1);
}
此代码运行良好:连接 Azure 数据库并从 table
获取数据
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Get Data', functionName: 'readData'}
];
spreadsheet.addMenu('Report', menuItems);
}
// Replace the variables in this block with your values.
var hostName = 'SERVER.database.windows.net:1433;'
var db = 'DBNAME;';
var user = 'USER@SERVER';
var userPwd = 'PASSWORD';
var dbUrl = 'jdbc:sqlserver://'+hostName + 'databaseName='+db;
function readData() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
// Place your query below
var results = stmt.executeQuery('SELECT TOP (10) * FROM [dbo].[NAME]');
var metaData=results.getMetaData();
var numCols = metaData.getColumnCount();
var sheet = SpreadsheetApp.getActiveSheet();
sheet.clearContents();
var arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(metaData.getColumnName(col + 1));
}
sheet.appendRow(arr);
while (results.next()) {
arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(results.getString(col + 1));
}
sheet.appendRow(arr);
}
results.close();
stmt.close();
sheet.autoResizeColumns(1, numCols+1);
}
您可能想看看这个 detailed article "the best 7 ways to connect MySQL to Google Sheets in 2020 的列表。其中一些不需要任何代码,而另一些技术含量更高,因此您可以根据自己的需要和技能做出选择。
这是解决方案列表(您将在文章中找到每个解决方案的介绍):
- Google Apps Script(这里有 2 个主要步骤:1。创建一个 Google 表格导入脚本 SQL table ; 2. 运行 一个 Google Sheets 脚本每分钟自动检索 SQL数据 => 我写了一个 step-by-step tutorial on how to automatically retrieve data from my SQL database to Google Sheets with a script — 用实际的 代码 让它工作)
- 扎皮尔
- 积木弹簧
- Actiondesk
- Kloudio
- SeekWell
- QueryClips
我希望 this thorough presentation 能帮助您找到一种解决方案,通过 MySQL 简化您的生活,并帮助您和您的团队提高效率和生产力!
您有几个选择:
1.构建您自己的连接器/插件
您可以使用 Google 应用程序脚本构建您自己的连接器(https://developers.google.com/apps-script/guides/sheets). I'd recommend this tutorial for addon development https://youtu.be/6jcc3xm7aRU。
要连接到您的数据库,您可以像@abielita 建议的那样使用 JDBC 服务 (https://developers.google.com/apps-script/guides/jdbc),或者使用单独的数据库连接器,例如 psycopg2 或 node-postgres if Apps Script JDBC 服务不支持您的数据库。 运行 它在某些服务器上,用 REST API 前端并从 Google sheet.
获取数据
2。使用插件
市场上有许多插件试图解决这个确切的问题。您可以通过搜索 "connect database to google sheets" on G Suite Marketplace (https://gsuite.google.com/marketplace).
找到它们
答案实际上取决于您使用的数据库。我会提到上面没有提到的解决方案:
Zapier 提供了与 Typeform、
Gmail 电子邮件、Facebook 线索、Trello 卡片、Slack、Mailchimp、
Clickfunnels、Survey Monkey、Asana、Airtable 数据、Twitter 等等
还有很多等等
如果要连接到 Mongodb,请使用 Mongodb 拼接,如下所述:
https://www.mongodb.com/blog/post/stitching-sheets-using-mongodb-stitch-to-create-an-api-for-data-in-google-sheets
Postgreql 到表格:Zapier 集成(https://zapier.com/apps/google-sheets/integrations/postgresql)或
actiondesk/kloud整合
(https://www.actiondesk.io/blog/4-tools-to-connect-postgresql-to-google-sheets)
如果是习俗。 DB,您始终可以使用此处提到的 API 开发自己的插件:
https://developers.google.com/sheets/api
您想连接到哪个数据库?
Abielita 的回答很好
我只是添加了一些额外的行,以便将数据写入活动 sheet。
// Replace the variables in this block with real values.
var address = 'host';
var user = 'user';
var userPwd = 'password';
var db = 'dbname';
var dbUrl = 'jdbc:sqlserver://'+address+";databaseName="+db+";";
// Read up to 1000 rows of data from the table and log them.
function readFromTable() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var start = new Date();
var stmt = conn.createStatement();
stmt.setMaxRows(1000);
var results = stmt.executeQuery('select * from TableName');
var numCols = results.getMetaData().getColumnCount();
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var cell = sheet.getRange('A1');
var numCols = results.getMetaData().getColumnCount();
var row =0;
while (results.next()) {
var rowString = '';
for (var col = 0; col < numCols; col++) {
rowString += results.getString(col + 1) + '\t';
cell.offset(row, col).setValue(results.getString(col +1 ));
}
row++
Logger.log(rowString)
}
results.close();
stmt.close();
var end = new Date();
Logger.log('Time elapsed: %sms', end - start);
}
这个问题的答案在很大程度上取决于您尝试连接到 Google 表格的内容,如果您尝试将表格连接到内部数据库实例,则可能需要一些额外的设置,而这不是'没有暴露在互联网上。
对于暴露在互联网上的服务,有一些扩展可以处理来自不同数据库服务和 SAAS 应用程序的数据推送和拉取。 Coefficient 效果很好(免责声明:我是那里的软件工程师)。它具有用于大量不同服务和数据库的连接器,目前与您的问题相关的是:
- MySQL
- 红移
- PostgreSQL
- CSV(在最坏的情况下,如果您
平台尚不支持,您可以导出为 CSV,然后再导入
自动生成 CSV)
我们也在不断添加更多连接器,您可以在同一个 sheet 中混合、匹配和管理它们。我们还在他们的博客中提供了很多关于他们的产品的文档和关于如何为他们支持的不同平台利用表格报告的想法。
如果您想避免使用第 3 方工具,您可以利用 App Scripts 制作自定义函数,从外部 SQL 实例中为您提取数据。请注意:他们作为示例提供的脚本用于连接到 google 云实例。如果您要连接到非 Google 云数据库,则需要使用 Jdbc.getConnection(url)
而不是 Jdbc.getCloudSqlConnection(url)
。就像附加解决方案一样,您需要确保您托管和希望访问的任何数据库都可以从互联网访问(链接的 google 文档有更多相关信息) .
这个解决方案的一个优点是它非常可定制并且可以重复使用。对于 Sheets 老手来说,这也非常直观,因为可以像常规 sheets 函数一样进行调用。
需要注意的是,该解决方案需要对开发有一定了解,才能以可重用且对所有用户直观的方式实施。 Google 在其文档中提供的“从数据库读取”示例不带任何参数,只是转储一个 table 的所有数据。为每个你想从中提取的 table 创建一个新函数,每次你想加载一个新的 table 可能不在你的待办事项列表中,所以你可能想要添加要连接到哪个服务器的参数、哪个端口、哪个数据库、要return的哪些列以及要应用的任何过滤器(或者可能是什么SQL命令到运行?)。
但到那时,非技术用户更难访问它,而您正在重新创建一个包,其他人(如 Coefficient)已经投入时间、资源和理解来开发。
我正在尝试使用查询自动填充 google sheets 文件中 sheet 的一些原始数据。
看起来 sheets 没有像 Microsoft Excel 那样的内置功能。
我错过了什么吗?我发现了一个已停产且不再适用的附加组件,称为数据:https://www.dataeverywhere.com/use-database-sheets
是否有其他东西取代了它?
如前所述here, you can use the JDBC services of Google Apps Scripts。您必须编写一个脚本,用来自 JDBC 服务的数据填充您的电子表格。
此示例演示如何从数据库中读取大量记录,并根据需要循环遍历结果集。
// Replace the variables in this block with real values.
var address = 'database_IP_address';
var user = 'user_name';
var userPwd = 'user_password';
var db = 'database_name';
var dbUrl = 'jdbc:mysql://' + address + '/' + db;
// Read up to 1000 rows of data from the table and log them.
function readFromTable() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var start = new Date();
var stmt = conn.createStatement();
stmt.setMaxRows(1000);
var results = stmt.executeQuery('SELECT * FROM entries');
var numCols = results.getMetaData().getColumnCount();
while (results.next()) {
var rowString = '';
for (var col = 0; col < numCols; col++) {
rowString += results.getString(col + 1) + '\t';
}
Logger.log(rowString)
}
results.close();
stmt.close();
var end = new Date();
Logger.log('Time elapsed: %sms', end - start);
}
希望对您有所帮助!
如果您不想推出自己的解决方案,请查看 SeekWell。它允许您连接到数据库并直接在 Sheet 中编写 SQL 查询。
其他一些功能:
- 快速查看数据库中的所有 table 和列,并单击一下即可获取列的汇总统计信息
- 从边栏、大弹出窗口 window 或从单元格内查询 结果可以发送到特定单元格,从头开始 sheet 或直接发送到数据透视表 table
- 如果您需要重新执行旧查询,您的查询历史将被保存并可查看
- 您可以在“运行 Sheet”上保存一组查询,以便一次更新多个报告
免责声明:这是我做的。
这是示例代码,说明如何从 SQL 服务器实例读取数据并将它们插入 Google Sheet。该代码创建了一个菜单项来重新加载数据,并且每次都在保持格式的同时清除内容。
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Get Data', functionName: 'readData'}
];
spreadsheet.addMenu('My Functions', menuItems);
}
// Replace the variables in this block with real values.
var address = 'ip-address:port'; //ex. '10.1.1.1:1433'
var user = 'db-username';
var userPwd = 'db-password';
var db = 'db-name';
var dbUrl = 'jdbc:sqlserver://' + address + ';databaseName=' + db;
// if your server does not support SSL, write like below
// var dbUrl = 'jdbc:sqlserver://' + address + ';databaseName=' + db + '?useSSL=false';
function readData() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
var results = stmt.executeQuery('SELECT * FROM [dbo].[User]');
var metaData=results.getMetaData();
var numCols = metaData.getColumnCount();
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName("Sheet1");
//you can use the following line to get the active sheet
//var sheet = SpreadsheetApp.getActiveSheet();
sheet.clearContents();
var arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(metaData.getColumnName(col + 1));
}
sheet.appendRow(arr);
while (results.next()) {
arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(results.getString(col + 1));
}
sheet.appendRow(arr);
}
results.close();
stmt.close();
sheet.autoResizeColumns(1, numCols+1);
}
此代码运行良好:连接 Azure 数据库并从 table
获取数据function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Get Data', functionName: 'readData'}
];
spreadsheet.addMenu('Report', menuItems);
}
// Replace the variables in this block with your values.
var hostName = 'SERVER.database.windows.net:1433;'
var db = 'DBNAME;';
var user = 'USER@SERVER';
var userPwd = 'PASSWORD';
var dbUrl = 'jdbc:sqlserver://'+hostName + 'databaseName='+db;
function readData() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
// Place your query below
var results = stmt.executeQuery('SELECT TOP (10) * FROM [dbo].[NAME]');
var metaData=results.getMetaData();
var numCols = metaData.getColumnCount();
var sheet = SpreadsheetApp.getActiveSheet();
sheet.clearContents();
var arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(metaData.getColumnName(col + 1));
}
sheet.appendRow(arr);
while (results.next()) {
arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(results.getString(col + 1));
}
sheet.appendRow(arr);
}
results.close();
stmt.close();
sheet.autoResizeColumns(1, numCols+1);
}
您可能想看看这个 detailed article "the best 7 ways to connect MySQL to Google Sheets in 2020 的列表。其中一些不需要任何代码,而另一些技术含量更高,因此您可以根据自己的需要和技能做出选择。
这是解决方案列表(您将在文章中找到每个解决方案的介绍):
- Google Apps Script(这里有 2 个主要步骤:1。创建一个 Google 表格导入脚本 SQL table ; 2. 运行 一个 Google Sheets 脚本每分钟自动检索 SQL数据 => 我写了一个 step-by-step tutorial on how to automatically retrieve data from my SQL database to Google Sheets with a script — 用实际的 代码 让它工作)
- 扎皮尔
- 积木弹簧
- Actiondesk
- Kloudio
- SeekWell
- QueryClips
我希望 this thorough presentation 能帮助您找到一种解决方案,通过 MySQL 简化您的生活,并帮助您和您的团队提高效率和生产力!
您有几个选择:
1.构建您自己的连接器/插件
您可以使用 Google 应用程序脚本构建您自己的连接器(https://developers.google.com/apps-script/guides/sheets). I'd recommend this tutorial for addon development https://youtu.be/6jcc3xm7aRU。
要连接到您的数据库,您可以像@abielita 建议的那样使用 JDBC 服务 (https://developers.google.com/apps-script/guides/jdbc),或者使用单独的数据库连接器,例如 psycopg2 或 node-postgres if Apps Script JDBC 服务不支持您的数据库。 运行 它在某些服务器上,用 REST API 前端并从 Google sheet.
获取数据2。使用插件
市场上有许多插件试图解决这个确切的问题。您可以通过搜索 "connect database to google sheets" on G Suite Marketplace (https://gsuite.google.com/marketplace).
找到它们答案实际上取决于您使用的数据库。我会提到上面没有提到的解决方案:
Zapier 提供了与 Typeform、 Gmail 电子邮件、Facebook 线索、Trello 卡片、Slack、Mailchimp、 Clickfunnels、Survey Monkey、Asana、Airtable 数据、Twitter 等等 还有很多等等
如果要连接到 Mongodb,请使用 Mongodb 拼接,如下所述: https://www.mongodb.com/blog/post/stitching-sheets-using-mongodb-stitch-to-create-an-api-for-data-in-google-sheets
Postgreql 到表格:Zapier 集成(https://zapier.com/apps/google-sheets/integrations/postgresql)或 actiondesk/kloud整合 (https://www.actiondesk.io/blog/4-tools-to-connect-postgresql-to-google-sheets)
如果是习俗。 DB,您始终可以使用此处提到的 API 开发自己的插件: https://developers.google.com/sheets/api
您想连接到哪个数据库?
Abielita 的回答很好
我只是添加了一些额外的行,以便将数据写入活动 sheet。
// Replace the variables in this block with real values.
var address = 'host';
var user = 'user';
var userPwd = 'password';
var db = 'dbname';
var dbUrl = 'jdbc:sqlserver://'+address+";databaseName="+db+";";
// Read up to 1000 rows of data from the table and log them.
function readFromTable() {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var start = new Date();
var stmt = conn.createStatement();
stmt.setMaxRows(1000);
var results = stmt.executeQuery('select * from TableName');
var numCols = results.getMetaData().getColumnCount();
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var cell = sheet.getRange('A1');
var numCols = results.getMetaData().getColumnCount();
var row =0;
while (results.next()) {
var rowString = '';
for (var col = 0; col < numCols; col++) {
rowString += results.getString(col + 1) + '\t';
cell.offset(row, col).setValue(results.getString(col +1 ));
}
row++
Logger.log(rowString)
}
results.close();
stmt.close();
var end = new Date();
Logger.log('Time elapsed: %sms', end - start);
}
这个问题的答案在很大程度上取决于您尝试连接到 Google 表格的内容,如果您尝试将表格连接到内部数据库实例,则可能需要一些额外的设置,而这不是'没有暴露在互联网上。
对于暴露在互联网上的服务,有一些扩展可以处理来自不同数据库服务和 SAAS 应用程序的数据推送和拉取。 Coefficient 效果很好(免责声明:我是那里的软件工程师)。它具有用于大量不同服务和数据库的连接器,目前与您的问题相关的是:
- MySQL
- 红移
- PostgreSQL
- CSV(在最坏的情况下,如果您 平台尚不支持,您可以导出为 CSV,然后再导入 自动生成 CSV)
我们也在不断添加更多连接器,您可以在同一个 sheet 中混合、匹配和管理它们。我们还在他们的博客中提供了很多关于他们的产品的文档和关于如何为他们支持的不同平台利用表格报告的想法。
如果您想避免使用第 3 方工具,您可以利用 App Scripts 制作自定义函数,从外部 SQL 实例中为您提取数据。请注意:他们作为示例提供的脚本用于连接到 google 云实例。如果您要连接到非 Google 云数据库,则需要使用 Jdbc.getConnection(url)
而不是 Jdbc.getCloudSqlConnection(url)
。就像附加解决方案一样,您需要确保您托管和希望访问的任何数据库都可以从互联网访问(链接的 google 文档有更多相关信息) .
这个解决方案的一个优点是它非常可定制并且可以重复使用。对于 Sheets 老手来说,这也非常直观,因为可以像常规 sheets 函数一样进行调用。
需要注意的是,该解决方案需要对开发有一定了解,才能以可重用且对所有用户直观的方式实施。 Google 在其文档中提供的“从数据库读取”示例不带任何参数,只是转储一个 table 的所有数据。为每个你想从中提取的 table 创建一个新函数,每次你想加载一个新的 table 可能不在你的待办事项列表中,所以你可能想要添加要连接到哪个服务器的参数、哪个端口、哪个数据库、要return的哪些列以及要应用的任何过滤器(或者可能是什么SQL命令到运行?)。
但到那时,非技术用户更难访问它,而您正在重新创建一个包,其他人(如 Coefficient)已经投入时间、资源和理解来开发。