谷歌电子表格中关于数组公式的最佳实践问题
说我在A栏中有一列值。在B栏中,我乘以10.我可以使用整个范围的数组公式,或者在B列中制作第一个单独的公式并粘贴。
我的问题是哪个更好用?数组更快计算?从速度的角度来看,有什么好处吗?我有很大的电子表格,我想知道这是否会有所作为。
答案 0 :(得分:4)
我真的无法提供任何有关此答案的参考资料,它基于轶事证据以及与其他Google表格用户的讨论。
对于一个相对简单的计算,就像你问题中的计算一样,我相信阵列解决方案对于非常大的数据集具有更好的性能。它还减少了在表格(40,000中碰撞公式限制的可能性,但是由数组公式填充的CONTINUE函数对此计数没有贡献。)
然而,对于非常复杂的计算,两个选项都能够将电子表格磨成停止状态。臭名昭着的例子是数组公式,我们需要求助于字符串操作(例如,将数组连接在一起,然后再将它们分开)。在这种情况下,我个人会去计划C,并编写一个Google Apps脚本自定义函数,它将数组(数组)作为参数(参数),使用纯Javascript来操作数据,并输出数组。
答案 1 :(得分:1)
您可以使用两个脚本对此进行测试
乘以30,000行,其中每个单元格为10 x 10
自动扩展需要〜.275 s CopyDown〜.678 s
https://docs.google.com/spreadsheets/d/1djHUp_kTS02gYnKf5Y3AvpHCIt_69x_X02eesOSywzw/edit?usp=sharing
function AutoExpand() {
var ss =SpreadsheetApp.getActive();
var sheet =ss.getSheetByName('AAA');
var LC = sheet.getLastColumn();
var LR = sheet.getLastRow();
var start = new Date();
//Auto-expanding Formulas to be added
//Two dim array with 1 row
var formulas = [["=ArrayFormula(A:A*10)"]];
//Add auto-expanding formulas to Cell(s)
var cell = sheet.getRange(1,LC+1,1,formulas[0].length);
cell.setFormulas(formulas);
SpreadsheetApp.flush();
//Get range and post back Display Values
//var r = sheet.getRange(1,LC+1,LR,formulas[0].length);
//var v = r.getDisplayValues();
//r.setValues(v);
var end = new Date();
var executiontime = end - start;
Logger.log(executiontime);
}
CopyDown
function CoppyDown() {
var ss =SpreadsheetApp.getActive();
var sheet =ss.getSheetByName('AAA');
var LC = sheet.getLastColumn();
var LR = sheet.getLastRow();
var start = new Date();
//NON Auto-expanding Formula(s) to be added
//Two dim array with 1 row
var formulas = [["=A:A*10"]];
//Add NON auto-expanding formula(s) to Cell(s)
var cell = sheet.getRange(1,LC+1,1,formulas[0].length);
cell.setFormulas(formulas);
SpreadsheetApp.flush();
//Get range FULL Range of Cells W/Formulas
var r = sheet.getRange(1,LC+1,LR,formulas[0].length);
//Add formulas to Row1 Cell(s)
var cells = sheet.getRange(1,LC+1,1,formulas[0].length);
cells.setFormulas(formulas);
//Copy formulas down
cells.copyTo(r);
SpreadsheetApp.flush();
//Get the Display Values of the Range W/Formulas
//var v = r.getDisplayValues();
//Clear the Formulas Before the Postback
//This Super Speeds up the Postback
//r.clear();
//Postback Formulas as Values
//r.setValues(v);
var end = new Date();
var executiontime = end - start;
Logger.log(executiontime);
}