【问题标题】:How to connect Google Sheets to Database如何将 Google 表格连接到数据库
【发布时间】:2017-02-13 16:19:00
【问题描述】:

我正在尝试使用查询在我的 google 表格文件中的表格上自动填充一些原始数据。

Sheets 看起来不像 Microsoft Excel 那样具有任何内置功能。

我错过了什么吗?我发现了一个已停产且不再工作的附加组件,称为数据无处不在:https://www.dataeverywhere.com/use-database-sheets

还有其他东西可以代替吗?

【问题讨论】:

  • 您好 - 查看 [SeekWell][1],我们已经构建了 dataeverywhere 拥有的所有功能以及更多功能。免责声明 - 我是 SeekWell 的联合创始人。 [1]:seekwell.io

标签: google-sheets google-sheets-api


【解决方案1】:

正如提到的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);
}

希望这会有所帮助!

【讨论】:

  • 您从 JDBC 页面粘贴的代码 sn-p 显示了如何记录查询结果。但是如何将它们放入 Google 表格文档中呢?
  • 这适用于我在 while 循环之前添加 var sheet = SpreadsheetApp.getActiveSpreadsheet(); var cell = sheet.getRange('A1'); var numCols = results.getMetaData().getColumnCount();变量行=0; while (results.next()) { var rowString = ''; for (var col = 0; col
【解决方案2】:

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

其他一些功能:

  • 快速查看数据库中的所有表和列,并一键获取列的汇总统计信息
  • 从边栏、大弹出窗口或单元格内查询 结果可以发送到特定的单元格、草稿纸或直接发送到数据透视表
  • 如果您需要重新执行旧查询,您的查询历史记录已保存并可查看
  • 您可以在“运行表”上保存一组查询,以便一次更新多个报告

免责声明:这是我做的。

【讨论】:

    【解决方案3】:

    这是如何从 SQL Server 实例读取数据并将其插入 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);
    
    
    }
    

    【讨论】:

    • 这行得通,但是“var sheet = SpreadsheetApp.getActiveSheet();”如果工作表中有多个选项卡,则可能会导致问题 - 它会清除用户在运行时打开的任何选项卡的内容。最好使用“var sheet = spreadsheet.getSheetByName("Sheet1")”。我建议在回复中进行编辑
    • 感谢@EricBarr。我还添加了getActiveSheet 作为评论行,任何人只有一个标签。
    • 这有多安全?您不是将数据库密码直接放入谷歌表格吗?您不需要数据库可以公开访问吗?
    • 如何通过集成身份验证做到这一点?
    • @FMFF 类似于jdbc:sqlserver://;servername=server_name;integratedSecurity=true;authenticationScheme=JavaKerberos 查看更多示例here
    【解决方案4】:

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案5】:

      您可能想查看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. 扎皮尔
      3. 块弹簧
      4. 行动台
      5. Kloudio
      6. SeekWell
      7. 查询剪辑

      我希望this thorough presentation 能帮助您找到一个解决方案,以简化您使用 MySQL 的生活,并帮助您和您的团队提高效率和生产力!

      【讨论】:

        【解决方案6】:

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

        1. Zapier 提供与 Typeform 等数据库的完美集成, Gmail 电子邮件、Facebook 潜在客户、Trello 卡、Slack、Mailchimp、 Clickfunnels、Survey Monkey、Asana、Airtable data、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) 或 actiondesk/云集成 (https://www.actiondesk.io/blog/4-tools-to-connect-postgresql-to-google-sheets)

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

        您要连接到哪个数据库?

        【讨论】:

          【解决方案7】:

          你有几个选择:

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

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

          要连接到您的数据库,您可以像 @abielita 建议的那样使用 JDBC 服务 (https://developers.google.com/apps-script/guides/jdbc),或者如果 Apps Script JDBC 服务不支持您的数据库,则可以使用单独的数据库连接器,例如 psycopg2 或 node-postgres。在某个服务器上运行它,使用 REST API 前端并从 Google 表中获取数据。

          2。使用插件

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

          【讨论】:

            【解决方案8】:

            此代码运行良好:连接 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);
            
            }

            【讨论】:

              【解决方案9】:

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

              【讨论】:

              • 嗨 @angelhernandez,您是否也将 AppScript 中提到的 IP 列入白名单?
              猜你喜欢
              • 1970-01-01
              • 2023-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多