每当在Google表格中编辑另一个单元格时,是否可以使用简单的触发器来增加一个单元格?

时间:2019-11-01 15:39:54

标签: google-apps-script google-sheets google-sheets-formula

这是所需的行为:

  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触发器以外的方法),请告诉我!另外,如果该解决方案也可以在移动设备上运行,那将是理想的选择。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

在此示例中,如果对于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);
    }
  }    
}