Ale*_*ado 0 google-sheets google-apps-script
我想对电子表格中的一系列值执行基本乘法,然后将这些值除以列中的一系列值,请注意,我的范围是 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它非常慢,它从工作表中的每个单元格上读取和写入,其中我准备好将数值乘以 100 并除以位于单列中的值,每一行的值都不同。
我的脚本完成工作非常缓慢,批处理操作看起来很有希望,如果这不是最佳解决方案,我将接受任何其他替代解决方案,无论问题标题如何。
我想这就是你要找的。
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);
}
Run Code Online (Sandbox Code Playgroud)
尽量减少 getValue 的使用,并用一个 getValues 替换以获取二维数组中的所有值。然后在循环结束时一次性设置所有值。
好吧,又做了一个改动。得到更合理的结果。
我开始认为您可能根本不需要 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);
}
Run Code Online (Sandbox Code Playgroud)
这是此版本的输出。
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |