Требуется более быстрый код для ретрансляции / публикации SQL-запроса в электронную таблицу

#sql-server #google-apps-script

#sql-сервер #google-apps-script

Вопрос:

У меня есть соединение JDBC в Google sheets для запроса моего 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:

Это так медленно, потому что вы записываете каждое отдельное значение с помощью отдельного вызова таблицы.

Гораздо быстрее подготовить 2d-массив и записать все сразу. Что-то вроде этого (не тестировалось)

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

Комментарии:

1. Спасибо, я изучу 2d-массив и поработаю над тем, чтобы заставить это работать. Простое знание того, что нужно Google, очень помогает.

2. Попробуйте заменить все от ячейки до конца while моим кодом. Надеюсь, это должно сработать

3. Я думаю, что это очень близко к работе. Он выполняется без ошибок, но выходных данных нет. Расшифровка выполнения показывает, что он также получает данные.

4. Вот ключевая часть протокола выполнения: [16-10-19 10:42:47:643 CDT] Sheet.getRange([1, 1, 4341, 6]) [0.001 секунды] [16-10-19 10:42:49:685 CDT] Range.setValues([[[Эмили Бромли, 1976, 2016-09-29 13:45:16.243, Общий список 2, реклама Pro Pest STL, 0.00], [Эмили Бромли, 1976, 2016-09-29 13:45:05.54, Общий список 2, реклама Pro Pest STL, 0.00], [Эмили Бромли, 1976, 2016-09-29 13:43:10.96, , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , , , ], [, , , ,

5. Можете ли вы отладить сценарий перед выводом. проверьте длину и посмотрите на структуру вывода? Вызов getRange, похоже, работает, но вызов делает его похожим на одноэлементный массив, содержащий 2d-массив.