2017-08-14 10 views
0

私はfirebaseデータベースからデータを取得し、Googleシート文書のデータを埋め込む次のコードを用意しました。 このプロセスには、1行あたり約1秒がかかり、1000行あります。Google Appsスクリプトが非常に遅く実行されます

私のコードはあまり効率的ではありませんか、Googleシートの行ごとに情報を記入するには良い方法がありますか?

function getAllData() { 
    var firebaseUrl = "url-here"; 
    var base = FirebaseApp.getDatabaseByUrl(firebaseUrl); 
    var data = base.getData(); 
    var iterator = 0 
    var obje = [] 
    //Logger.log(data) 
    for(var i in data) { 
    iterator++; 
    if (iterator > 5) { 
     break 
    } 

    if (data[i] !== null) { 
     Logger.log(data[i]); 
     obje.push(data[i]) 
    } 
    } 

    var range = SpreadsheetApp.getActiveSheet().getRange("A5:K5"); 
    range.setBackground("red"); 


    //Set Column Names 
    SpreadsheetApp.getActiveSheet().getRange('A5').setValue('Key'); 
    SpreadsheetApp.getActiveSheet().getRange('B5').setValue('Time'); 
    SpreadsheetApp.getActiveSheet().getRange('C5').setValue('Location'); 
    SpreadsheetApp.getActiveSheet().getRange('D5').setValue('Participant_1'); 
    SpreadsheetApp.getActiveSheet().getRange('E5').setValue('Participant_2'); 
    SpreadsheetApp.getActiveSheet().getRange('F5').setValue('Category'); 
    SpreadsheetApp.getActiveSheet().getRange('G5').setValue('team1Score'); 
    SpreadsheetApp.getActiveSheet().getRange('H5').setValue('team2Score'); 
    SpreadsheetApp.getActiveSheet().getRange('I5').setValue('gameDetails'); 


    var number = 5 
    Logger.log(obje.length); 
    for (var i in obje) { 
    Logger.log('Hello' + i) 
    number++ 


     if (i % 2 === 0) { 
     var range = SpreadsheetApp.getActiveSheet().getRange("A" + number + ":K" + number); 
     range.setBackground("lightblue"); 
     } 
    else { 
     var range = SpreadsheetApp.getActiveSheet().getRange("A" + number + ":K" + number); 
     range.setBackground("lightgreen"); 
    } 

    //Populate Row Data 
    SpreadsheetApp.getActiveSheet().getRange('A' + number).setValue(obje[i].Key); 
    SpreadsheetApp.getActiveSheet().getRange('B' + number).setValue(obje[i].Time); 
    SpreadsheetApp.getActiveSheet().getRange('C' + number).setValue(obje[i].Location); 
    SpreadsheetApp.getActiveSheet().getRange('D'+ number).setValue(obje[i].Participant_1); 
    SpreadsheetApp.getActiveSheet().getRange('E'+ number).setValue(obje[i].Participant_2); 
    SpreadsheetApp.getActiveSheet().getRange('F'+ number).setValue(obje[i].Category); 
    SpreadsheetApp.getActiveSheet().getRange('G'+ number).setValue(obje[i].team1Score); 
    SpreadsheetApp.getActiveSheet().getRange('H'+ number).setValue(obje[i].team2Score); 
    SpreadsheetApp.getActiveSheet().getRange('I'+ number).setValue(obje[i].gameDetails); 
    } 
} 
+2

getRangeを呼び出すたびに、あなたのケースが読み込まれ、ファイルに書き戻されます。これらの呼び出しを最小限に抑える必要があります。 Googls Apps Scriptのブログ記事「[スプレッドシートの最適化]」(http://googleappsscript.blogspot.com/2010/06/optimizing-spreadsheet-operations.html) –

答えて

0

データが2次元配列にある場合、これは機能するはずです。 これはうまくいきません。私は行って、Firebase Todayについて何かを学びました。それがオブジェクトの配列であることがわかったので、私はどのように作業を行い、戻って修正するかを理解します。私はいつもそれを行なわなければならないと思っています。これは

を働いている

function getAllData() 
{ 
    var firebaseUrl = "url-here"; 
    var base = FirebaseApp.getDatabaseByUrl(firebaseUrl); 
    var data = base.getData();//I assume this is correct I have not used firebase 
    var ss=SpreadsheetApp.getActive(); 
    var sh=ss.getActiveSheet(); 
    var headers=['Key','Time','Locaton','Participant_1','Participant_2','Category','teams1Score','team2Score','gameDetails']; 
    sh.appendRow(headers); 
    sh.getRange(2,1,data.length,headers.length).setValues(data); 
} 

ここexample from another contributorへのリンクだが、私はそれが仕事を得ることができませんでした。だから私はそれが少し下に変更:

function writeMySheets() { 
    var ss = SpreadsheetApp.getActive(); 
    var sheet = ss.getActiveSheet(); 
    var firebaseUrl = "https://PROJECTID.firebaseio.com/"; 
    var secret = "SECRET"; 
    var base = FirebaseApp.getDatabaseByUrl(firebaseUrl,secret); 
    var data = base.getData(); 
    var keys = Object.keys(data); 
    var sheetRow = []; 
    var entryKeys; 
    var firstTime=true; 
    for (index in keys) { 
    sheetRow = []; 
    entryKeys = Object.keys(data[keys[index]]) 
    for (i in entryKeys) { 
     sheetRow.push(data[keys[index]][entryKeys[i]]); 
    } 
    //Logger.log(sheetRow); 
    if(firstTime) 
    { 
     sheet.appendRow(entryKeys);//Prints column headers 
     firstTime=false; 
    } 
    sheet.appendRow(sheetRow);        
    } 
} 

そして、これは私が仕事を得ることはありませんだろうと思ってQuickStart tutorialからチュートリアルデータ上の作品に思えます。

+0

ありがとうございました!私は別の方法を考え出した! –

関連する問題