Skrypt Google Apps onChange nie może przekazać obiektu wyzwalacza do zmiennej [duplicate]

Dec 28 2020

Ten post został zamknięty, ale nigdzie indziej nie udało mi się znaleźć podobnego problemu.

Próbuję opracować skrypt, który ukryje wiersze przed wyzwalaczem onChange (). Gdy komórka zmieni się na „0”, chcę, aby wiersz, w którym znajduje się komórka, stał się ukryty. Komentarze z mojego pierwszego postu nauczyły mnie, że obiekt przekazany z onChange nie zawiera zakresu. Czy istnieje obejście, które rozwiązałoby ten problem?

Mój arkusz kalkulacyjny zawiera arkusz wejściowy dla zaplecza i arkusz wyjściowy dla frontendu, który trafia do klienta. Potrzebuję wyzwalacza onChange, aby dane trafiały do ​​interfejsu użytkownika, aby były ładnie sformatowane do wysyłania pocztą e-mail do klienta. Co najważniejsze, potrzebuję do ukrycia pustych ('0) wierszy.

Jestem nowy i dopiero się uczę, więc to, co napisałem, nie działa, ponieważ obiekty onChange nie zawierają zakresu. Dziękuję Ci.

function onChange(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Client");
  var cell = e.range;
  var VALUE = cell.getValue(); 
  if(VALUE == 0){
        sheet.hideRow(cell);
  }
}

Próbowałem też:

function onChange(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Client");
  var cell = e.getValue(); 
  if(cell == 0){
        sheet.hideRow(cell);
  }
}

Odpowiedzi

Cooper Dec 28 2020 at 03:57

Nie ma wartości zakresu zwróconej przez wyzwalacz onChange. Oto jak wygląda obiekt zdarzenia.

{"authMode":"FULL","changeType":"INSERT_ROW","source":{},"triggerUid":"","user": {"email":","nickname":""}}

Dodatkowo pamiętaj o zmianie wymaga zainstalowanego wyzwalacza.

Obiekt zdarzenia onChange

joshmeranda Dec 28 2020 at 04:00

Wygląda na to, że masz pomieszane wyzwalacze. W wyzwalane, gdy wystąpi „większe” lub zmiany strukturalne, a nie na zmienionych wartości. Z dokumentów :onChange onEditonChange

Instalowalny wyzwalacz zmiany jest uruchamiany, gdy użytkownik zmodyfikuje strukturę samego arkusza kalkulacyjnego - na przykład dodając nowy arkusz lub usuwając kolumnę.

Na podstawie specyfikacji obiektu zdarzenia widać, że żadna wartość nie jest przekazywana do programisty z onChangewyzwalacza, a zatem typ funkcji, której szukasz, nie jest łatwy do wykonania.

Chcesz użyć onEditwyzwalacza, który będzie działał bliżej tego, czego szukasz. Uruchomi się przy każdej zmianie wartości i da ci nowe i stare wartości. onEditjest również „ prostym wyzwalaczem ”, więc nie ma potrzeby instalowania dodatkowych wyzwalaczy, jak to robisz onChange.

Użycie onEdittwojego kodu będzie wyglądało mniej więcej tak:

function onEdit(e) {
  val range = e.range;
  val sheet = SpreadsheetApp.getActiveSheet();

  if (e.value == 0) {
    var rowNum = e.range.getRow();
    sheet.hideRow(rowNum);
  }
}