Informacje o dokumencie

Gotowe szablony, skrypty, makropolecenia i rozszerzenia. Tutaj możesz pochwalić i podzielić się swoją twórczością z innymi użytkownikami

Oceń tę funkcję. (Mogą to zrobić tylko zalogowani użytkownicy)

1. Niepotrzebna
0
Brak głosów
2. Może się przydać
5
83%
3. Dobrze, że została napisana
1
17%
 
Liczba głosów: 6

Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Informacje o dokumencie

Post autor: Jermor »

Opis zmodyfikowany 16 stycznia 2021.
Przedstawiam, zmodyfikowaną przy współpracy z kolegą @Rafkus, funkcję napisaną dla arkusza Calc, pozwalającą otrzymać niektóre informacje o dokumencie. Pierwszy argument funkcji, podany jako tekst, decyduje jaka informacja zostanie zwrócona. Drugi argument należy podać, jeśli wynik ma zostać sformatowany wg. wymogów użytkownika, w taki sam sposób, jak to opisano w pomocy do funkcji TEKST(). Funkcję można wkopiować do biblioteki "Standard" w kontenerze "Moje makra" i wywoływać ją w arkuszu kalkulacyjnym.
DOKINFO("TypInfo";"styl")
Argument TypInfo wpisywany bezpośrednio do funkcji musi być ujęty w cudzysłów, można go wpisać dowolnymi literami i jest jednym ze słów:
  • Autoro - funkcja zwraca informację kto jest autorem dokumentu.
  • Utworzony - funkcja zwraca datę i godzinę utworzenia dokumentu.
  • Zmodyfikowany - funkcja zwraca datę i godzinę ostatniej modyfikacji.
  • Autorm - funkcja zwraca informację kto jako ostatni modyfikował dokument.
  • Czas - Funkcja zwraca informację o łącznym czasie pracy na dokumencie
  • Ile - Funkcja zwraca informację ile razy dokument był zapisywany.
Argument styl, jeśli zostanie użyty, musi prezentować format jednego z dopuszczalnych sposobów przedstawiania daty i/lub czasu także wpisany w postaci tekstu.

Przykłady:
=DOKINFO("autoro") zwróci informację o osobie, która utworzyła dokument
=DOKINFO(B2) bez drugiego argumentu, gdy B2 zawiera wpisany ciąg "czas", zwróci łączny czas pracy nad dokumentem w układzie: ilość godzin:ilość minut:ilośc sekund.
=DOKINFO("czas";"[mm]") zwróci, podany w minutach, łączny czas pracy nad dokumentem.
=DOKINFO("utworzony";"dd. mmmm yyyy") zwróci datę utworzenia dokumentu w postaci dzień. (liczba.) miesiąc (słownie) rok(liczba) np. 16. stycznia 2021

Kod: Zaznacz cały

Function DokInfo(optional info, Optional styl)
REM Funkcja zwraca wskazaną przez parametr informację o dokumencie
REM argument "info" musi być tekstem:
REM "AutorO" - podaje kto jest autorem dokumentu.
REM "Utworzony" - data utworzenie dokumentu.
REM "Zmodyfikowany" - data ostatniej modyfikacji.
REM "AutorM" - autor ostatniej modyfikacji.
REM "Ile" - Liczba sesji z dokumentem.
REM "Czas" - łączny czas pracy nad dokumentem
REM argument "styl", jeśli wystąpi, musi być jednym z dopuszczalnych formatów
REM prezentacji daty i/lub czasu podany jako tekst, tak jak w funkcji TEKST()
REM Autorzy: Jermor & Rafkus. Polskie forum Apache OpenOffice i LibreOffice (2021)
Dim oData As Object, oDoc As Object
If isMissing(info) Or isArray(info) Then DokInfo="Zły argument" : Stop 
If IsMissing(styl) Then styl="Standard"
On Local Error GoTo niemodyfikowany
oDoc=ThisComponent.DocumentProperties
info=UCase(info)
With oDoc
Select Case info
   Case "AUTORO"
      DokInfo= .Author
   Case "UTWORZONY"
      oData=.CreationDate
      With oData
         DokInfo=Format(DateSerial(.Year,.Month,.Day)+TimeSerial(.hours,.minutes,.seconds),styl)
      End With
   Case "ZMODYFIKOWANY"
      oData=.ModificationDate
      With oData
         DokInfo=Format(DateSerial(.Year,.Month,.Day)+TimeSerial(.hours,.minutes,.seconds),styl)
      End With
   Case "AUTORM"   
      DokInfo=.ModifiedBy
   Case "ILE"
      DokInfo=.EditingCycles
   Case "CZAS"
      DokInfo=Format(.EditingDuration/86400,Iif(styl="Standard","[h]:mm:ss",styl))
   Case Else
      DokInfo="Zły argument"
   End Select
