Automatyczna aktualizacja kolumny w arkuszu kalkulacyjnym Google pokazująca datę ostatniej modyfikacji

37

Próbuję znaleźć sposób na automatyczną aktualizację kolumny drugiej, aby pokazać znacznik czasu ostatniej aktualizacji. Zdaję sobie sprawę, że dokument pokazuje znacznik czasu ostatniej modyfikacji, ale mamy wielu klientów uzyskujących dostęp do dokumentu i dostosowujących go w tym samym czasie. Więc ta prośba została złożona. Przyznam, że nie kodowałem, więc to mnie przerasta.

Myanda opublikowała coś, co wydawało się właściwą ścieżką, ale nie jesteśmy pewni, jak wdrożyć to dla naszych potrzeb:

Znacznik czasu arkusza kalkulacyjnego Google?

RichGonzalez
źródło
Byłoby pomocne, gdybyś mógł połączyć nas z dokumentem lub podać przykładowy dokument tego, czego szukasz. Mogę odpowiednio zmodyfikować swoją drugą odpowiedź, ale nie jestem pewien, o co pytasz. Czy potrzebujesz tylko jednej komórki zaktualizowanej ze znacznikiem czasu, który pokazuje, kiedy cały arkusz kalkulacyjny został zaktualizowany?
OnenOnlyWalter
Cześć Onen. To, czego szukamy, to w kolumnie 2 każdy wiersz jest aktualizowany znacznikiem czasu za każdym razem, gdy jakakolwiek komórka w odpowiednim wierszu jest aktualizowana. Nie mogę opublikować dokumentu, ponieważ jest to niestety poufne. Ale zawiera 21 kolumn i 60 wierszy. czy to pomaga?
RichGonzalez,
Rozumiem, pozwól mi rzucić okiem na mój oryginalny kod i wrócić do ciebie :)
OnenOnlyWalter
Bardzo ceniony Onen!
RichGonzalez

Odpowiedzi:

36

Ok, tutaj jest zmodyfikowana wersja kodu z mojej poprzedniej odpowiedzi:

function onEdit(e) {
  // Your sheet params
  var sheetName = "MySheet";
  var dateModifiedColumnIndex = 2;
  var dateModifiedColumnLetter = 'B';

  var range = e.range; // range just edited
  var sheet = range.getSheet();
  if (sheet.getName() !== sheetName) {
    return;
  }

  // If the column isn't our modified date column
  if (range.getColumn() != dateModifiedColumnIndex) { 
    var row = range.getRow();
    var time = new Date();
    time = Utilities.formatDate(time, "GMT-08:00", "MM/dd/yy, hh:mm:ss");
    var dateModifiedRange = sheet.getRange(dateModifiedColumnLetter + row.toString());
    dateModifiedRange.setValue(time);
  };
 };

Powoduje to pobranie wiersza dowolnej zmienionej komórki i przypisanie znacznika czasu do drugiej kolumny tego konkretnego wiersza.

Aby wdrożyć, wystarczy przejść do arkusza kalkulacyjnego i kliknąć Tools> Script Editor. Na wynikowej stronie edytora po prostu wklej to tam. Ponieważ jest to onEdit()funkcja, powinna działać bez konieczności dodawania czegokolwiek innego do komórek arkusza kalkulacyjnego, wystarczy wkleić go do edytora i zapisać.

Dla znacznika czasu ustawiłem format na MM / dd / rr i zostawiłem czas. Jeśli chcesz to zmienić, możesz po prostu zmienić sposób użycia Utilities.formatDate.

OnenOnlyWalter
źródło
Onen, działa idealnie! Dziękuję bardzo!
RichGonzalez,
1
Miło to słyszeć! Czy możesz zatem zaznaczyć tę odpowiedź znacznikiem wyboru :) Powiedziałbym, że było tak, aby inni wiedzieli, że to rozwiązanie działa, ale to również dlatego, że chciałbym uzyskać punkty: P
OnenOnlyWalter
Zrobię. To na pewno działa. Jedno kolejne pytanie. Nic tak komplementowanego. Zmiana na PST nie wydaje się zmieniać go na czas pacyficzny, ale EST działa. Czy Java czyta PST jako inny skrót. Czy istnieje sposób, aby wyświetlić czas jako czas 12-godzinny w porównaniu do czasu wojskowego?
RichGonzalez
1
znacznik czasu nie działa dla mnie. Zamiast mnie działa „20yy-MM-dd GG: mm”. Myślę, że dd; musi być pisane małymi literami lub nie działa (chyba że był to styczeń, kiedy tak było, ahahahah).
Riccardo,
1
Zauważ, że użycie „DD” dla .formatDate()da ci „Dzień w roku” - np. 365 dla 31 grudnia. Prawdopodobnie chcesz „dd”. Możesz zobaczyć pełną listę wartości formatu daty tutaj: docs.oracle.com/javase/7/docs/api/java/text/…
Dan Nguyen
8

Do Twojej wiadomości zaakceptowana odpowiedź jest używana DDjako format dnia, dzięki czemu otrzymasz coś w rodzaju „312”, tj. 312 dnia roku.

Użyłem tego:

"yyyy-MM-dd, hh:mm:ss"

aby to uzyskać:

2013-11-12, 03:43:20
Dan Nguyen
źródło
1
dlaczego nie poprawić przyjętej odpowiedzi?
alexkovelsky
4

Mam nadzieję, że można to tutaj umieścić. Poniżej znajduje się modyfikacja powyższej funkcji, ale aby to zrobić dla wiersza (wiersz 9), a nie dla kolumn. Zastanawianie się, jak użyć przypisania do kolumny, było bardzo frustrujące, ale okazało się niezwykle proste. Dzięki OnenOnlyWalter za oryginalny kod:


function onEdit() { 
    var s = SpreadsheetApp.getActiveSheet(); // Get spreadsheet name 
    var r = s.getActiveCell(); // store active cell name in current spreadsheet 
  var cell1 = 9 // This is the row I want to put values
  if(r.getRow() != cell1) { // Ignores this row (where I put the dates)
    var column = r.getColumn();  // Get column # from active cell
    var time = new Date(); // Get date and time of last mod
    time = Utilities.formatDate(time, "GMT-08:00", "MM/DD/yy, hh:mm:ss"); // Format date and time
    SpreadsheetApp.getActiveSheet().getRange(cell1,column).setValue(time); // put in time in cell
  };
 };
user2023699
źródło
Wydawało mi się, że działa całkiem dobrze. Dziękujemy za naprawienie błędu 8 w wierszu @ OnenOnlyWalter.
Zlatty,
Ponieważ zegary użytkownika mogą być niedokładne, czy istnieje standardowy sposób uzyskania dokładnego znacznika czasu po stronie serwera?
Sim
@Sim Skrypt Google Apps działa po stronie serwera. Czas, który otrzymasz, pochodzi z serwera.