对于Google表格,我需要在一行上包含4个复选框。它们代表(3)学校考试被拒绝。最后一个方框是当所有这些都被拒绝时。

2个月前,我对VBA一无所知,从那时起,我制作了一系列具有6年历史的宏,就像编码一样。他们不是漂亮,但他们工作。现在,我将从使用App脚本或您建议/推荐的任何编码开始。我确定两者之间的编码(VBA和Apps脚本)看起来与您相似,但对我来说却完全不同。

我没有任何代码或经验。我到处搜索,发现(在此站点上)与我正在寻找的东西非常接近。

这是我发现的示例:

all checkboxes need to be checked and unchecked with the main checkbox

这是用于Google表格的。我的学生必须参加3项考试-英语,数学和自然科学,但有拒绝参加的趋势。他们可能拒绝所有人,有些人拒绝,也可能拒绝。我需要4个复选框-他们拒绝的每项考试都需要一个复选框,如果他们拒绝所有的则需要一个。如果您选中所有单个框(在一段时间内完成),则会选中“整个考试”框,并且各个框都不会被选中。如果首先直接选中“整个考试”框,则单个框上可能存在的所有检查都将变为未选中状态。

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

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

我想做的另一件事是减少点击次数,这样的建议可能是每个考试只有3个框,如果所有检查都被选中,那意味着整个考试都被拒绝了,那是2次额外点击鼠标。此表很可能会在考试开始前一个小时突然被拒绝的情况下使用,因此,如果需要,仅选中“整个考试”框会比检查所有3个单独的框更简单/更快。

这是如何运作的?您是否将代码分配给复选框本身?

我将不胜感激任何反馈和帮助。并且,如果您有任何站点可以引导我开始学习,请分享。谢谢。吉姆

最佳答案

确保您的Eng,Math,Sci和Entire列; F,G,H和I设置为实际的图纸复选框(选择F2:I,菜单→插入→复选框)。
javascript - 复选框-单独的拒绝测试框(英语,数学,科学)和“整个考试”复选框,已选中和未选中-LMLPHP

如果您从未在电子表格上运行过Google Apps脚本,则可以逐步完成一个不错的教程,例如this Ben Collins guide的前几节。

一旦运行了代码,请尝试一个脚本,该脚本监视对Sheets文件的编辑,并以所需的检查和更改作为响应。

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();
    }
  }

}


我相信它符合您所描述的预期行为。用英语,它:


测试并忽略F2:I1000范围以外的编辑。
否则,测试更改是否为:“选中整个考试框”;如果是,请清除英语,数学,科学。
否则,请查看主题复选框,然后


如果现在都选中了它们,请取消选中它们,然后选中整个
否则,他们会更改部分,但并非全部正确,因此请取消选中“整个考试”以保持整洁。



我在其中放了一些Logger.log()消息,而不是评论。在工作表中进行编辑后,您可以返回到脚本编辑器,然后从菜单中选择“查看”→“日志”,以查看记录器根据您的编辑生成的内容。对工作表和脚本的工作方式满意后,可以删除Logger调用。

最后,请注意;一旦您自己开始使用它,请让将要使用Sheets文件的其他人进行一些测试编辑,以查看它是否正常工作,并确认脚本在重要的一天之前运行了,这真令人讨厌!

10-08 17:00