2017-10-11 9 views
0

私はスプレッドシート内のある範囲の値に対して基本的な乗算を行い、それらの値を列の値の範囲で除算したいと考えています。範囲は8列、分割範囲は1列です。バッチ操作を使用してコードを最適化するにはどうすればよいですか?

私はこのコードを持っている:

それは、それは非常に遅い読み込み、私は100を掛け、シングルに位置値で除算する準備ができて数値を持つシートから各セルに書き込んだ
function multiply() { 
    var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("1iXQxyL3URe1X1FgbZ76mEFAxLnxegyDzXOMF6WQ5Yqs")); 
    var sheet = doc.getSheetByName("json"); 
    var sheet2 = doc.getSheetByName("tabla de frecuencias"); 
    var sheet3 = doc.getSheetByName("Template"); 

    var range = sheet2.getDataRange(); 
    var numRows = range.getNumRows(); 
    var numCols = range.getNumColumns()-1; //This will get the division values which are located in the last column 
    var targ = sheet2.getLastColumn(); 

    for (var i = 2; i <= numRows; i++) { 
    for (var j = 2; j <= numCols; j++) { 
     var A = range.getCell(i,j).getValue(); 
     var value = A; 
     for (var v = 1; v <= numRows; v++) { 

     var T = range.getCell(v,targ).getValue(); 

     range.getCell(i,j).setValue(value*100/T); 
     } 
    }   
    } 
} 

この値は行ごとに異なります。

私のスクリプトは仕事が極端に遅くなり、バッチ操作が有望に見えますが、それが最良の解決策ではない場合、私は質問のタイトルにかかわらず他の代替ソリューションを受け入れます。

答えて

3

私はこれがあなたの探しているものだと思います。

function multiply() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var sh=ss.getSheetByName("Sheet60"); 
    var rg=sh.getDataRange(); 
    var dataA=rg.getValues(); 
    for(var i=1;i<dataA.length;i++) 
    { 
    for(var j=1;j<dataA[0].length-1;j++) 
    { 
     var value=dataA[i][j]; 
     for (var v=1;v<dataA.length;v++) 
     { 
     var T=dataA[v][dataA[0].length-1];//the value in the last column on this row 
     Logger.log('v=%s dataA[%s][%s]=%s',v,i,j,dataA[i][j]); 
     dataA[i][j]=value * 100/T;//This seems wrong because it puts a different value into dataA[i][j] which doesn't change inside this inner loop and so only the last value remains in dataA[i][j] 
     } 
    }   
    } 
    rg.setValues(dataA); 
} 

getValueの使用を最小限に抑え、1つのgetValuesで置き換えて2次元配列のすべての値を取得してください。次に、ループの最後に一度にsetValuesを実行します。

もう一度変更しました。より合理的な結果を得る。

enter image description here

私はあなたが実際にすべてのVループを望まないかもしれないと思い始めています。これを見て、ロガーを見てください。データを一度書きます。

function percentages() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var sh=ss.getSheetByName("Sheet60"); 
    var rg=sh.getDataRange(); 
    var dataA=rg.getValues(); 
    for(var i=1;i<dataA.length;i++) 
    { 
    for(var j=1;j<dataA[0].length-1;j++) 
    { 
     var value=dataA[i][j]; 
     var T=dataA[i][dataA[0].length-1]; 
     dataA[i][j]=value * 100/T; 
     Logger.log('dataA[%s][%s]=%s',i,j,dataA[i][j]); 
    }   
    } 
    rg.setValues(dataA); 
} 

これはこのバージョンの出力です。

enter image description here

+0

ノー成功を収めてスクリプトを試してみましたが、あなたは私を理解するための説明を支援するため、各行をコメントしますか? –

+0

スプレッドシートを共有できますか? – Cooper

+0

最後の列のデータにアクセスしないように、2番目のループに変更を加えました。 – Cooper

関連する問題