Можно ли использовать простые триггеры для увеличения ячейки при редактировании другой ячейки в листах Google? - PullRequest
2 голосов
/ 01 ноября 2019

Вот требуемое поведение:

  1. Ячейка A1 содержит число (по умолчанию 0), представляющее полученный урон.
  2. Ячейки B1: D1 содержат флажки (по умолчанию FALSE).
  3. Когда ячейка B1 редактируется (т. Е. Проверяется «ИСТИНА»), ячейка A1 уменьшается на 1. Ячейка B1 автоматически сбрасывается в ЛОЖЬ. Если ячейка A1 уменьшается ниже 0, она сбрасывается в 0).
  4. Когда ячейка C1 редактируется, ячейка A1 увеличивается на 1 и автоматически сбрасывается в FALSE.
  5. Когда ячейка D1 редактируется, ячейка A1 сбрасывается в 0.

Я очень новичок в скрипте Google Apps и недавно обнаружил простые триггеры. Кажется, что onEdit предназначен для запуска, когда что-либо во всей книге редактируется, но я не уверен. Возможно ли, чтобы скрипт запускался автоматически, если отредактирован определенный диапазон (т. Е. B1: D1, как описано выше)?


Для контекста я разрабатываю таблицу персонажей для воспроизведенияпост рпг. Когда персонаж получает урон, его способность в одном или нескольких умениях уменьшается, получая рангов урона . Чтобы было как можно проще отслеживать их по всему листу, я пытаюсь найти способ легко увеличивать эти ранги вверх и вниз без необходимости писать отдельный макрос для каждой строки.

Если есть лучшее решение, чем предложенное мной поведение (например, использование чего-либо, кроме флажков и триггеров onEdit), пожалуйста, дайте мне знать! Кроме того, было бы идеально, если бы решение работало и на мобильных устройствах.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019
/*
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(); строки

0 голосов
/ 02 ноября 2019

В этом примере этот триггер, если для 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);
    }
  }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...