Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 复选框-个人被拒测试框(英语、数学、Sci)和;“整个考试”;复选框,选中和未选中_Javascript_Checkbox_Google Sheets - Fatal编程技术网

Javascript 复选框-个人被拒测试框(英语、数学、Sci)和;“整个考试”;复选框,选中和未选中

Javascript 复选框-个人被拒测试框(英语、数学、Sci)和;“整个考试”;复选框,选中和未选中,javascript,checkbox,google-sheets,Javascript,Checkbox,Google Sheets,我需要4个复选框在一行谷歌表。他们代表学校考试被拒。最后一个框是当所有这些都被拒绝时 2个月前,我对VBA一无所知,从那时起,我用6年的时间编写了一系列宏。它们不漂亮,但很管用。现在,我从应用程序脚本或您建议/推荐我使用的任何代码开始。我确信这两个(VBA和应用程序脚本)之间的编码看起来很像你,但在我看来完全不同 我没有这方面的任何代码或经验。我四处搜索,发现了一些(在这个网站上)非常接近我要找的东西 以下是我发现的示例: 这是一张谷歌表格。我有三门考试,我的学生必须参加——英语、数学和科学,

我需要4个复选框在一行谷歌表。他们代表学校考试被拒。最后一个框是当所有这些都被拒绝时

2个月前,我对VBA一无所知,从那时起,我用6年的时间编写了一系列宏。它们不漂亮,但很管用。现在,我从应用程序脚本或您建议/推荐我使用的任何代码开始。我确信这两个(VBA和应用程序脚本)之间的编码看起来很像你,但在我看来完全不同

我没有这方面的任何代码或经验。我四处搜索,发现了一些(在这个网站上)非常接近我要找的东西

以下是我发现的示例:

这是一张谷歌表格。我有三门考试,我的学生必须参加——英语、数学和科学,但有拒绝参加的倾向。他们可以全部拒绝,有的拒绝,有的不拒绝。我需要4个复选框-一个用于他们拒绝的每个考试,一个用于他们拒绝所有考试。如果选中所有单个复选框(在一段时间内完成),则选中“整个检查”复选框,单个复选框变为未选中。如果您首先直接选中“整个检查”框,则各个框上的任何检查都将被取消选中

复选框将位于同一行,但为单个单元格。英语将是F2,数学将是G2,科学将是H2,整个考试将是I2

我不能一次选中所有单独的考试框和整个考试框的原因是因为我需要区分部分考试和未参加的全部考试。我需要计算被拒绝的个别考试的数量,包括“部分考试”和全部考试

我想做的另一件事是减少点击次数,这样一个建议,可能会出现只有3个框的个人考试,如果他们都被选中,这将意味着整个考试已被拒绝,这是两个额外的鼠标点击。在考试开始前一个小时,该表很可能会在突然出现的大量拒绝中使用,因此,如果情况允许,只勾选“整个考试”框将比勾选所有3个单独的框更简单/更快

这是怎么回事?是否将代码分配给复选框本身


如果您有任何反馈和帮助,我将不胜感激。如果你有任何网站可以推荐我开始学习,请分享。非常感谢。吉姆

确保你的英语、数学、Sci和整个专栏;F、 G、H和I;设置为实际图纸复选框(选择F2:I,菜单→插入→复选框)。

如果你从未在电子表格上运行过谷歌应用程序脚本,那么不妨一步一步地完成一个不错的教程,例如本教程的前几个部分

运行代码后,请尝试使用脚本监视对图纸文件的编辑,并使用所需的检查和更改进行响应

