使用 Google Sheets 的内部计算函数,如 SUM 和 COUNTIF,代替 Apps-Script 循环,以获得更快的性能。
下面是一个示例,将循环计算一列到另一列的平均值改为使用内部计算函数:
原始代码:
function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var dataRange = sheet.getDataRange(); var values = dataRange.getValues(); for (var i = 1; i < values.length; i++) { var sum = 0; var count = 0; for (var j = 0; j < values[i].length; j++) { if (values[i][j] !== "") { sum += values[i][j]; count++; } } var avg = sum / count; sheet.getRange(i + 1, values[i].length + 1).setValue(avg); } }
更新后的代码:
function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var dataRange = sheet.getDataRange(); var values = dataRange.getValues(); var row_count = values.length - 1; var col_count = values[0].length - 1; var sums = sheet.getRange(2, 1, row_count, col_count).getFormulas().map( function(row) { return row.map( function(formula) { if (formula !== "") { return "=SUM(" + formula + ")"; } else { return ""; } } ) } ); var counts = sheet.getRange(2, 1, row_count, col_count).getFormulas().map( function(row) { return row.map( function(formula) { if (formula !== "") { return "=COUNTIF(" + formula + ", "<>0")"; } else { return ""; } } ) } ); var avgs = sheet.getRange(2, 1, row_count, col_count).getFormulas().map( function(row, i) { return row.map( function(formula, j) { if (formula !== "") { return "=(IFERROR(" + sums[i][j] + "/" + counts[i][j] + ",""))"; } else { return ""; } } ) } ); sheet.getRange(2, col_count + 1, row_count, 1).setFormulas(avgs); }
此更新后的代码使用 SUM 和 COUNTIF 函数分别计算