Querying SQL Server with Google Apps Script via JDBC

一个人想着一个人 提交于 2019-11-29 05:20:10

I think your Connection string is slightly malformed. I believe you need a sqlserver:// before your servername/instance.

I don't have a SQL Server instance handy but I tested the following code against SQL Azure and it worked well. I was able to select data from a table called helloworld and write it to a spreadsheet.

I've replaced my credentials with placeholders.

function readAzure() {
  var conn = Jdbc.getConnection("jdbc:sqlserver://XYZ.database.windows.net:1433;databaseName=MYDATABSENAME","USERNAME","PASSWORD");
  var stmt = conn.createStatement();
  var rs = stmt.executeQuery("select * from helloworld");

  var doc = SpreadsheetApp.create('azure');
  var cell = doc.getRange('a1');
  var row = 0;
  while(rs.next()) {
    cell.offset(row, 0).setValue(rs.getString(1));
    cell.offset(row, 1).setValue(rs.getString(2));
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
}

I have an entire project on GitHub that is a Mysql & SQL Server JDBC connection app. You can find it here: GitHub Project . I have posted the related code below. The the SQL Server case is where you instantiate the parameters for your connection and then below is the rest of the connection. To get an entire tool use the GitHub Project.

  function readFromTable(queryType, queryDb, query, tab, startCell) {
  // Replace the variables in this block with real values.
  var address;
  var user;
  var userPwd ;
  var dbUrl;

  switch(queryType) {
    case 'sqlserver':
      address = '%YOUR SQL HOSTNAME%';
      user = '%YOUR USE%';
      userPwd = '%YOUR PW%';
      dbUrl = 'jdbc:sqlserver://' + address + ':1433;databaseName=' + queryDb;
      break;
    case 'mysql':  
      address = '%YOUR MYSQL HOSTNAME%';
      user = '%YOUR USER';
      userPwd = '%YOUR PW%';
      dbUrl = 'jdbc:mysql://'+address + '/' + queryDb;
    break;
  }

  var conn = Jdbc.getConnection(dbUrl, user, userPwd);
  var start = new Date();
  var stmt = conn.createStatement();
  var results = stmt.executeQuery(query);
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetTab = sheet.getSheetByName(tab);
  var cell = sheetTab.getRange(startCell);
  var numCols = results.getMetaData().getColumnCount();
  var numRows = sheetTab.getLastRow();
  var headers ;
  var row =0;

  clearRange(tab,startCell,numRows, numCols);


  for(var i = 1; i <= numCols; i++){
    headers = results.getMetaData().getColumnName(i);
      cell.offset(row, i-1).setValue(headers);
      }

  while (results.next()) {
    var rowString = '';
    for (var col = 0; col < numCols; col++) {
      rowString += results.getString(col + 1) + '\t';
      cell.offset(row +1, 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);
}
Edward Fraser

I've cracked it :).... For our SQL Server and google spreadsheets at least!

Thanks for all the help. I've been reading some of the issues here and now I'd like to share what you've helped me build. I've build a function that can take an SQL query and output the results to the spreadsheet its in.

To get the data on the spreadsheet you'll need to open a google spreadsheet and go 'Tool' > '<> script editor'. Then past the code bellow stating with and including "/****.....". Next you will have to update these bits in the code

var address = 'yourServerUrl:yourPortNumber';
var user = 'yourUserName';
var userPwd = 'yourPassword';
var db = 'yourDatabaseName';

Then you need to save it and return to the spread sheet and enter

=SQLTOGOOGLOOGLESPREADSHEET("yourSqlQuery")

Into the spreadsheet cell

/***********************

@CUSTOMFUNCTION

*/

function SQLTOGOOGLOOGLESPREADSHEET(sqlQuery) {
    var address = 'yourServerUrl:yourPortNumber';
    var user = 'yourUserName';
    var userPwd = 'yourPassword';
    var db = 'yourDatabaseName';
    var msSqlUrlSyntax ='jdbc:sqlserver://'

    var dbUrl = msSqlUrlSyntax + address + ';databaseName=' + db;

    // msSqlUrlSyntax = 'youOptionalTestingQuery'
    var conn = Jdbc.getConnection(dbUrl, user, userPwd);

    var start = new Date();
    var stmt = conn.createStatement();
    stmt.setMaxRows(1000);

    var results = stmt.executeQuery(sqlQuery);
    var numCols = results.getMetaData().getColumnCount();
    var numRows = results.getFetchSize()
    Logger.log(numRows)
    var dataArray = [];

    while (results.next()) {
        var rowString = [];   
        rowString = [];

        for (var col = 0; col < numCols; col++)     
        {
            rowString.push(results.getString(col + 1))
        }

        dataArray[dataArray.length]=rowString;
    }

    Logger.log("dataArray =" + dataArray)
    return dataArray

    results.close();
    stmt.close();

    var end = new Date();
    Logger.log('Time elapsed: %sms', end - start);
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!