如何使用批处理操作优化代码?

时间:2017-10-11 03:34:11

标签: google-apps-script google-sheets

我想对电子表格中的一系列值执行基本乘法,然后将这些值除以列中的值范围,请注意我的范围是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并除以位于单列中的值,每行的值都不同。

我的脚本极其缓慢地完成工作,批处理操作看起来很有希望,如果这不是最佳解决方案,我会接受任何其他替代解决方案而不管问题标题。

1 个答案:

答案 0 :(得分:4)

我认为这就是你要找的东西。

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替换以获取二维数组中的所有值。然后在循环结束时一次setValues。

好的做了另一个改变。获得更合理的结果。

enter image description here

我开始认为你可能根本不想要v循环。看看这个,看看Logger。我们只写一次数据。

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