
1 LibreOffice Basicマクロ
LibreOffice は、オープンソースのオフィスソフトです。
マクロ機能があり、WriterドキュメントやCalcシート上にボタンを配置し、ボタンクリックでマクロの実行ができます。クリック一つで自動処理してくれるので、とても便利です。
ただ、ただですね、LibreOffice Basic というプログラミング言語での記述が必要です。いつかLibreOffice Basic を本格的に勉強しようかと思いつつ、いまだ手をつけていません。最近は、BashシェルやPowerShellに関心が向いていて、そちらの知識を習得中です。
そうした中、LibreOffice Basic マクロの中で、BsshスクリプトやPowerShellスクリプトを起動させる方法があると知りました。Basic言語に用意されているShell関数です。Shellは、LibreOffice Basicマクロ内で外部プログラムやコマンドを実行する関数です。
このShell関数を使うのが最善、というわけでもないでしょう。ただ、今の私にとっては、このShell関数はとてもありがたく、便利な存在です。
2 Shell関数の文法
LibreOffice Basicにおける Shell 関数の文法は以下のとおりです。
戻り値 = Shell( Path, Windowstyle, Param, Sync )
1.Path (必須 / 文字列)
実行したいプログラムやスクリプトのフルパスを指定します。
2.Windowstyle (整数)
プログラムを起動するときのウィンドウの見た目を指定します(0はプログラムウィンドウを非表示にして、1 は通常のウィンドウでアクティブにします)。
3.Param (省略可能 / 文字列)
プログラムに渡したい引数(パラメータ)がある場合にここに書きます。
•例: /home/hoge/script.sh に引数 dat.txt を渡したい場合、Param = "dat.txt" とします。
4.Sync (省略可能 / ブール値 True または False)
•False(デフォルト):スクリプトの終了を待たない(非同期)。
•True:スクリプトが完全に終了するまでCalc側のマクロを一時停止する。
3 スクリプト実行画面が出ない問題
上記2の文法に従って、次のマクロコードを記述しました。
Sub RunMysh
Dim scriptPath As String
scriptPath = "/home/Hoge/path/to/my_script.sh"
Shell(scriptPath, 1)
End Sub
実行権限を付けたら、my_script.shの実行ができるようになりました。
ところが、ここでつまづいてしまいました。スクリプトの実行はされるけれども、スクリプト実行画面が出てこないのです。Windowstyle引数に ウィンドウ表示の値1を指定しているのになぜだ・・・、となりました。
実は、LibreOfficeの Shell 関数は、Linuxにおいては「ターミナルというアプリ(画面)を起動する」のではなく、「Bashというプログラムの中身(シェル)だけを直接、画面なしで裏で実行する。」という動きをします。
そのため、Windowstyle に 1(ウィンドウを表示する)を指定しても、そもそも表示すべき「ウィンドウ(画面)」が最初から存在しないというわけです。だから、何も表示されません。
調べてみたら、上記のような仕組みとなっているようです。そのことを、ようやく突き止めました。
4 画面非表示問題の解決策
上記の問題を解決するために、gnome-terminalを起動させ、その中でスクリプトの実行をさせることにしました。
具体的には、次のようなコードとなります。
1 Bashスクリプトの実行
Sub RunMyBashScript
Dim cmd As String
cmd = "gnome-terminal -- bash -c '/home/Hoge/path/my_script.sh; exec bash'"
Shell(cmd, 1)
End Sub
2 PowerShellスクリプトの実行
Sub RunPowerShellScript
Dim cmd As String
cmd = "gnome-terminal -- pwsh -File '/home/Hoge/path/my_script.ps1'"
Shell(cmd, 1)
End Sub
上記1と2のコード中、ちょっと分かりにくいのが、gnome-terminal直後の「 -- 」です。これは gnome-terminal に対する特殊な引数(オプション)です。
「ここから後ろに書くのは、ターミナルの中で実行するコマンドである」という境界線(区切り)を意味しています。
5 ターミナル表示を残す工夫
Bashスクリプトを実行するマクロの中に入っている「exec bash」は、スクリプト終了直後にターミナルが勝手に閉じてしまうのを防ぐ呪文です。
PowerShellの方も、実行後にターミナル画面を残すために、PowerShell スクリプト(my_script.ps1)の一番最後の行に、以下のコードを追記しています。
# my_script.ps1 の末尾に追記
Read-Host "Enterキーを押すと終了します..."
これで、スクリプトの実行後もターミナル画面が消えるのを防ぐことができます。
以上のように、理解するまでちょっと苦労しましたが、外部プログラムを起動してくれるShell関数は、とても便利です。
それではまた次の記事で。
goosyun
