2017-03-06 29 views
0

Googleシートの行全体をループし、一部のデータをあるシートから別のシートにコピーしようとしています。リストは時間の経過とともに長くなります。Google Appsスクリプトを使用して列全体をループする

具体的には:列Bの入力が「青」に等しい場合は、列Aと列Cの値を別のシートにコピーします。 これは、列の最後まですべての列に対して行います。私のスプレッドシートへ

リンク:色が等しくない青を行う際https://docs.google.com/spreadsheets/d/1xnLygpuJnpDfnF6LdR41gN74gWy8mxhVnQJ7i3hv1NA/edit?usp=sharing

  • ループが停止します。どうして?
  • ご覧のとおり、forループを使用しました。それも行く方法ですか?
  • コード実行の速度について何かできますか?

すべてのコメント、ヒント、またはヘルプは高く評価されます。

よろしくお願いいたします。

答えて

3

をあなたは "という名前の入力シートを持っていた機能を定義し、最初リスト "と私は出力シートの名前を"出力 "。そしてここにコードがあります。

function condCopy() 
{ 
    var s = SpreadsheetApp.getActiveSpreadsheet(); 
    var sht = s.getSheetByName('List') 
    var drng = sht.getDataRange(); 
    var rng = sht.getRange(2,1, drng.getLastRow()-1,drng.getLastColumn()); 
    var rngA = rng.getValues();//Array of input values 
    var rngB = [];//Array where values that past the condition will go 
    var b = 0;//Output iterator 
    for(var i = 0; i < rngA.length; i++) 
    { 
    if(rngA[i][1] == 'blue') 
    { 
     rngB[b]=[];//Initial new array 
     rngB[b].push(rngA[i][0],rngA[i][2]); 
     b++; 
    } 
    } 
    var shtout = s.getSheetByName('Output'); 
    var outrng = shtout.getRange(2,1,rngB.length,2);//Make the output range the same size as the output array 
    outrng.setValues(rngB); 
} 
1

2つの選択肢があります。最初に、Googleスプレッドシートの標準のquery()関数を使用して値を取得します。ここでの欠点は、それが値の参照に過ぎないことです。ですから、これを使用するになど、それらを並べ替えることができない、セルA1にこれを配置し、それがヘッダを引っ張ると、列Aの値とを取得しますC:Google Appsのスクリプトの答えを

=QUERY(A:C, "select A, C where B = 'blue'", 1) 

: この意志ループリストのシートを通って、すべての行の列Bは、それが列Aと新しいシートのBに列AとCの値を保存しますです:もちろん

function doIt(){ 
    var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4"); 
    var lastRow = activeSheet.getLastRow(); 
    var lastCol = activeSheet.getLastColumn(); 
    var targetValues = []; 

    var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("List"); 
    var lastSourceRow = sourceSheet.getLastRow(); 
    var lastSourceCol = sourceSheet.getLastColumn(); 

    var sourceRange = sourceSheet.getRange(1, 1, lastSourceRow, lastSourceCol); 
    var sourceData = sourceRange.getValues(); 

    var activeRow = 0; 

    //Loop through every retrieved row from the Source 
    for (row in sourceData) { 
    //IF Column B in this row has 'blue', then work on it. 
    if (sourceData[row][1] === 'blue') { 
     //Save it ta a temporary variable 
     var tempvalue = [sourceData[row][0], sourceData[row][2]]; 
     //then push that into the variables which holds all the new values to be returned 
     targetValues.push(tempvalue); 
    } 
    } 

    //Save the new range to the appropriate sheet starting at the last empty row 
    activeSheet.getRange(lastRow + 1, 1 , targetValues.length, 2).setValues(targetValues); 
} 

、あなたが渡すことができます2行を置換して関数にテストする値。

function doIt(testingvar){ 

を渡された変数にハードコードされたテストを交換するtestingvarという変数、およびテストラインを渡す:

if (sourceData[row][1] === testingvar) { 
関連する問題