我创建了一个电子表格,用于跟踪我们在魔兽世界中分配给突袭者的点,并使用脚本创建了按钮,这些按钮可以将特定数量的这些点添加到突袭者中,但是,使用 for 循环,功能非常慢。
看起来问题是我正在使用 for 循环来存储点值,添加特定数量的点,然后重复循环。
function twentyDKP() {
alertBox20DKP()
}
function alertBox20DKP() {
var sh=SpreadsheetApp.getUi();
var response=sh.alert("Add 20 DKP to all raiders?", sh.ButtonSet.YES_NO);
if(response==sh.Button.YES) {
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
var raiders = activeSheet.getRange(1, 12).getValue()+4;
//This is just grabbing a countif formula then offsetting it ensure the for loop counts from row 4 downwards.
for(var i=4;i<raiders;i++){
var DKP = activeSheet.getRange(i,2).getValue()
activeSheet.getRange(i,2).setValue(DKP+20)
}
var complete=sh.alert("20 DKP has been added to all raiders.", sh.ButtonSet.OK);
}
}
我尝试将 for 循环替换为以下内容:
var i = 4;
var DKP = activeSheet.getDataRange(i,2,raiders,1).getValue()
activeSheet.getDataRange(i,2,raiders,1).setValue(DKP+20)
我对上述内容遇到的问题是,它获取第一个可用值,在我的电子表格中这是 60,然后将其存储为唯一的 DKP 值,然后将 20 加到它,给我 80,并在每个框中填写它,而不是查看每个单独的值并向其添加 20。
我该如何解决这个问题,我对GoogleAppScripts或代码不是特别有经验或知识渊博。
- 您的脚本工作正常。但是处理速度很慢。
- 您希望加快脚本的处理速度。
- 您的情况如下。
- 从单元格"L1"中检索值。
- 从列"B"的第 4 行检索到检索到的值的值。
20
将添加到每个值。- 将值放在用于检索列"B"的值的相同范围内。
如果我的理解是正确的,那么这个修改怎么样?请把这看作是几个答案之一。
修改点:
- 当在 for 循环中使用
setValue()
时,过程成本变得非常高。你的问题提到了这一点。- 为了降低成本,它使用
setValues
。 - 为了在您的情况下使用
setValues
,首先需要创建用于放入单元格的值。 - 创建值后,会将值放入单元格。
- 为了降低成本,它使用
当这反映到您的脚本时,它将变为如下。
修改后的脚本:
请按如下方式修改您的脚本。
从:var raiders = activeSheet.getRange(1, 12).getValue()+4;
//This is just grabbing a countif formula then offsetting it ensure the for loop counts from row 4 downwards.
for(var i=4;i<raiders;i++){
var DKP = activeSheet.getRange(i,2).getValue()
activeSheet.getRange(i,2).setValue(DKP+20)
}
自:var raiders = activeSheet.getRange(1, 12).getValue();
// In your situation, the range is the same. So "range" is declared here.
var range = activeSheet.getRange(4, 2, raiders - 4);
// Create values for putting to the range.
var values = range.getValues().map(function(row) {return [row[0] + 20]});
// Put the created values to the range.
range.setValues(values);
// Update the cells. Before "alert" is shown.
SpreadsheetApp.flush();
引用:
- getRange(row, column, numRows)
- 地图()
- 设置值(值)
- 同花顺()
首先,请检查我的理解是否正确。如果我误解了你的问题,这不是你想要的结果,我很抱歉。届时,您能提供示例电子表格吗?通过这个,我想修改它。
试试这个:
function runOne() {
var ui=SpreadsheetApp.getUi();
var response=ui.alert("Add 20 DKP to all raiders?", ui.ButtonSet.YES_NO);
if(response==ui.Button.YES) {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var raiders=sh.getRange(1,12).getValue()+4;
for(var i=4;i<raiders;i++){
sh.getRange(i,2).setValue(Number(sh.getRange(i,2).getValue())+20)
}
ui.alert("20 DKP has been added to all raiders.", ui.ButtonSet.OK);
}
}