2017-04-14 59 views
0

我有一個導入CSV文件的腳本。 雖然有效,但在我看來確實很慢。 由於CSV文件非常大,腳本超出了最大執行時間。在GAS中導入CSV - 太慢

有沒有人有關於如何提高我的代碼速度的建議?

僅供參考:由於S3身份驗證,我無法使用內置的表格功能。

function myFunction() { 

    var liquidityBalance = SpreadsheetApp.openByUrl(liquidityBalanceSheet).getSheetByName('Liquidity'); 
    var s3 = S3.getInstance(awsAccessKeyId, awsSecretKey); 

    var fromS3 = s3.getObject(bucket, file); 
    var data = Utilities.parseCsv(fromS3.getDataAsString(), '\t'); 
    var csv = [] 
    liquidityBalance.clearContents(); 
    for (var i = 0; i < data.length; i++) { 
    var row = [] 
    for (var a = 0; a < data[i].length; a++) { 
     row.push(data[i][a]); 
    } 
    liquidityBalance.appendRow(row); 
    } 
} 

回答

1

希望以下代碼運行得更快。此代碼組裝所有數據,然後將組合的數據寫入一個動作,而不是一次追加一行。如果代碼仍然超時,那麼您將需要運行部分數據量,並知道上次停止的位置以繼續下一批次。

function myFunction() { 
    var a,csv,data,fromS3,i,L,L2,lastRow,liquidityBalance, 
     outerArray,row,s3,thisRow; 

    liquidityBalance = SpreadsheetApp.openByUrl(liquidityBalanceSheet).getSheetByName('Liquidity'); 
    s3 = S3.getInstance(awsAccessKeyId, awsSecretKey); 

    fromS3 = s3.getObject(bucket, file); 
    data = Utilities.parseCsv(fromS3.getDataAsString(), '\t'); 
    csv = []; 

    lastRow = liquidityBalance.getLastRow(); 

    liquidityBalance.clearContents(); 

    outerArray = []; 

    L = data.length; 
    L2 = data[0].length;//Number of elements in an inner array 

    for (i = 0; i < L; i++) { 
    row = [];//reset on every loop 
    thisRow = data[i]; 

    for (a = 0; a < L2; a++) { 
     row.push(thisRow[a]); 
    } 

    outerArray.push(thisRow); 
    } 

    liquidityBalance.getRange(lastRow + 1, 1, outerArray.length, L2).setValues(outerArray); 
} 
+1

謝謝桑迪。我已經對代碼做了一些小改動(lastRow變量不是必須的,每次都需要乾淨的表單導入;將行推送到outerArray;將setValues移出for循環)。腳本現在運行幾秒鐘! – Casper

+0

感謝您的投票並讓我知道結果。我更新了將'setValues()'移出循環的關鍵變化的答案。 –

+0

還有一個改進。你不需要創建一個新的2D數組,parseCsv函數已經返回一個二維數組,因此你可以直接將它的結果(數據變量)傳遞給setValues - 你可以很容易地刪除那些專用於多個for循環的13條線。 –