2017-10-11 72 views
0

我想對電子表格中的一系列值執行基本乘法,然後將這些值除以列中的一系列值,請注意,我的範圍是8列長,並且我的分割範圍是一列長。如何使用批量操作優化我的代碼?

我有這樣的代碼:

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); 
     } 
    }   
    } 
} 

這是非常慢的,它讀取並從片材,其中我有數值準備乘以100並通過位於單個的值除以寫在每個單元列,這個值對於每一行都是不同的。

我的腳本極其緩慢地完成了工作,批量操作似乎很有前途,如果這不是最佳解決方案,我將接受任何其他備用解決方案,而不考慮問題標題。

回答

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,使用一個替代的GetValues來獲得在二維陣列中的所有值。然後在循環結束時一次設置所有值。

好吧做了另一個改變。獲得更合理的結果。

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

我剛剛對第二個循環進行了更改,因此它不會訪問最後一列中的數據。 – Cooper