Początki - skopiuj zawartość komórki i wklej w inne

Makropolecenia i programy współpracujące z OpenOffice tworzone w językach innych niż Basic
Pysio
Posty: 60
Rejestracja: czw mar 12, 2020 11:39 am

Początki - skopiuj zawartość komórki i wklej w inne

Post autor: Pysio »

Zacząłem naukę Pythona i chcę przenieść to do Calca.

Ćwiczę sobie i zaciąłem się na wstępie :crazy:
Docelowo chcę przenieść wartości z komórek A1:A30 (1-30), dodać 1 do każdej wartości i przenieść wynik do komórek B1:B30 (2-31)

Na razie chcę po prostu przenieść wartości z A1:A30 do B1:B30 i wyrzuca mi błąd przy uruchamianiu makro.
Wg dokumentacji wygląda to ok, jednak coś nie chodzi. Gdzie jest problem?

from scriptforge import CreateScriptService
doc = CreateScriptService("Calc")

def increment_cell():
values = doc.GetValue("~.A1:A30")
doc.SetValue(B1:B30,values)
g_exportedScripts = (increment_cell, )

Błąd:

Wystąpił błąd modułu Scripting Framework podczas wykonywania w języku Python skryptu vnd.sun.star.script:myPyScripts.py$increment_cell?language=Python&location=user.

Wiadomość: <class 'SyntaxError'>: invalid syntax (myPyScripts.py, line 6)
File "C:\Program Files\LibreOffice\program\pythonscript.py", line 1063, in getScript
mod = self.provCtx.getModuleByUrl( fileUri )
File "C:\Program Files\LibreOffice\program\pythonscript.py", line 489, in getModuleByUrl
code = compile( src, encfile(uno.fileUrlToSystemPath( url ) ), "exec" )
OpenOffice 4.1.7 / LibreOffice 6.4.4.2 na Windows 10
Jan_J
Posty: 4626
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Początki - skopiuj zawartość komórki i wklej w inne

Post autor: Jan_J »

I. Python jest językiem, w którym układ typograficzny tekstu jest ważny.
Zwróć uwagę na różnicę:

from scriptforge import CreateScriptService
doc = CreateScriptService("Calc")

def increment_cell():
values = doc.GetValue("~.A1:A30")
doc.SetValue(B1:B30,values)
g_exportedScripts = (increment_cell, )

vs

Kod: Zaznacz cały

from scriptforge import CreateScriptService
doc = CreateScriptService("Calc")

def increment_cell():
    values = doc.GetValue("~.A1:A30")
    doc.SetValue(B1:B30,values)
g_exportedScripts = (increment_cell, )
Używaj znacznika [ code ] jeśli chcesz, by odbiorca rozumiał Twój kod.

II. Na ile umiesz Pythona? nie biblioteki, nie poradniki, tylko podstawowe zasady.

W instrukcji

Kod: Zaznacz cały

values = doc.GetValue("~.A1:A30")
fragment "~.A1:A30" jest daną tekstową (typ str).

W instrukcji

Kod: Zaznacz cały

doc.SetValue(B1:B30,values)
fragment B1:B30 nie jest daną tekstową. Czym jest? niczym; odwołuje się do obiektów o nazwach B1 i B30, które nie są zdefiniowane.
Komunikat diagnostyczny dotyczy błędu składniowego w wierszu 6. Czyli właśnie w tej instrukcji.

// edit 31 marca

Sprawdziłem właśnie, że następująca modyfikacja

Kod: Zaznacz cały

from scriptforge import CreateScriptService
doc = CreateScriptService("Calc")

def increment_cell():
    values = doc.GetValue("A1:A30")
    doc.SetValue("B1:B30",values)

g_exportedScripts = (increment_cell, )
efektywnie kopuje wartości z 30 wierszy kolumny A bieżącego arkusza do jego kolumny B.
Zgodnie z moją sugestią wynikającą z ogólnej wiedzy, zastąpiłem B1:B30 tekstem "B1:B30".
Natomiast zrozumienie, jaki jest sposób i zakres tego działania (w tym przypadku: bieżący arkuszu bieżącego skoroszytu Calc) — wynika ze sposobu zaprojektowania biblioteki ScriptForge. Tu może być sporo nieoczywistych założeń, które warto znać, jeśli bardziej ufamy precyzji wypowiedzi niż intuicji. Warto więc czytać dokumentację.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