Активный пересчет - PullRequest
       1

Активный пересчет

1 голос
/ 11 января 2020

Я пытаюсь выяснить, как активно пересчитывать значения ячеек при использовании функции редактора скриптов так же, как это делает googlesheet.

Например, когда у нас есть номер 2 в ячейке A1 и номер 2 в A2, тогда если мы делаем в ячейке A3 "= A1 + A2" и затем погружаем результат в ячейку A4, если мы изменим eiher A1 или A2, A3 и A4 будут активно обновляться.

Так что в редакторе сценариев, если мы сделаем:

Function sum_cells(){
 var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 sheet.getRange("A1").setValue(2);
 sheet.getRange("A2").setValue(2);
 var cell1=sheet.getRange("A1").getValue();
 var cell2=sheet.getRange("A2").getValue();
 sheet.getRange("A3").setValue(cell1+cell2);
 var cell3=sheet.getRange("A3").getValue();
 sheet.getRange("A4").setValue(cell3/4)}

Возможно ли активно обновить результат в A4 и A3, если значения ячеек в A1 и A2 изменятся?

Ответы [ 3 ]

1 голос
/ 11 января 2020

Да, это возможно с помощью пользовательской функции. Подробнее см. https://developers.google.com/apps-script/guides/sheets/functions

Очень простая пользовательская функция, использующая оператор JavaScript + и два операнда, выглядит следующим образом:

/**
 *
 * @customfunction
 */
function mySum(a,b){
  return a + b;
}

ПРИМЕЧАНИЯ:

Пользовательские функции

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

Когда открывается электронная таблица и каждый раз, когда a или b изменяют пользовательскую функцию будет пересчитан.

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


Например, когда у нас есть номер 2 в ячейке A1 и номер 2 в ячейке A2, тогда, если мы сделаем это в ячейке A3 "= A1 + A2", а затем мы погрузим результат в ячейку A4, если мы изменим их A1 или A2, и A3, и A4 будут активно обновлять.

* 103 0 * Чтобы использовать приведенный выше пример кода, чтобы сделать то, что было описано в приведенной выше цитате из вопроса, сделайте следующее:
  1. В A1 напишите 2
  2. В A2 напишите 2
  3. В A3 записать =mySum(A1,A2)
  4. В A4 записать =A3

A3 и A4 покажут 4.

Тогда при изменении значений, введенных в A1 или A2, значения в A3 и A4 изменятся.

  1. Измените A1 с 2 на 3

A3 и A4 покажет 5

Измените A2 с 2 на 1

A3 и A4 покажут 4

Related

0 голосов
/ 13 января 2020

После прочтения вашего запроса я понял следующее:

  • Вы хотите обновить некоторые ячейки при изменении других ячеек.
  • Вы запрашиваете первые автоматически.

В этом случае вы можете использовать следующий пример для выполнения ваших запросов:

КОД

function cellUpdater(e) {
  var sheet = e.source;
  if (e.range.getA1Notation() == "A1" || e.range.getA1Notation() == "A2") {
    var A3 = sheet.getRange("A1").getValue() + sheet.getRange("A2").getValue();
    var A4 = A3 / 4;
    sheet.getRange("A3").setValue(A3);
    sheet.getRange("A4").setValue(A4);
  }
}

ПОВЕДЕНИЕ

Этот код будет выполняться при каждая модификация в листе. Если изменение выполняется в ячейках A1 и A2, оно обновит A3 и A4 на основе вашего определения.

НАБЛЮДЕНИЯ

  • Вы должны создать устанавливаемый триггер используя тип OnEdit(). Вы можете добавить устанавливаемый триггер из редактора скриптов приложения, используя меню Edit ? Current project's triggers. Там вы должны нажать + Add Trigger и выбрать следующие параметры:
    • Выберите, какую функцию запустить: cellUpdater
    • Выберите, какое развертывание следует запустить: Head
    • Выберите источник события: Из электронная таблица
    • Выберите тип события: при редактировании
    • Настройки уведомлений о сбоях: по мере выполнения sh
    • Подробнее об этом процессе можно узнать в управляющих триггерах документация вручную
  • Эта функция будет работать на каждом листе электронной таблицы.
  • Из-за ограничения триггеров эта функция не будет активирована, если модификация выполнена Скрипты.

ALLUSIONS

Пожалуйста, примите это как одно из возможных решений вашей проблемы, и не стесняйтесь, напишите мне с любыми дополнительными сомнениями или просьбами о дальнейших разъяснениях.

0 голосов
/ 11 января 2020

если вы напишите функцию в своем файле GS следующим образом:

function onEdit(e) {
//Logic Goes Here
}

, она будет срабатывать каждый раз, когда кто-то редактирует ячейку, что более важно, она даст вам эталонный объект, который вы можете использовать для определения, где и когда произошли изменения. используйте Logger.log (e) внутри функции, чтобы увидеть, из чего состоят изменения, запустив fuction и посмотрев в поле зрения> logs

...