我很难在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')也都没有...等等……我不太确定我该怎么写
答案 0 :(得分:1)
从Google Apps脚本访问范围时,每个范围必须是一个连续的块,因此不能将离散范围(如C9:C11和C13:C14)选择为单个范围对象。您需要分别访问这些范围。
修改现有代码的一种简单但可能效率不高的方法是遍历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;
}
}
}
}
如果每个范围只是一个单元格,则可以将getValues()切换为getValue(),然后就不需要遍历values数组。
但是,如果您访问的可能是一个较大的范围或一系列较小的范围,则效率将非常低下。最好使用一些逻辑来构建多单元格范围,或者将整个工作表读取为单个范围(sheet.getDataRange().getValues()
),然后使用数组符号访问感兴趣的单元格会更好。 ,然后写回整个数组。
答案 1 :(得分:0)
使用Rangelist
class最容易在不相交的Range
上执行相同的操作,并且不需要直接访问成员Range
。但是,即使操作不同(或有条件),也可以使用RangeList
来优化电子表格服务的使用,而不必重复调用Sheet#getRange
。
从您的代码中,我们可以确定目标是对与“真实”复选框相关的一组范围进行操作:
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);
});