2017-04-14 32 views
0

私はCSVファイルをインポートするスクリプトを持っています。 それは動作しますが、それは私の意見では本当に遅いです。 CSVファイルがかなり大きいので、スクリプトは最大実行時間を超えています。GASでのCSVのインポートが遅すぎる

私のコードのスピードを上げる方法の提案はありますか?

FYI: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

うまくいけば、次のコードは速く実行されます。このコードはすべてのデータをアセンブルし、一度に1行ずつ追加するのではなく、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にプッシュし、forループからsetValuesを移動しました)。スクリプトは数秒で実行されます! – Casper

+0

投票に感謝し、結果をお知らせください。ループの中で 'setValues()'を動かすという重大な変化について答えを更新しました。 –

+0

さらに改善があります。新しい2D配列を作成する必要はありません.parseCsv関数はすでに2D配列を返していますので、その結果(データ変数)を直接setValuesに渡すことができます。複数のforループ専用の13行を簡単に削除できます。 –

関連する問題