End With
Exit Function
niemodyfikowany:
DokInfo="Dokument nie był modyfikowany"
End Function
Do powyższego kodu uwagi dodatkowe wyjasnienia dodał Jan_J i są one zamieszczone w tym wątku: https://forum.openoffice.org/pl/forum/v ... 286#p23286
Ostatnio zmieniony wt sty 19, 2021 4:47 pm przez Rafkus, łącznie zmieniany 7 razy.
Powód: Zmodyfikowałem kod funkcji.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Informacje o dokumencie

Post autor: Rafkus »

Szkoda tylko, że data modyfikacji nie odświeża się automatycznie - aktualizuje się tyko podczas otwierania dokumentu.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Informacje o dokumencie

Post autor: Jan_J »

Jermor pisze:Do powyższego kodu uwagi dodał Jan_J i są one zamieszczone w tym wątku: h[url]ttps://forum.openoffice.org/pl/forum/viewtopic.php?f=9&t=5536&p=23286#p23286[/url]
No nie:
uwagi dotyczyły technicznego apektu przechowywania tych informacji w dokumentach o typowych formatach; kod natomiast korzysta z interfejsu programowego (API) dotyczącego zarządzania sesjami OpenOffice.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Informacje o dokumencie

Post autor: Jermor »

Do @Jan_J, przepraszam za niezręczność, miałem na myśli dodatkowe wyjaśnienia, które rzeczywiście mogą przydać się użytkownikowi. Poprawiłem to zdanie.
Poprawiłem niezauważony błąd w argumencie funkcji Format dotyczącej minut (w dwóch miejscach). Drugi argument tej funkcji powinien być ujęty w cudzysłów.
Do @JedenGość @Rafkus - przeoczyłem, że to ty napisałeś post o tej dacie. Zafiksowałem się na @JedenGość i to jemu pisałem objaśnienie. Data modyfikacji umieszczana jest w dokumencie w momencie jego zapisu. Funkcje przeliczane są na początku, po załadowaniu pliku oraz wtedy gdy w arkuszu nastąpią zmiany zawartości wpływające na te funkcje. Data modyfikacji nie jest zapisana w arkuszu lecz "wyciągana" z wnętrza dokumentu, więc jej zmiana w trakcie zapisu dokumentu, nie wpływa na wynik funkcji. Można jednak uzyskać tę datę podczas sesji, w której kilkukrotnie zapisuje się rezultat pracy, w ten sposób, że utworzy się formułę:
=DOKINFO("zmodyfikowany")&T(LOS()) [poprawiłem (po uwadze @Rafkus, poniżej) ponieważ wynikiem tej funkcji jest tekst , dla wyników liczbowych formułę należy uzupełnić o +0*LOS()].
LOS() wyznacza liczbę losową przy każdym przeliczaniu arkusza. Funkcja T(argument) zwraca pusty ciąg znakowy wtedy, gdy argument jest liczbą. Ponieważ LOS wyznacza liczbę zawsze i jest częścią formuły, to wymusza także w tej formule wyznaczenia wyniku funkcji DOKINFO, jeśli dokument został w między czasie zapisany, to pojawi się nowa wartość. Wartość ta pojawi się po pierwszej modyfikacji komórki i nie będzie się zmieniała podczas wprowadzania następnych zmian dopóty, dopóki dokument nie zostanie ponownie zapisany. Jest to o tyle logiczne, że po zapisie można wprowadzić i 10 000 zmian, a następnie zamknąć dokument bez zapisywania, co oznacza zaniechanie wszystkich wprowadzonych modyfikacji.
Ostatnio zmieniony sob sty 09, 2021 9:52 pm przez Jermor, łącznie zmieniany 1 raz.
Powód: Uwaga @Rafkus o nieprawidłowym operatorze łączenia w formule.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Informacje o dokumencie

