在Google Apps脚本中定义多个范围

问题描述 投票:0回答:2

我在GAS中定义多个范围时遇到了困难。

我有以下需要执行的简单功能:

var dataRange = sheet.getRange(checkRange);
var values = dataRange.getValues();
for (var i = 0; i < values.length; i++) {
  for (var j = 0; j < values[i].length; j++) {
    if (values[i][j] == false) {
      values[i][j] = true; 
    }
  }
}
dataRange.setValues(values);

我的范围实际上是由另一个函数定义的:

var checkRange = [];

  for(var i = 0; i<checkboxes.length; i++) {
  if(checkboxes[i]) {

  checkRange.push('C' + (i+9));
  Logger.log(checkRange);
  }
  }

现在,正如我在日志中看到的那样,正在创建所需的范围。但是,显然,单元格范围所需的GAS格式不同,因为我的范围未定义。此外,我试图找出在GAS中编写范围的精确可接受的方法。如果我放置像'C9:C11'这样的范围,脚本运行正常。如果我列出像'C9,C10'或'C9','C10'等列表,它就不会。也没有多个范围('C9:C11','C13:C14')等...不太确定我需要怎么写这个

javascript jquery google-apps-script range
2个回答
0
投票

使用Range最容易对可能不相交的Rangelist classs执行相同的操作,并且不需要直接访问成员Ranges。但是,即使操作不同(或有条件),也可以使用RangeList来优化电子表格服务的使用,而不是重复调用Sheet#getRange

从您的代码中,我们可以确定目标是在与“true”复选框相关的一组范围上操作:

var checkRange = [];
for (var i = 0; i < checkboxes.length; i++) {
  if (checkboxes[i]) {
    checkRange.push('C' + (i+9));
    Logger.log(checkRange);
  }
}

然后(似乎)有条件地改变相关范围的值:

var dataRange = sheet.getRange(checkRange);
var values = dataRange.getValues();
for (var i = 0; i < values.length; i++) {
  for (var j = 0; j < values[i].length; j++) {
    if (values[i][j] == false) {
      values[i][j] = true; 
    }
  }
}
dataRange.setValues(values);

Instantiating a RangeList使用Array字符串引用到工作表上的范围,例如[ "A1:A10", "C2", "D6:E8", "R5C9:R100C9" ]。因此,您的当前checkRange似乎已经具有所需的格式。

您的消费代码如下所示:

const rl = sheet.getRangeList(checkRange);
rl.getRanges().forEach(function (rg) {
  // Assumption: only single-cell ranges, based on the above checkRange code
  if (rg.getValue() == false) // matches false, null, undefined, 0, or ""
    rg.setValue(true);
});

1
投票

从Google Apps脚本访问范围时,每个范围必须是连续的块,您不能选择离散范围,如C9:C11和C13:C14作为单个Range对象。您需要单独访问这些范围。

修改现有代码的一种简单但可能效率低下的方法是循环访问checkRange数组并一次访问一个:

for(var j = 0; j < checkRange.length; j++){
   dataRange = sheet.getRange(checkRange[j]);
   var values = dataRange.getValues();
   for (var i = 0; i < values.length; i++) {
     for (var j = 0; j < values[i].length; j++) {
       if (values[i][j] == false) {
         values[i][j] = true; 
       }
     }
   }
 }

如果每个范围只是一个单元格,则可以为getValue()切换getValues(),然后不需要遍历值数组。

但是,如果您将一个较大范围作为一系列较小范围进行访问,则效率非常低。最好是在可能的情况下使用一些逻辑来构建多单元格范围,或者将整个工作表作为单个范围(sheet.getDataRange().getValues())读取,然后使用数组表示法访问您感兴趣的单元格,然后再写回整个阵列。

© www.soinside.com 2019 - 2024. All rights reserved.