Querying SQL Server with Google Apps Script via JD

2019-02-15 19:11发布

I'm using SQL Server 2008 R2 and am trying to query it using Google Apps Script. I'm using one of the suggested scripts that's supposed to populate a spreadsheet but i'm having problems connect with SQL.

I've checked the port i've specified is correct so I doubt the issue is that, i'd really appreciate confirmation that my connection string is right.

Here's the code -

server/instance:1433;databaseName=xxxx;user=xxxx;password=xxxx");

function foo() {
  var conn = Jdbc.getConnection   ("jdbc:sqlserver/instance:1433;databaseName=xxxx;user=xxxx;password=xxxx");
  var stmt = conn.createStatement();
  stmt.setMaxRows(100);
  var start = new Date();
  var rs = stmt.executeQuery("select top 1000 from SOP10100");

  var doc = SpreadsheetApp.getActiveSpreadsheet();
  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));
    cell.offset(row, 2).setValue(rs.getString(3));
    cell.offset(row, 3).setValue(rs.getString(4));
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
  var end = new Date();
  Logger.log("time took: " + (end.getTime() - start.getTime()));

Thanks for your help!

3条回答
不美不萌又怎样
2楼-- · 2019-02-15 19:49

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();
}
查看更多
We Are One
3楼-- · 2019-02-15 19:56

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);
}
查看更多
闹够了就滚
4楼-- · 2019-02-15 20:07

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);
}
查看更多
登录 后发表回答