重置复选框为false。

10

我有一个Google电子表格,在每一行中,列A都有复选框。我编写了一个脚本,在选中复选框的所有行上执行函数,但我想在脚本运行结束时添加重置函数,以便所有选中的复选框再次取消选中。

我尝试使用如下for循环:

var dataRange = sheet.getRange('A3:A');
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] == true) {
      values[i].setValue(false);
    }
  }    
} 

显然这种方法不起作用,我收到了一个错误。

有人知道怎么做吗?

6个回答

5

更新:

您现在可以直接在范围上使用range.uncheck()


或者,如果您想要取消选中范围内的所有内容(并且所有范围都包含复选框),只需执行以下操作:

sheet.getRange('A3:A').setValue(false);

不需要检查/循环。


5

这种修改方案怎么样?我认为你的情况有几种解决方案,所以请把这个方案当做其中之一。

修改点:

  • 问题的原因是values[i].setValue(false);values[i] 是一个数组,请使用 setValue() 的范围。
    • 但在 for 循环中使用 setValue() 会导致更高的成本。因此,在这个修改中,我使用了 setValues()
  • 如果 values[i][j] 是 "true",则将 "false" 放入 values 中。
  • 使用 setValues() 将修改后的值放入表格中。

修改后的脚本:

var dataRange = sheet.getRange('A3:A');
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] == true) {
      values[i][j] = false; // Modified
    }
  }
}
dataRange.setValues(values); // Added

参考 :

如果这不是您想要的,请告诉我。我会进行修改。


@DaveB1,我很高兴你的问题得到了解决。也谢谢你。 - Tanaike
作为额外信息,如果您想检查单元格中的“1”和空值的值,这些线程可能会有所帮助。https://stackoverflow.com/a/54742828/7108653 和 https://stackoverflow.com/q/54795712/7108653 - Tanaike
嗨@Tanaike,感谢您提供的解决方案,我很高兴看到OP已经解决了这个问题。我也遇到了同样的问题,尝试将表格中的所有复选框重置为false,并实现了您的代码,但没有成功。如果您有空,您介意看一下我的代码,并让我知道是否有明显的修复方法吗?谢谢 :) - Lou

2
通过高亮显示要“取消选中”的范围中的所有单元格,按住Ctrl键并双击空格键即可。最初的回答。

欢迎来到 Stack Overflow!我不确定你的答案是否完全符合 Dave 的要求。用户要求一个脚本来重置所有复选框,而不是手动操作。 - Teasel
不是 OP 想要的答案,但这是我尝试解决问题时想到的简单解决方案! - Scoox

2
删除勾选标记的方法是“取消选择”…
  var range = SpreadsheetApp.getActive().getRange('A21:A59');
  range.uncheck();

1
这个上面发布的解决方案确实可以重置所有复选框;但是,它也意外地将值为 1 的单元格更改为FALSE。 我想编写一个脚本来重置所有工作表上的复选框...
function resetCheckBoxesAllSheets() {
var ss = SpreadsheetApp.getActive();
var allsheets = ss.getSheets();
for (var s in allsheets){
var sheet=allsheets[s]

var dataRange = sheet.getRange('A4:Z100');
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] == true) {
      values[i][j] = false; // Modified
    }
  }
}
dataRange.setValues(values);


}//end of  sheets loop.
}// end of function...

这也会替换范围内的所有公式。有没有想法如何仅使用不需要谷歌API的脚本替换复选框? - B D
有一个新的方法:range.unCheck()。它应该会有所帮助。 - TheMaster

0

我已经设置了一个复选框,而不是标题,如图所示Sheet Image

我编写了一个脚本来检查数据范围并相应地进行全选/取消全选。以下是脚本。

    function onEdit(e){
  Logger.log('OnEdit'); 
  var range = e.range;
  var cl  = range.getColumn(); 
  var rw = range.getRow(); 
  Logger.log('Row = ' + rw + '   Column = ' + cl); 
  var ActiveSheet = ss.getActiveSheet();  
  if(ActiveSheet.getName() === 'Companies' && rw == 1 && cl == 5){
    var isAllTrue  = ActiveSheet.getRange(rw, cl).getValue(); 
    if(isAllTrue == true){
      var Avals = ActiveSheet.getRange("A1:A").getValues();
      var Alast = Avals.filter(String).length;
      ActiveSheet.getRange(2, 5, Number(Alast-1)).setValue(true); 
    }
    else
    {
      var Avals = ActiveSheet.getRange("A1:A").getValues();
      var Alast = Avals.filter(String).length;
      ActiveSheet.getRange(2, 5, Number(Alast-1)).setValue(false); 
    }
  }  
}

Change sheet name as per your need.

注意:如果没有触发器自动触发,请为相同的函数创建onedit触发器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接