2016-10-30 9 views
-3

私はいくつかのシートを持つ1つのスプレッドシートを持っています。私は1つの範囲のデータを取得し、それをフィルタリングし、フィルタリングされたデータのsetvaluesを別のシートに加えたいとします。 私はそれを行うことができます.getvaluesとその配列内のすべての値をループし、私は新しい配列に必要なものをプッシュし、新しいシートに.setvalue(行ごと)を押します。 私が本当に望むのは、バッチの.setvaluesを使ってたくさんのことをスピードアップすることです。 問題は、私は2番目の配列に値をプッシュし、3D配列で終わり、.setvaluesは2次元配列のみを受け入れることです。 私はたくさんの検索をしていて、同様の問題(herehere)が見つかりましたが、私の問題の解決策はありませんでした。 値を設定するために行ごとにループするよりも速い解決策が必要です。3D配列をGASの2D配列に変換するにはどうすればよいですか?

私のコードは次のようになります。

var shSales=ss.getSheetByName('Relação de Vendas'), lrowSales=shSales.getLastRow(); 
var shArchive=ss.getSheetByName('Hx Faturação') 
var shSalesData=shSales.getRange(7,1,lrowSales-6,15).getValues(); 
var InvoicedSales=[]; 
var deleted=0; 

for (var i in shSalesData) { 
    if (shSalesData[i][12]!=[] && shSalesData[i][13]!=[] && shSalesData[i][14]!=[]) { 
    InvoicedSales[i]=[]; 
    InvoicedSales[i].push(shSalesData[i]); 
    shSales.deleteRow((parseInt(i)+7)-deleted); 
    deleted++; 
    } 
} 
var lrowArchive=shArchive.getLastRow(); 
var range=shArchive.getRange(lrowArchive+1, 1, 2, 15); 
range.setValues(InvoicedSales); 

SpreadsheetApp.flush(); 

あなたは私のフィギュアこれを助けることはできますか?

+0

[MCVE]サンプル入力データを追加してくださいセルを占有するものの空白という真ん中に行と

a b c 1 2 3 

するスプレッドシートの値を設定します。 –

+1

'InvoicedSales.push(shSalesData [i]);'? –

+0

@RobinGertenbach私の答えを書いている間、あなたのコメントが上がった。可能な限り短期間で、あなたは正しいです。 OPについては、私の答えはまた、あなたがこの問題をどこに、なぜ持っているのかを説明します。私はそのコメントを投票するだろう! – Vytautas

答えて

1

私はあなたが最初から配列を作成していることから、代わりに3D配列に変わる場所を見つけて、スプレッドシートにプッシュしたい配列を構築する適切なアルゴリズムを持つことによってそれを防ぐ必要があります。だから、最初の行の後、我々はInvoicedSales[[]]を取得し、2行目の後に、あなたが今いるInvoicedSales[[[data]]]を持つことになります

InvoicedSales[i]=[]; 
InvoicedSales[i].push(shSalesData[i]); 

:あなたは問題が本当に、次の2行で起こることを見つけることができる迅速なデバッグと

3D配列。

この問題の簡単な解決方法は、前述したように、配列を別の方法で構築することです。これらの2行は、これの欠点は、あなたが空のスペースを保持したい場合、これは単にあなたのif文が収まらないデータを反映していない配列を作成するということです単に

InvoicedSales.push(shSalesData[i]); 

に置き換えることができます。だからコードがプッシュするだろう

for (var i in shSalesData) { 
    if (shSalesData[i][12]!=[] && shSalesData[i][13]!=[] && shSalesData[i][14]!=[]) { 
    InvoicedSales.push(shSalesData[i]); 
    shSales.deleteRow((parseInt(i)+7)-deleted); 
    deleted++; 
    } 
    else { 
    InvoicedSales.push([]) 
    } 
} 

:またあなたの配列に空白行を持つために、あなたはそのように、我々はの線に沿って何かを持っているでしょう、あなたのInvoicedSalesに空の配列をpushelseセグメントを含める必要がifが満たされたときにデータの配列InvoicedSalesに戻り、ifが満たされないときに空の配列をプッシュします。そうすれば、行1が基準を満たして行1としてプッシュされ、行3が基準を満たしていれば、出力配列では3番目の行になります。

これを実行してからsetValues()を使用すると、すべての空白行が特定の行にあるものがすべて消去されることに注意してください。だから、[[a,b,c],[],[1,2,3]]は関係なく、以前

+0

あなたの努力と優れた説明に感謝しますが、私は最初の行を削除するとき: 'InvoicedSales [i] = [];' _TypeErrorはundefinedのメソッド 'push'を呼び出せません_ 私は何か間違ったことをする必要がありますおそらく:-( –

+0

@JoséLuísSincereSepúlvedaただ行を削除するだけでは十分ではありません、あなたは 'InvoicedSales [i] .push(shSalesData [i]);'を持っていますので、 i] 'InvoicedSales [i]'から配列内の配列を期待していますが、代わりにメイン配列を使用したいのです – Vytautas

+0

私はそれを見逃してしまいました。あなたはこれで余暇を無駄にしています。 –

関連する問題