【问题标题】:Is it possible to use simple triggers to increment a cell whenever another cell is edited in google sheets?每当在谷歌表格中编辑另一个单元格时,是否可以使用简单的触发器来增加一个单元格?
【发布时间】:2019-11-01 15:39:54
【问题描述】:

这是所需的行为:

  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-script google-sheets google-sheets-formula


    【解决方案1】:
    /*
    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();

    【讨论】:

    • 非常感谢!我要试试这个。我是否需要为每一行复制此脚本,还是有办法使用相对引用以使 A2:D 的行为方式相同?
    • 如果您认为可以将其用作单元格函数,那您就错了。这必须作为触发 onEdit 触发器并从 onEdit 触发器接收事件对象的脚本运行。单元格函数不是这样工作的,它们必须向其单元格返回一个值。阅读更多关于自定义函数here
    • 没有 row 似乎工作得很好。您希望它在不止一张纸上以这种方式工作吗?
    • 不,它只需要在单个工作表上的单个范围内(x 行数,4 列)起作用。
    • 好的,我添加了e.range.rowStart&lt;15,所以这仅适用于少于 15 行的行,您可以随意更改。我可能会对其进行硬接线,以便它尽可能快地运行。
    【解决方案2】:

    在本例中,如果 MainSheet 触发,并且 b、c 和 d 的单元格是布尔类型,而不是字符串:

    function MainSheetOnEdit()
    {
      var spreadsheet = SpreadsheetApp.getActive();
      var mysheet=spreadsheet.getActiveSheet();
    
      if (mysheet.getSheetName()!='MainSheet') return;
    
      if(mysheet.getCurrentCell().getColumn()==2)
      {
        if (mysheet.getCurrentCell().getValue()==true){
           mysheet.getCurrentCell().setValue(false);
           if(mysheet.getCurrentCell().offset(0, -1).getValue()>0) 
           {
             mysheet.getCurrentCell().offset(0, -1).setValue(mysheet.getCurrentCell().offset(0, -1).getValue()-1);
           }
        }
      }
    
      if(mysheet.getCurrentCell().getColumn()==3)
      {
        if (mysheet.getCurrentCell().getValue()==true){
           mysheet.getCurrentCell().setValue(false);
           mysheet.getCurrentCell().offset(0, -2).setValue(mysheet.getCurrentCell().offset(0, -2).getValue()+1);
        }
      }
    
      if(mysheet.getCurrentCell().getColumn()==4)
      {
        if (mysheet.getCurrentCell().getValue()==true){
           mysheet.getCurrentCell().setValue(false);
           mysheet.getCurrentCell().offset(0, -3).setValue(0);
        }
      }    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多