#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-массив.