function onEdit(e) {
  // these four 'settings' give the script the checkbox range. UPDATE IF RESTRUCTURING!
  var checkboxRange = {
    left : 6,
    right : 9,
    top : 2,
    bottom : 1000
  };

  // where was the edit performed?
  var editSheet = e.range.getSheet();
  var editRow = e.range.getRow();
  var editCol = e.range.getColumn();

  if(editRow < checkboxRange.top  || editRow > checkboxRange.bottom) {return};
  if(editCol < checkboxRange.left || editCol > checkboxRange.right ) {return};
  Logger.log("User edit was in the checkbox area.");

  if(editCol == checkboxRange.right) {
    Logger.log("User changed an 'Entire Exam' checkbox; seeing if now checked.");
    if(editSheet.getRange(editRow,checkboxRange.right).getValue()) {
      Logger.log("Yes, user checked that 'Entire Exam' checkbox. Clearing Partials.");
      editSheet.getRange(editRow,checkboxRange.left,1,3).uncheck();
    }
  }
  else {
    Logger.log("User changed a 'Partial' checkbox; seeing what's there now:");
    var partials = editSheet.getRange(editRow, checkboxRange.left, 1, 3).getValues();
    Logger.log(partials);
    if(partials[0][0] && partials[0][1] && partials[0][2]) {
      Logger.log("All Partials are checked; clearing Partials and checking Entire.");
      editSheet.getRange(editRow,checkboxRange.right).check();
      editSheet.getRange(editRow,checkboxRange.left,1,3).uncheck();
    }
    else {
      Logger.log("User changed a Partial, but not all true; paranoid unchecking Entire.");
      editSheet.getRange(editRow,checkboxRange.right).uncheck();
    }
  }  

}
函数onEdit(e){
//这四个“设置”为脚本提供了复选框范围。如果需要,请更新!
var checkboxRange={
左:6,,
右:9,,
排名:2,
底数:1000
};
//在哪里执行编辑?
var editSheet=e.range.getSheet();
var editRow=e.range.getRow();
var editCol=e.range.getColumn();
if(editRowcheckboxRange.bottom){return};
if(editColcheckboxRange.right){return};
log(“用户编辑在复选框区域。”);
if(editCol==checkboxRange.right){
Logger.log(“用户更改了“整个检查”复选框;查看是否现在已选中。”);
if(editSheet.getRange(editRow,checkboxRange.right).getValue()){
Logger.log(“是的,用户选中了“整个检查”复选框。清除部分内容。”);
getRange(editRow,checkboxRange.left,1,3)。取消选中();
}
}
否则{
Logger.log(“用户更改了“部分”复选框;查看现在的内容:”;
var partials=editSheet.getRange(editRow,checkboxRange.left,1,3).getValues();
Logger.log(部分);
if(分部[0][0]&分部[0][1]&分部[0][2]){
log(“检查所有部分;清除部分并检查整个。”);
getRange(editRow,checkboxRange.right).check();
getRange(editRow,checkboxRange.left,1,3)。取消选中();
}
否则{
log(“用户更改了部分,但不是全部为真;偏执狂取消选中整个。”);
getRange(editRow,checkboxRange.right)。取消选中();
}
}  
}
我相信这符合你所描述的理想行为。在英文中,它是:

  • 测试并忽略F2:I1000范围之外的编辑
  • 否则,测试更改是否为:“选中了整个检查框”;如果是,清除英语、数学、Sci
  • 否则,请查看主题复选框是什么,以及
    • 如果现在已全部选中,请取消选中,改为选中整个
    • 否则,他们改变了一部分,但他们不是所有的真实,所以取消选中整个考试,为清洁
我在那里放了一些
Logger.log()
消息,而不是注释。在工作表中进行编辑后,通过返回脚本编辑器并从菜单中选择“查看”,可以查看记录器根据您的编辑生成的内容→ 日志。一旦您对工作表和脚本的工作方式感到满意,就可以删除记录器调用


最后,警告;一旦你让它为你自己工作,让其他使用Sheets文件的人做一些测试编辑,看看它是否工作,并确认你的脚本在大日子之前运行没有令人讨厌的惊喜

非常感谢你。我将按照你的建议阅读本·柯林斯指南。这是一个让其他人测试表单的好主意。我可能会用一种方式,而其他人可能会用其他方式,并提出问题。我很想知道它是否适用于你的实际工作表。让我们知道,然后。干杯,我很高兴