首页 > 解决方案 > 每当在谷歌表格中编辑另一个单元格时,是否可以使用简单的触发器来增加一个单元格?

问题描述

这是所需的行为:

  1. 单元格 A1 包含一个数字(默认为 0),表示受到的伤害。
  2. 单元格 B1:D1 包含复选框(默认为 FALSE)。
  3. 当单元格 B1 被编辑(即选中“TRUE”)时,单元格 A1 减 1。单元格 B1 自动重置为 FALSE。如果单元格 A1 降至 0 以下,则将其重置为 0)。
  4. 编辑单元格 C1 时,单元格 A1 增加 1 并自动重置为 FALSE。
  5. 编辑单元格 D1 时,单元格 A1 重置为 0。

我对 Google Apps 脚本非常陌生,最近发现了简单触发器。似乎 onEdit 旨在在编辑整个工作簿中的任何内容时触发,但我不确定。如果编辑了特定范围(即如上所述的 B1:D1),脚本是否可以自动运行?


对于上下文,我正在为逐个播放 RPG 设计角色表。当角色受到伤害时,其一项或多项技能的能力会因受到伤害等级而降低。为了尽可能简单地在整个工作表中跟踪这些,我试图找到一种方法来轻松地上下增加这些等级,而不必为每一行编写单独的宏。

如果有比我提出的行为更好的解决方案(例如,使用复选框和 onEdit 触发器以外的东西),请告诉我!此外,如果该解决方案也适用于移动设备,那将是理想的。

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-formula

解决方案


/*
Cell A1 contains a number (0 by default) representing damage taken.
Cells B1:D1 contain checkboxes (FALSE by default).
When cell B1 is edited (i.e. checked "TRUE"), cell A1 is decreased by 1. Cell B1 is automatically reset to FALSE. If cell A1 is decreased below 0, it is reset to 0).
When cell C1 is edited, cell A1 is incremented by 1 and automatically reset to FALSE.
When cell D1 is edited, cell A1 is reset to 0.
*/

function onEdit(e) {
  var sh=e.range.getSheet();
  e.source.toast('Entry');
  if(sh.getName()!="Sheet1")return;//might need to change Sheet1 to whatever you're using
  if(e.range.columnStart==2 && e.range.rowStart==1 && e.value=="TRUE") {
    e.source.toast("B1");
    var vA1=e.range.offset(0,-1).getValue();
    e.range.offset(0,-1).setValue((vA1-1<0)?0:vA1-1);
    e.range.setValue("FALSE");
  }
  if(e.range.columnStart==3 && e.range.rowStart==1 && e.value=="TRUE") {
    e.source.toast("C1");
    var vA1=e.range.offset(0,-2).getValue();
    e.range.offset(0,-2).setValue(vA1+1);
    e.range.setValue("FALSE");
  }
  if(e.range.columnStart===4 && e.range.rowStart==1 && e.value=="TRUE") {
    e.source.toast("D1");
    e.range.offset(0,-3).setValue(0);
    e.range.setValue("FALSE");
  }
}

提醒一下:您不能从脚本编辑器运行此功能,只需将其安装在 .gs 文件中并使用 Sheet1 上的复选框即可。如果您不使用 Sheet1,请将脚本中的工作表名称更改为您的工作表名称。

看起来这适用于“A1:D”。

function onEdit(e) {
  var sh=e.range.getSheet();
  e.source.toast('Entry');
  if(sh.getName()!="Sheet1")return;
  if(e.range.columnStart==2 && e.value=="TRUE") {
    e.source.toast("B1");
    var vA1=e.range.offset(0,-1).getValue();
    e.range.offset(0,-1).setValue((vA1-1<0)?0:vA1-1);
    e.range.setValue("FALSE");
  }
  if(e.range.columnStart==3 && e.value=="TRUE") {
    e.source.toast("C1");
    var vA1=e.range.offset(0,-2).getValue();
    e.range.offset(0,-2).setValue(vA1+1);
    e.range.setValue("FALSE");
  }
  if(e.range.columnStart===4 && e.value=="TRUE") {
    e.source.toast("D1");
    e.range.offset(0,-3).setValue(0);
    e.range.setValue("FALSE");
  }
}

稍作修改以帮助您测试它

function onEdit(e) {
  var sh=e.range.getSheet();
  var cell=e.range.getA1Notation();//debug
  e.source.toast('Entry');//debug
  if(sh.getName()!="Sheet1")return;
  if(e.range.columnStart==2 && e.range.rowStart<15 && e.value=="TRUE") {
    e.source.toast(cell);//debug
    var vA1=e.range.offset(0,-1).getValue();
    e.range.offset(0,-1).setValue((vA1-1<0)?0:vA1-1);
    e.range.setValue("FALSE");
  }
  if(e.range.columnStart==3 && e.range.rowStart<15 && e.value=="TRUE") {
    e.source.toast(cell);//debug
    var vA1=e.range.offset(0,-2).getValue();
    e.range.offset(0,-2).setValue(vA1+1);
    e.range.setValue("FALSE");
  }
  if(e.range.columnStart===4 && e.range.rowStart<15 && e.value=="TRUE") {
    e.source.toast(cell);//debug
    e.range.offset(0,-3).setValue(0);
    e.range.setValue("FALSE");
  }
}

请注意:应该只有一个 onEdit(e) 简单触发函数。如果事实上,.gs 文件中应该只有任何功能之一。

您可能希望删除我的e.source.toast();台词


推荐阅读