我正在嘗試創建一個回圈通過列“M”并將每個單元格乘以一個常數(例如,10.5)的函式。我終于設法創建了一個執行此操作的函式,但它需要時間來執行并且在它完成之前遇到運行時錯誤,因為它需要超過 30 秒才能完全執行。你們認為有可能以某種方式加速我的代碼嗎?如果有人能指出我正確的方向,將不勝感激。下面是我的代碼。
function onEdit(e) {
var ss = e.source;
var cell = e.range;
if(cell.getRow() == 1 && cell.getColumn() == 13 && e.value != null){
if (cell.getDisplayValue() == 'Currency EURO') {
var valuta = 10.5;
}
if (cell.getDisplayValue() == 'Currency Pund') {
var valuta = 12.31;
}
var range = ss.getRange("M:M");
var count = range.getDisplayValues();
for(var i=2;i<count.length;i ){
ss.getRange("M" i).setValue(Number(ss.getRange("M" i).getDisplayValue())*valuta);
}
}
}
uj5u.com熱心網友回復:
我認為問題在于您過多地使用了電子表格功能 - 在 for 回圈的每次迭代中,您基本上都在與電子表格進行互動。這有很大的開銷。
我提出兩個想法:
1. 代碼修復:建議盡量少用電子表格函式。它們非常昂貴。這意味著只檢索一次范圍,并且只更新一次范圍。
這是我的建議:
function onEdit(e) {
var ss = e.source;
var cell = e.range;
if(cell.getRow() == 1 && cell.getColumn() == 13 && e.value != null){
if (cell.getDisplayValue() == 'Currency EURO') {
var valuta = 10.5;
}
if (cell.getDisplayValue() == 'Currency Pund') {
var valuta = 12.31;
}
// This is a reference to the range
var range = ss.getRange("M:M");
// This actually reads the values - do it only once
var count = range.getDisplayValues();
// This updates the count variable - does not interact with the spreadsheet yet
for(var i=2;i<count.length;i ){
count[i][0] *= valuta;
}
// This updates the range - done only once.
range.setValues(count);
}
}
該代碼尚未經過測驗,因此請告訴我是否有任何錯誤需要修復。
2. 可選:看看Tanaike 的這個答案——尤其是模式#3。如果在獲取范圍時忽略空白值,則可以使其更快。
uj5u.com熱心網友回復:
function onEdit(e) {
const range = e.range;
if (range.getRow() === 1 && range.getColumn() === 13 && e.value) {
let valuta;
if (e.value === 'Currency EURO') { valuta = 10.5 }
if (e.value === 'Currency Pund') { valuta = 12.31 }
const sheet = e.source.getActiveSheet()
const values = sheet.getRange(`M2:M`)
.getDisplayValues()
.filter(String)
.map(i => [Number(i) * valuta])
sheet.getRange(2, 13, values.length, values[0].length).setValues(values)
}
}
這是您的功能的優化版本。
- 主要優化是“一次”處理所有資料更改。
- 二級優化是只有一次呼叫值。
- 這也將處理任何空單元格,并避免第一行單元格。
uj5u.com熱心網友回復:
試試這種方式:
function onEdit(e) {
const sh = e.range.getSheet();
if (sh.getName() == "Sheet Name" && e.range.rowStart == 1 && e.range.columnStart == 13 && e.value != null) {
if (e.range.getDisplayValue() == 'Currency EURO') {
var valuta = 10.5;
}
if (e.range.getDisplayValue() == 'Currency Pund') {
var valuta = 12.31;
}
let vs = sh.getRange("M2:M" sh.getLastRow()).getDisplayValues().flat().map((e,i) => [e * valuta] )
sh.getRange("M2:M" sh.getLastRow()).setValues(vs));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473320.html
下一篇:如何添加三個陣列中的值?
