2017-07-31 16 views
3

私は、GoogleスプレッドシートからmySQLデータベーステーブルにデータを書き込むために以下のコードを使用しています。このスクリプトは約4000レコードあり、非常に遅いです。すべてのGoogleスプレッドシートのデータをメモリに読み込んでから、MySQLデータベースに書き込むことはできますか?Google Appsスクリプトの実行を改善する

私の知る限りでは、あなたが

var data = sheet.getDataRange().getValues(); 

を使用しているとき、それはあなたの「シート1」は、メモリへの1つのチャンク内のシートなので、あなたがデータをやっている方法からのすべてのデータを読み込み、

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

答えて

1

できるだけ早く検索/閲覧が可能です。ただし、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); 
+1

スクリプトエディタで_View - 実行transcript_を選択すると、最後のスクリプト実行の詳細なタイミングを確認できます。 – Kos

関連する問題