需要更快的代码来将SQL查询中继/发布到电子表格

时间:2016-10-19 14:55:33

标签: sql-server google-apps-script

我在google工作表中有一个JDBC连接来查询我的sql server。我是JDBC的新手,所以我拼凑了其他人的代码,它确实有效,但似乎当查询有很多输出时需要很长时间才能写入工作表。

你能否告诉我是否有更好/更有效的代码将它放入行和列中而不是我正在使用的代码。我只关心代码的输出部分。

function createtestDispositionHistoryTable() {
  var conn = Jdbc.getConnection("jdbc:sqlserver://123.45.67.89;databaseName=dbname","me","myPassword");
  var stmt = conn.createStatement();
  var rs = stmt.executeQuery("SELECT agent.firstname, agentdispositionhistory.dispositionid, agentdispositionhistory.dispositiontime, leadlist.name, program.name, agentdispositionhistory.sale\
                              FROM agentdispositionhistory\
                              INNER JOIN lead\
                              ON agentdispositionhistory.leadid=lead.id\
                              INNER JOIN leadlist\
                              ON lead.leadlistid=leadlist.id\
                              INNER JOIN program\
                              ON leadlist.programid=program.id\
                              INNER JOIN agent\
                              ON agentdispositionhistory.agentid=agent.id\
                              WHERE agentdispositionhistory.dispositionid IN\
(1971,\
1976,\
1977,\
1978,\
1979,\
1980,\
1982,\
1983,\
1984,\
1995,\
2000,\
2001,\
2002,\
2003,\
2004,\
2006,\
2007,\
2008,\
2019,\
2023,\
2025,\
2026,\
2027,\
2029,\
2030,\
2031,\
2032)");

  var doc = SpreadsheetApp.getActiveSpreadsheet();
  doc.insertSheet('Agent Disposition Table test');
  var sheet = doc.getSheets()[0];
  doc.appendRow(["Name", "Disposition", "Date", "Lead List", "Program", "Sale"]);

  var cell = doc.getRange('a1');
  var row = 1;
  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));
    cell.offset(row, 4).setValue(rs.getString(5));
    cell.offset(row, 5).setValue(rs.getString(6));
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
}

我指的具体部分是:

var cell = doc.getRange('a1');
      var row = 1;
      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));
        cell.offset(row, 4).setValue(rs.getString(5));
        cell.offset(row, 5).setValue(rs.getString(6));       
        row++;

感谢任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:1)

它很慢,因为您通过单独调用工作表来编写每个值。

准备一个二维数组并一次写入所有内容要快得多。 这样的事情(未经测试)

var output = [];
var rowData;

while(rs.next()) {
  rowData = [1,2,3,4,5,6].map(function(i) {
    return rs.getString(i);
  });
  output.push(rowData);
}

if (output.length) {
  doc.getRange(1, 1, output.length, output[0].length).setValues(output);
}