
LibreOfficeマクロをPythonとScriptForgeを使って簡単に書く

nofuture.tvサイトにあるLibreOffice関連記事について、LibreOffice日本語チーム関係者の利用、言及は強くお断りします
LibreOfficeのマクロは、Pythonを使って書けます。
とはいうものの若干難しいところがありました。しかし、LibreOffice 7.1からScriptForgeというライブラリが追加され、とても簡単にマクロが書けるようになりました。今回は、その簡単に書けるよということを紹介します。
この記事が役に立ったらコーヒーをおごろう
下のリンクはBuy me a coffeeという投げ銭システムのリンクです。役に立ったと思ったら、ぜひ投げ銭をお願いします。
準備
LinuxのFlatpak版LibreOfficeは、仕組み上、外部エディタが呼び出せません。マクロを作成する場合はDebパッケージ版をお使いください。
Pythonでマクロを書く場合、なにはなくとも最初にAPSO拡張機能をインストールしましょう。これがないと始まらないので、マクロを書くと決めたら最初にインストールしましょう。
インストールしてLibreOfficeを再起動したらメニューのツール
→拡張機能マネージャー
を開き、APSOを選択します。そしてオプションボタンを押すとマクロを書くために使用するするエディタの設定ができます。
自分は、現在、Visual Studio Codeをメインに使っているので以下のように設定しました。
- エディタ:
/usr/bin/code
- オプション:
-g {FILENAME}:{ROW}:{COL}
ほかのエディタを使っている人は、エディタの設定に合わせて呼び出しオプションを設定してください。
マクロを書く
では、マクロを書きますが、ここで困ったことがひとつ。
普段、マクロを使っていないので、どういうマクロを書けばいいのだろう…。
それで少し悩みましたが、検索しているとVBAの練習問題を出しているサイトがありました。今回は、そのサイトの問題を解いてみることにしました。 その問題が、こちらです。マクロに使う表はリンク先のページにあるので、それをコピペしてください。
マクロVBA練習問題
- 客単価を計算して、D列に入れて下さい。
※行数は2~11行の固定の記述で良いです。
※客単価 = 売上 ÷ 客数。
では、あらためてマクロを書きます。
メニューのツール
→マクロ
→Pythonスクリプトの管理
を開くとPythonスクリプトの管理ダイアログが開きます。
マイマクロが自分のマクロの保存場所です。場所はLibreOfficeプロファイルフォルダのScripts/python/
以下になります。
マイマクロをクリックしたら、ダイアログのメニューから「モジュールの作成」を選んで、モジュール名(ファイル名)を入力します。 これでマクロが書けるようになりました。
モジュール名を入力したら、マイマクロにモジュールが追加されているので選んでダイアログのメニューから「編集」を選びます。 そうすると設定したエディタが開いてマクロを書くことができます。
ScriptForgeの資料はどこにある?
ScriptForgeを使ってマクロを書くための資料ですが、一番参考になるのがヘルプファイルです。その場所ですが、これが少し探しにくい場所にあります。
というのもScriptForgeは、LibreOffice BASIC/Python両対応のライブラリなのでPython Scripts Helpの下ではなく、LibreOffice BASICのCommon Referenceの下にあります。
この中のCreating Python Scripts with ScriptForgeを見れば、おおよその検討がつきます。
そして、Overview of the ScriptForge LibraryのServices provided by the ScriptForge libraryから、Calcの操作をするならSFDocuments.Calc serviceに移動すれば、どんなことができるか調べられます。
実際に書いたマクロ
こういうふうに書きました。リスト内包表記を使えばスマートに書ける気がするけど、Python力最弱で初めてのマクロということで許して。
from scriptforge import CreateScriptService # ScriptForgeを使うために必須
def practice1():
doc = CreateScriptService("Calc") # Calcのインスタンスを生成
uriage_kyaku =doc.GetValue("B2:C11") # GetValueで範囲をuriage_kyakuに2次元リストに入れる
j = 0
for i in uriage_kyaku:
doc.SetValue("D{}".format(j+2),(i[0] / i[1])) # uriage_kyakuから配列取り出して、SetValueでD2セルからセットする
j += 1
マクロを実行するには
マクロの実行方法ですが、Pythonスクリプトの管理ダイアログを開いてモジュールをクリックすると作成した関数があります(上の例ではpractice1)。それを選んでダイアログの「実行」ボタンを押すだけです。
そのほか外部ライブラリとか
Pythonのライブラリやモジュールを使いたい場合、ユーザープロファイル/Scripts/python/pythonpath/
以下に置いておくと利用できるようです。
- Python : Importing Modules: https://help.libreoffice.org/latest/en-US/text/sbasic/python/python_import.html
あと、強引にpipを放り込むzaz-pipという拡張機能があるけど、LibreOffice本体のPythonフォルダに追加しようとするので使い物にならず実質、LibreOffice Portable用ですね。
まとめ
サクっと書けそうなので何かのときにはよさそう。しかし、自分の場合、外部で加工したものをLibreOfficeで整形する使い方だとマクロを使う必要性が無いんだよなぁ。LibreOfficeの中でいい使いみちがあれば教えてください。
この記事が役に立ったらコーヒーをおごろう
下のリンクはBuy me a coffeeという投げ銭システムのリンクです。役に立ったと思ったら、ぜひ投げ銭をお願いします。