2017-10-25 10 views
0

セルの値に基づいて行を移動しようとしていますが、私が書いた関数が機能します。ただし、スクリプトをタイムアウトさせるために24行を超える行がある場合。常にタイムアウトになるので、ループをより高速または効率的に実行する方法はありますか?Google App Script - Googleスプレッドシートセルの値に基づいて行を効率的に移動

このスクリプトは列7(G)のセル値を読み取り、販売人名の1つと一致する場合は、その名前を持つシートにコピーします。ここで

function CopyDataToNewFile() { 
 
    
 
    // How Many Columns over to copy 
 
    var columsCopyCount = 11; // A=1 B=2 C=3 .... 
 
    
 
    // What Column to Monitor 
 
    var columnsToMonitor = 7; // A=1 B=2 C=3 ....MONITORS SALES PERSON NAME 
 
    
 
    //TARGET SPREAD SHEETS 
 
    var salesPerson1 = "Lorna"; 
 
    var salesPerson2 = "Sarah"; 
 
    var salesPerson3 = "Mark"; 
 
    
 
    //SOURCE SPREAD SHEET 
 
    var ss = SpreadsheetApp.openById('1S3F0Dekyda4g77j_a150Obz0IDNKtWMU2WlGDSXdcD4'); 
 
    var sourceSpreadSheetSheetID = ss.getSheetByName("importdata"); 
 
    var sourceSpreadSheetSheetID1 = ss.getSheetByName(salesPerson1); 
 
    var sourceSpreadSheetSheetID2 = ss.getSheetByName(salesPerson2); 
 
    var sourceSpreadSheetSheetID3 = ss.getSheetByName(salesPerson3); 
 
    
 
    var numRows = sourceSpreadSheetSheetID.getLastRow()+1; 
 
    
 
    
 
    for(var i = 2; i < numRows; i++) 
 
    { 
 
    var r = sourceSpreadSheetSheetID.getRange(i, columnsToMonitor); 
 

 
    var rValue = r.getValue(); 
 
    
 
    if(rValue == salesPerson1) { 
 
     var targetRange = sourceSpreadSheetSheetID1.getRange(sourceSpreadSheetSheetID1.getLastRow() + 1, 1); 
 
     sourceSpreadSheetSheetID.getRange(i, 1, 1, columsCopyCount).copyTo(targetRange), {contentsOnly: true}; 
 
     //sourceSpreadSheetSheetID.deleteRow(i); 
 
    
 
    }else if (rValue == salesPerson2) { 
 
     var targetRange = sourceSpreadSheetSheetID2.getRange(sourceSpreadSheetSheetID2.getLastRow() + 1, 1); 
 
     sourceSpreadSheetSheetID.getRange(i, 1, 1, columsCopyCount).copyTo(targetRange), {contentsOnly: true}; 
 
     //sourceSpreadSheetSheetID.deleteRow(i); 
 
     
 
    }else if (rValue == salesPerson3) { 
 
     var targetRange = sourceSpreadSheetSheetID3.getRange(sourceSpreadSheetSheetID3.getLastRow() + 1, 1); 
 
     sourceSpreadSheetSheetID.getRange(i, 1, 1, columsCopyCount).copyTo(targetRange), {contentsOnly: true}; 
 
     //sourceSpreadSheetSheetID.deleteRow(i); 
 
    
 
    }else {//Fail Safe 
 
     var targetRange = sourceSpreadSheetSheetID1.getRange(sourceSpreadSheetSheetID1.getLastRow() + 1, 1); 
 
     sourceSpreadSheetSheetID.getRange(i, 1, 1, columsCopyCount).copyTo(targetRange), {contentsOnly: true}; 
 
     //sourceSpreadSheetSheetID.deleteRow(i); 
 
    } 
 
    
 
    } 
 
    
 
}

スクリプトを使用してシートのコピーです。スクリプトはスクリプトエディタから実行できます。

Google Sheet Link

私は以下のコードを最適化しているあなたに

答えて

1

ありがとうございます。現在、実行時間は0.864秒です。

function CopyDataToNewFile() { 

    // How Many Columns over to copy 
    var columsCopyCount = 11; // A=1 B=2 C=3 .... 

    // What Column to Monitor 
    var columnsToMonitor = 7; // A=1 B=2 C=3 ....MONITORS SALES PERSON NAME 

    //TARGET SPREAD SHEETS 
    var salesPerson1 = "Lorna"; 
    var salesPerson2 = "Sarah"; 
    var salesPerson3 = "Mark"; 

    //SOURCE SPREAD SHEET 
    var ss = SpreadsheetApp.openById('164nb8HbOPX8204KFlrF0BZeuZ-rCjoxojYT5jvEIuNU'); 
    var sourceSpreadSheetSheetID = ss.getSheetByName("importdata"); 
    var sourceSpreadSheetSheetID1 = ss.getSheetByName(salesPerson1); 
    var sourceSpreadSheetSheetID2 = ss.getSheetByName(salesPerson2); 
    var sourceSpreadSheetSheetID3 = ss.getSheetByName(salesPerson3); 

    var data = sourceSpreadSheetSheetID.getRange(2, 1, sourceSpreadSheetSheetID.getLastRow() - 1, sourceSpreadSheetSheetID.getLastColumn()).getValues(); 

    var lorna = []; 
    var sarah=[]; 
    var mark=[]; 


    for (var i = 0; i < data.length; i++) { 

     var rValue = data[i][6]; 

     if (rValue == salesPerson1) { 
      lorna.push(data[i]); 
     } else if (rValue == salesPerson2) { 
      sarah.push(data[i]); 
     } else if (rValue == salesPerson3) { 
      mark.push(data[i]); 
     } else { //Fail Safe 
      lorna.push(data[i]); 
     } 
    } 

    if(lorna.length > 0){ 
     sourceSpreadSheetSheetID1.getRange(sourceSpreadSheetSheetID1.getLastRow() + 1, 1, lorna.length, lorna[0].length).setValues(lorna); 
    } 

    if(sarah.length > 0){ 
     sourceSpreadSheetSheetID2.getRange(sourceSpreadSheetSheetID2.getLastRow() + 1, 1, sarah.length, sarah[0].length).setValues(sarah); 
    } 

    if(mark.length > 0){ 
     sourceSpreadSheetSheetID3.getRange(sourceSpreadSheetSheetID3.getLastRow() + 1, 1, mark.length, mark[0].length).setValues(mark); 
    } 

    //Will delete the rows of importdata once the data is copided to other sheets 
    sourceSpreadSheetSheetID.deleteRows(2, sourceSpreadSheetSheetID.getLastRow() - 1); 
} 
+1

素晴らしい!迅速な対応に感謝します。それは完璧に動作し、シート全体を即座に処理します。 –

+0

最後の1つの質問で、この最後の行が行をクリアします。移動された行を完全に削除すると、データ間に空の行がありません。ありがとうございます –

+1

私はコードを変更しました。 – Ritz

関連する問題