我正在使用下面的代码将数据从谷歌电子表格写入到mySQL数据库表中,这个脚本过去工作得很好,当它有大约4000条记录时,现在它有超过8000条记录,运行速度非常慢。是否有办法将所有谷歌电子表格数据读取到内存中,然后将其写入MySQL数据库。
function myfunction() {
var colA;
var colB;
var colC;
var colD;
var colE;
var mysqldb = Jdbc.getConnection("jdbc:mysql;dbipaddress","user","pa$$word");
var sql = mysqldb.createStatement();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
var data = sheet.getDataRange().getValues();
mysqldb.setAutoCommit(false)
var query = "{call [dbo].[sp_copygsheets](?,?,?,?,?)}";
sql = mysqldb.prepareCall(query);
for (var i = 1; i < data.length; i++) {
colA = data[i][0];
colB = data[i][1];
colC = data[i][2];
colD = data[i][3];
colE = data[i][4];
sql.setString(1, colA);
sql.setString(2, colB);
sql.setString(3, colC);
sql.setString(4, colD);
sql.setString(5, colE);
sql.addBatch();
}
sql.executeBatch();
mysqldb.commit();
sql.close();
mysqldb.close();
}发布于 2017-08-01 11:19:25
据我所知,当您使用
var data = sheet.getDataRange().getValues();它将所有数据从"sheet1“表中读取到内存中,因此您进行数据检索/读取的方式似乎尽可能快。但是,请注意,getDataRange()将包含文本的矩形读取到内存中,因此,如果您可以对数据进行假设,例如,您有多少列-在这种情况下,您只能使用getRange(row,column,numRows,numColumns)将某些部分读取到内存中,则可以对此进行优化。
我认为可能会减慢您的速度的是您在转换部分的for循环,但我不确定,因此您可以通过使用以下代码来测量时间性能来追踪性能问题的根源:
var start = new Date().getTime();
// Insert test code here
var end = new Date().getTime();
Logger.log(end - start);https://stackoverflow.com/questions/45424822
复制相似问题