2016-07-05 97 views
1

批量插入谷歌應用腳​​本。我正在使用push將表中的數據寫入表單。有沒有辦法做批量插入3000條記錄,並通過觸發器循環幾分鐘後執行,直到所有記錄插入谷歌應用程序腳本。批量插入谷歌應用腳​​本

function myBatchInsert() { 
 
    var connection = Jdbc.getConnection("jdbc:mysql://host:port", "user", "passwrd"); 
 
    var query = connection.createStatement(); 
 
    var result = query.executeQuery('SELECT * FROM Table WHERE'); 
 
    var googlespreadsheet; 
 
    var sheet; 
 
    var googlespreadsheetSheetName = "Table"; 
 

 
    googlespreadsheet = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId()); 
 

 
    var datasheet = googlespreadsheet.getSheetByName("Table"); 
 
    datasheet.setName("Table"); 
 

 
    SpreadsheetApp.setActiveSpreadsheet(googlespreadsheet); 
 
    sheet = SpreadsheetApp.setActiveSheet(googlespreadsheet.getSheetByName(googlespreadsheetSheetName)); 
 

 
    var columncount = result.getMetaData().getColumnCount(); 
 
    var columnName; 
 

 
    for (var column = 1; column <= columncount; column++) { 
 
     sheet.getRange(1, column).setValue(result.getMetaData().getColumnName(column)); 
 
    } 
 

 
    var document = SpreadsheetApp.getActiveSpreadsheet(); 
 
    var cell = document.getRange('A2'); 
 
    var row = 0; 
 
    var data = []; 
 

 
    for (var i = 0; i < 1; i++) { 
 
     while (result.next()) { 
 
     var rowData = []; 
 
     for (var column = 0; column < result.getMetaData().getColumnCount(); column++) { 
 
      rowData.push(result.getString(column + 1)); 
 
     } 
 
     data.push(rowData); 
 
     } 
 

 
     sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data); 
 
    } 
 

 
    result.close(); 
 
    query.close(); 
 
    connection.close(); 
 
    }

回答

-2

你可以嘗試閱讀Batching(但它更多的是對添加到數據庫比寫張)。

Use batch operations

腳本通常需要從電子表格中讀取數據,進行計算,然後寫出來的數據結果以電子表格。 Google Apps腳本已經有了一些內置優化功能,例如使用預讀緩存來檢索腳本可能獲得的內容,並編寫緩存以保存可能設置的內容。

通過最大限度地減少讀取和寫入次數,您可以編寫腳本以最大限度地利用內置緩存。交替讀取和寫入命令很慢。要加速腳本,請使用一個命令將所有數據讀入數組,然後對數組中的數據執行任何操作,然後使用一個命令寫入數據。


有關於將數據添加到表,但可以有效地使用功能來優化你的代碼沒有批處理功能。

//請勿使用此代碼。這是SLOW,INEFFICIENT代碼的一個例子。 //僅供演示 var cell = sheet.getRange('a1'); (var y = 0; y < 100; y ++){ xcoord = xmin; (var x = 0; x < 100; x ++){ var c = getColor_(xcoord,ycoord); cell.offset(y,x).setBackgroundColor(c); xcoord + = xincrement; } ycoord - = yincrement; SpreadsheetApp.flush(); }

該腳本效率低下:循環100行100列,連續寫入10,000個單元格。 Google Apps腳本回寫緩存有幫助,因爲它會在每行末尾使用刷新強制回寫。由於緩存,對電子表格只有100個調用。

但是,通過批處理調用,代碼可以變得更高效。下面是在該單元格範圍被讀入的陣列稱爲顏色的重寫,對所述陣列中的數據進行顏色賦值操作,並且陣列中的值被寫入到電子表格:

// OKAY TO USE THIS EXAMPLE or code based on it. 
var cell = sheet.getRange('a1'); 
var colors = new Array(100); 
for (var y = 0; y < 100; y++) { 
xcoord = xmin; 
colors[y] = new Array(100); 
for (var x = 0; x < 100; x++) { 
colors[y][x] = getColor_(xcoord, ycoord); 
xcoord += xincrement; 
} 
ycoord -= yincrement; 
} 
sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors); 

低效代碼需要大約70秒才能運行。高效的代碼在1秒內運行!