如何将Google表格连接到数据库

时间:2017-02-13 16:19:00

标签: google-sheets google-sheets-api

我尝试使用查询在我的Google工作表文件中自动填充工作表上的某些原始数据。

看起来像工作表有任何内置功能,就像Microsoft Excel那样。

我错过了什么吗?我找到了一个已经停止使用的附加组件,并且在所有地方都不再使用数据:https://www.dataeverywhere.com/use-database-sheets

还有其他东西取代了吗?

9 个答案:

答案 0 :(得分:6)

如引用here,您可以使用JDBC services of Google Apps Scripts。您必须编写一个脚本,使用来自JDBC服务的数据填充您的电子表格。

Read from the database

此示例演示如何从数据库中读取大量记录,并根据需要循环遍历结果集。

// 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);
}

希望这有帮助!

答案 1 :(得分:3)

此问题的答案在很大程度上取决于您尝试连接到 Google 表格的内容,如果您尝试将表格连接到未公开到互联网的内部数据库实例,则可能需要进行一些额外的设置。

对于暴露在互联网上的服务,有一些扩展可以处理从不同的数据库服务和 SAAS 应用程序推送和拉取数据。 Coefficient 运行良好(免责声明:我是那里的软件工程师)。它具有用于大量不同服务和数据库的连接器,目前与您的问题相关的连接器是:

  • MySQL
  • 红移
  • PostgreSQL
  • CSV(在最坏的情况下,如果您的 尚不支持平台,您可以导出为CSV然后导入 CSV 自动)

我们也在不断添加更多连接器,您可以在同一张表中混合、匹配和管理它们。我们还为他们的产品提供了大量文档,并提供了有关如何利用他们在博客中支持的不同平台的表格报告的想法。

如果您想避免使用第 3 方工具,您可以利用应用脚本制作自定义函数,以便从外部 SQL 实例中为您提取数据。请注意:他们作为示例提供的脚本用于连接到谷歌云实例。如果您要连接到非 Google Cloud 数据库,则需要使用 Jdbc.getConnection(url) 而不是 Jdbc.getCloudSqlConnection(url)。就像使用附加解决方案一样,您需要确保您托管和希望访问的任何数据库都可以从 Internet 访问(链接的谷歌文档有更多相关信息)。

此解决方案的优势在于它非常可定制且可以重复使用。对于 Sheets 老手来说,它也非常直观,因为调用可以像普通的 Sheets 函数一样进行。

需要注意的是,它是一种解决方案,需要对开发有一定的了解,才能以可重用且对所有用户都直观的方式实施。谷歌在其文档中提供的“从数据库读取”示例不带任何参数,只是将一张表的所有数据转储出来。为要从中提取的每个表创建一个新函数,每次要加载新表时,可能不在您的待办事项列表中,因此您可能希望添加要连接到的服务器的参数,哪个端口、哪个数据库、要返回哪些列以及要应用的任何过滤器(或者可能要运行什么 SQL 命令?)。

但在那时,非技术用户变得更难以访问它,并且您正在重新创建一个包,像 Coefficient 这样的其他人已经投入时间、资源和理解来开发。

答案 2 :(得分:2)

如果您不想推出自己的解决方案,请查看SeekWell。它允许您直接在Sheets中连接到数据库并编写SQL查询。

其他一些功能:

  • 快速查看数据库中的所有表格和列,只需点击一下
  • 即可获得列上的摘要统计信息
  • 从侧边栏,大型弹出窗口或单元格内查询 可以将结果发送到特定单元格,临时表或直接发送到数据透视表
  • 如果您需要重新执行旧查询,则会保存并查看您的查询历史记录
  • 您可以在“运行表”上保存一组查询,以便一次更新多个报告

免责声明:我做到了。

答案 3 :(得分:2)

这是示例代码,说明如何从SQL Server实例读取数据并将其插入Google表格中。该代码创建一个菜单项以重新加载数据,并且每次清除内容时都会保留格式。

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;


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 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);


}

答案 4 :(得分:1)

您可能想看一下detailed article "the best 7 ways to connect MySQL to Google Sheets in 2020的列表。其中有些不需要任何代码,而有些则需要更多技术,因此您可以根据自己的需求和技能进行选择。

以下是解决方案的列表(您将在本文中找到每种解决方案的演示文稿):

  1. Google Apps脚本(此处有2个主要步骤: 1 。创建Google表格脚本以导入SQL表; 2 。每分钟自动运行一次Google Sheets脚本以检索SQL数据=>我写了一个step-by-step tutorial on how to automatically retrieve data from my SQL database to Google Sheets with a script-使用实际的代码使之起作用)
  2. Zapier
  3. Blockspring
  4. Actiondesk
  5. 克卢迪奥
  6. SeekWell
  7. QueryClips

我希望this thorough presentation将帮助您找到一种解决方案,该解决方案可以简化MySQL的工作,并使您和您的团队更加高效和富有成效!

答案 5 :(得分:1)

您有几种选择:

1。构建自己的连接器/插件

您可以使用Google应用程序脚本(https://developers.google.com/apps-script/guides/sheets)构建自己的连接器。我建议将此教程用于插件开发https://youtu.be/6jcc3xm7aRU

要连接到数据库,可以使用@abielita建议的JDBC服务(https://developers.google.com/apps-script/guides/jdbc),也可以使用单独的数据库连接器(例如psycopg2或node-postgres),如果Apps Script JDBC服务不支持您的数据库。数据库。在某些服务器上运行它,并使用REST API对其进行处理,然后从Google表格中获取数据。

2。使用插件

市场上有许多附加组件正试图解决这个确切的问题。您可以通过在G Suite市场("connect database to google sheets")上搜索https://gsuite.google.com/marketplace来找到它们。

答案 6 :(得分:1)

答案实际上取决于您使用的数据库。我将提到上面尚未解决的解决方案:

  1. Zapier提供与Typeform, Gmail电子邮件,facebook线索,Trello卡,Slack,Mailchimp, Clickfunnels,Survey Monkey,Asana,Airtable数据,Twitter和许多 还有更多等等。

  2. 如果要连接到Mongodb,请使用Mongodb针,如下所示: https://www.mongodb.com/blog/post/stitching-sheets-using-mongodb-stitch-to-create-an-api-for-data-in-google-sheets

  3. Postgreql到工作表:Zapier集成(https://zapier.com/apps/google-sheets/integrations/postgresql)或 动作台/大声集成 (https://www.actiondesk.io/blog/4-tools-to-connect-postgresql-to-google-sheets

  4. 如果是自定义。 DB,您始终可以使用此处提到的API开发自己的插件: https://developers.google.com/sheets/api

您要连接到哪个数据库?

答案 7 :(得分:0)

此代码效果很好:连接Azure数据库并从表中获取数据

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);

}

答案 8 :(得分:0)

Abielita的答案很好

我只添加一些额外的行,以便将数据写入活动工作表。

// 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);
}