Редактор скриптов электронных таблиц Google: onEdit setValue или clearContent - PullRequest
2 голосов
/ 23 марта 2020

Я пытаюсь создать электронную таблицу для управления своими деньгами / расходами и столкнулся с проблемой, пытаясь автоматизировать мой процесс

Я хочу создать фрагмент кода, который будет выполняться каждый раз, когда ячейка редактируется в лист.

Когда сработает, я хочу, чтобы он вычислил ssum, lsum и betal (в l oop), а затем поместил его в 3 разные ячейки. Код работает, как и ожидалось, но триггер onedit не работает.

Это мой код:

function regnudbetalprocent() {

  var betal = 0;
  var i = 1;
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
  var sum = activeSheet.getRange(18, 5).getValue();
  var ssum;
  var lsum;
  var ssumori = activeSheet.getRange(3, 8).getValue();
  var lsumori = activeSheet.getRange(4, 8).getValue();
  var fuld = activeSheet.getRange(18, 2).getValue();

  while(betal < sum){

    ssum = ((ssumori - fuld / 2) / 100) * i;
    lsum = ((lsumori - fuld / 2) / 100) * i;
    betal = ssum + lsum;

    i++;
  }


    if (betal > sum) {
      var output = [
    [ssum,lsum],
    ["Samlet",betal]
  ]
       return output;
    }
}

Выходная переменная устанавливает соседние ячейки соответственно, откуда функция вызывается

Я пробовал с setValue и clearContent, но я не могу редактировать вне ячейки, откуда вызывается функция. Я использовал Edit -> триггеры текущего проекта, чтобы добавить триггер onEdit, который увеличивается каждый раз, когда я редактирую лист, но ничего не происходит .. Я сгорел

Может кто-нибудь мне помочь? как я могу получить то, что я хочу?

1 Ответ

3 голосов
/ 23 марта 2020
  • Значения для использования в расчете - это ячейки констант "B18", "E18", "H3" и "H4".
  • Вы хотите запустить скрипт, когда один из приведенных выше ячейки отредактированы. Вы хотите использовать триггер события OnEdit.
  • Вы хотите поместить значение результата в ячейки "D21", "E21" и "E22".
  • Ваши вычисления не имеют проблем.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • В вашем скрипте я думаю, что вместо устанавливаемого триггера можно использовать простой триггер.
  • Из вашего ответа о "Exception: You do not have permission to call setValue (line 7)." я думаю, что вы можете использовать функцию regnudbetalprocent() в качестве пользовательской функции. В этом случае возникает такая ошибка.
  • Вы можете узнать координаты отредактированной ячейки, используя объект события.

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

Модифицированный скрипт:

Функция onEdit используется в качестве простого триггера. Поэтому, чтобы запустить скрипт, отредактируйте вручную одну из ячеек «B18», «E18», «H3» и «H4». Таким образом, скрипт запускается и извлекает значения из ячеек «B18», «E18», «H3» и «H4», а вычисленный результат помещается в ячейки «D21: E22».

function onEdit(e) {
  var a1Notation = e.range.getA1Notation();  // Added
  if (a1Notation != "B18" && a1Notation != "E18" && a1Notation != "H3" && a1Notation != "H4") return;  // Added

  var betal = 0;
  var i = 1;
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
  var sum = activeSheet.getRange(18, 5).getValue();
  var ssum;
  var lsum;
  var ssumori = activeSheet.getRange(3, 8).getValue();
  var lsumori = activeSheet.getRange(4, 8).getValue();
  var fuld = activeSheet.getRange(18, 2).getValue();
  while(betal < sum){
    ssum = ((ssumori - fuld / 2) / 100) * i;
    lsum = ((lsumori - fuld / 2) / 100) * i;
    betal = ssum + lsum;
    i++;
  }

  if (betal > sum) {  // Modified
    var output = [[ssum,lsum], ["Samlet",betal]];
    var r = e.range.getSheet().getRange("D21:E22");
    r.clearContent();  // This line might not be required.
    r.setValues(output);
    SpreadsheetApp.flush();  // This line might not be required.
  }
}

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...