Как создать счетчик в листах Google, который будет подсчитывать, сколько раз вычисленная ячейка изменила значение? - PullRequest
0 голосов
/ 12 июня 2019

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

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

Вот ссылка на образец таблицы - https://docs.google.com/spreadsheets/d/1QfM764_cPbtN46oDSbGBFgVNYZ1R6dwxIs744cyRsS4/edit?usp=sharing

Столбец H имеет сигнал (покупка или продажа), который рассчитывается на основе цен и может меняться в течение дня. В коде должно быть указано количество раз, когда сигнал был на покупке или продаже в течение дня, а затем сброс в конце дня.

Любая помощь будет очень признательна, так как я очень застрял в этом.

EDIT

Я придумал этот код, который работает с одной строкой данных:

function Counter(e) {  
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Counter");
  var r = s.getRange("H2");
  var v= r.getValue();
  var h = s.getRange("N2").getValue();
    if(v !== h) {
      var sCounter = s.getRange("I2");
      var timestamprange = s.getRange("J2")
      var formattedDate = Utilities.formatDate(new Date(), "GMT+5", "yyyy-MM-dd HH:mm:ss");

      var counter = sCounter.getValue();

      if(counter === 0) {
          counter = 1;
          } else {
            counter ++;
          }
          sCounter.setValue(counter);
          timestamprange.setValue(formattedDate)
      ;}
 s.getRange(2, 14).setValue(v)
}

Как настроить код так, чтобы он был одинаковым для диапазонов "H2: H51", "I2: I51", "J2: J51"?

РЕДАКТИРОВАТЬ 2:

Я попробовал самостоятельно и придумал этот код, который не работает:

function Test() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Counter");
  var newvalues = s.getRange("H2:H51").getValues();
  var oldvalues = s.getRange("N2:N51").getValues();

  for(n=0;n<newvalues.length;++n){
    var nv = newvalues[n][0] ; 
    var o = oldvalues[n][0] ;
    if(nv !== o) {
      var sCounter = s.getRange("I2:I51");
      var timestamprange = s.getRange("J2:J51");
      var formattedDate = Utilities.formatDate(new Date(), "GMT+5", "yyyy-MM-dd HH:mm:ss");
      var counter = sCounter.getValues();
      if(counter[n][0] === 0) {
        counter[n][0] = 1;
        } else {
            counter[n][0] ++;
          }
      sCounter.setValues(counter[n][0]);
      timestamprange.setValue(formattedDate);
    }

}
  s.getRange("N2:N51").setValues(newvalues)
}

Любые идеи приветствуются!

1 Ответ

0 голосов
/ 19 июня 2019

Я пришел с ответом, который работает для меня, я уверен, что он не оптимален, но он выполняет свою работу.) Установите триггер для запуска каждую минуту.Он также добавляет дату и время в следующем столбце, если счетчик изменяет значение, чтобы отследить последнее изменение, если оно кому-нибудь понадобится.Обновления до кода приветствуются

Рабочий код:

function Counter() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("DataStructured");
  var newvalues = s.getRange("H2:H51").getValues();
  var oldvalues = s.getRange("N2:N51").getValues();

  for(n=0;n<newvalues.length;++n){
    var nv = newvalues[n][0]; 
    var o = oldvalues[n][0];
    if(nv !== o) {
      var sCounter = s.getRange("I2:I51");
      var timestamprange = s.getRange("J2:J51")
      var formattedDate = Utilities.formatDate(new Date(), "GMT+5", "yyyy-MM-dd HH:mm:ss");

      var counter = sCounter.getValues();
      if(counter[n][0] === 0) {
        counter[n][0] = 1;
        } else {
            counter[n][0] ++;
          }
      sCounter.setValues(counter);
      s.getRange("J"+(n+2)).setValue(formattedDate);
    }

}
  s.getRange("N2:N51").setValues(newvalues)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...