尝试在没有 for 循环(GoogleAppsScripts)的情况下对范围执行 setValue 操作



我创建了一个电子表格,用于跟踪我们在魔兽世界中分配给突袭者的点,并使用脚本创建了按钮,这些按钮可以将特定数量的这些点添加到突袭者中,但是,使用 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);
}
}

相关内容

最新更新