Post autor: Rafkus »

=DOKINFO("zmodyfikowany")+T(LOS())
Ten sposób zadziałał, gdy zamiast + użyłem znaku &. Dziękuję, przydatna sztuczka.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Informacje o dokumencie

Post autor: Jermor »

No przecież! "&" dla ciągów tekstowych. Dla wyników liczbowych: "+ 0*LOS()"
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Informacje o dokumencie

Post autor: Rafkus »

Pozwoliłem sobie zamienić ze sobą położenie dwóch linijek kodu, oto one:

Kod: Zaznacz cały

On Local Error GoTo niemodyfikowany
oDoc=ThisComponent.DocumentProperties

Podczas testowania tej funkcji odkryliśmy, że jeżeli funkcja ta zostanie zapisana w głównym kontenerze makr (czyli w "Moich makrach") to podczas uruchamiania danego pliku powstaje jakiś błąd. Wydaje mi się, że funkcja ta zostaje po prostu wywołana za wcześnie, tj. w chwili gdy dokument nie jest jeszcze w pełni załadowany i nie wiadomo co jest "tym komponentem". Po zmianie w kodzie, zamiast wykrzaczeniu się komunikatów o błędzie, do komórki (-ek) zostanie wpisany tekst "Dokument nie był modyfikowany". I teraz znam dwa sposoby na wymuszenie pojawienia się poprawnych wartości:
  • 1. Jeżeli w jakiś komórkach zostały dokonane jakieś zmiany to zapisać dokument, a następnie z menu Plik wybrać Załaduj ponownie.
  • 2. Wykorzystać sztuczkę zaproponowaną wcześniej przez @Jermora:
    Można jednak uzyskać tę datę podczas sesji, w której kilkukrotnie zapisuje się rezultat pracy, w ten sposób, że utworzy się formułę:
    =DOKINFO("zmodyfikowany")&T(LOS()) [poprawiłem (po uwadze @Rafkus, poniżej) ponieważ wynikiem tej funkcji jest tekst , dla wyników liczbowych formułę należy uzupełnić o +0*LOS()].
    LOS() wyznacza liczbę losową przy każdym przeliczaniu arkusza. Funkcja T(argument) zwraca pusty ciąg znakowy wtedy, gdy argument jest liczbą. Ponieważ LOS wyznacza liczbę zawsze i jest częścią formuły, to wymusza także w tej formule wyznaczenia wyniku funkcji DOKINFO, jeśli dokument został w między czasie zapisany, to pojawi się nowa wartość. Wartość ta pojawi się po pierwszej modyfikacji komórki i nie będzie się zmieniała podczas wprowadzania następnych zmian dopóty, dopóki dokument nie zostanie ponownie zapisany.
PS. Opisany błąd nie pojawiał się jeżeli ta funkcja została zapisana w pliku.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Informacje o dokumencie

Post autor: Jermor »

Też to zauważyłem i zamieniłem kolejność.
Co do używania funkcji LOS(). W tej wersji funkcji daty są liczbami (sformatowanymi jak data i czas), zatem należałoby dopisać +0*LOS().
Jednak wówczas wynik zostanie przekształcony znowu na liczbę. Dlatego funkcje można wywołać bez argumentu "styl" a wynikową komórkę należy sformatować na datę.
Moje spostrzeżenia sugerują, że błąd pojawia się wtedy, gdy funkcję wpisuje się do nowego dokumentu, takiego, który nie był jeszcze zapisany. Wtedy obiekt ModificationDate ma wartość NULL, czyli nie został jeszcze zainicjowany. Dlatego pojawia się błąd Basica.
Ale zauważyłem więcej dziwnych zachowań. Chyba napiszę w tej sprawie do bugzilli.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
AlaKowalczyk
Posty: 1
Rejestracja: ndz kwie 11, 2021 2:23 pm

Re: Informacje o dokumencie

Post autor: AlaKowalczyk »

Dzięki wielkie, bardzo użyteczna funkcja ;)
OpenOffice 2.4 pod Ubuntu 9.04
wyszukiwarka vod
ODPOWIEDZ