如何使用批量操作优化我的代码? [英] How can I optimize my code using batch operations?

查看:71
本文介绍了如何使用批量操作优化我的代码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想对电子表格中的一系列值执行基本乘法,然后将这些值除以列中的一系列值,请注意,我的范围是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; //这将得到位于最后一列的除法值
var targ = sheet2.getLastColumn(); (var j = 2; j <= numCols; j ++){
var A($ var $ = $; $ i

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

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

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




$ / code $ / pre
$ b $ p

非常慢,它读取和写入表单中的每个单元格,其中数值已经可以乘以100,并且除以位于单列中的值,该值对于每一行都是不同的。



我的脚本极其缓慢地完成了工作,批量操作似乎很有前途,如果这不是最好的解决方案,我将接受任何其他备用解决方案,而不管问题标题如何。



$ b

   

函数multiply()
{
var ss = SpreadsheetApp.getActive();
var sh = ss.getSheetByName(Sheet60);
var rg = sh.getDataRange();
var dataA = rg.getValues(); (var j = 1; j< dataA [0] .length-1; j ++)$ b($ i = 1; i< dataA.length; i ++)
$ b {
var value = dataA [i] [j];
for(var v = 1; v< dataA.length; v ++)
{
var T = dataA [v] [dataA [0] .length-1]; // value在这一行的最后一列
Logger.log('v =%s dataA [%s] [%s] =%s',v,i,j,dataA [i] [j]);
dataA [i] [j] = value * 100 / T; //这看起来不对,因为它在dataA [i] [j]中输入了一个不同的值,它不会在这个内部循环中改变,所以只有最后的值仍然在dataA [i] [j]
}
}
}
rg.setValues(dataA);
}

尽量减少getValue的使用,并用一个getValues来取代所有值在二维数组中。然后在循环结束时一次性设置所有值。



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





我是开始认为你可能根本不需要v循环。看看这个,看看记录器。

 函数百分比()
{
var ss = SpreadsheetApp.getActive ();
var sh = ss.getSheetByName(Sheet60);
var rg = sh.getDataRange();
var dataA = rg.getValues(); (var j = 1; j< dataA [0] .length-1; j ++)$ b($ i = 1; i< dataA.length; i ++)
$ b {
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);
}

这是此版本的输出。




I want to perform a basic multiplication on a range of values in my spreadsheet, and then divide those values by a range of values from a column, note that my range is 8 columns long and my division range is one column long.

I have this code:

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

It's very slow, it reads and writes on each cell from a sheet where I have numeric values ready to be multiplied by 100 and divided by a value located in a single column, this value is different for each row.

My script gets the job done extremly slowly, batch operations appear promising, if that's not the best solution, I will accept any other alternate solution regardless of the question title.

解决方案

I think this is what your looking for.

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

Try to minimize the use of getValue and replace with one getValues to get all values in two dimensional array. Then setValues all at one time at the end of the loop.

Okay made another change. Getting more reasonable results.

I'm beginning to think that you may not actually want the v loop at all. Take a look at this one and look at the Logger. We just write the data once.

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

This is the output for this version.

这篇关于如何使用批量操作优化我的代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