LibreOfficeのマクロシステムを使ってCalcでPythonを実行する

ターミナルから実行したPythonスクリプトがCalcで開いているスプレッドシートを読み取ったり変更したりできない場合は、おそらくLibreOfficeの外部で実行されています。CalcのPythonマクロはLibreOfficeプロセス内で実行する必要があります。LibreOfficeプロセス内では、LibreOfficeがアクティブなドキュメントコンテキストを提供します。スクリプトをユーザーのPythonスクリプトフォルダにモジュールとして保存し、関数をエクスポートしてg_exportedScripts、Calcのマクロダイアログから起動してください。

これは、開いているワークブックに関連付けられた小規模な自動化を行うための最も簡単な方法です。LibreOfficeの最新のPythonスクリプトヘルプでは、プロセス内マクロと個別に接続されたPythonスクリプトの両方について説明していますが、以下の手順ではプロセス内マクロの方法を使用します。

通常のPythonスクリプトが開いているスプレッドシートを認識しないのはなぜですか?

LibreOffice は、グローバル変数 `.` を介して、実行中の Python マクロに現在のドキュメントを公開しますXSCRIPTCONTEXT。通常のコマンドで起動されるスクリプトはpython別のプロセスであるため、グローバル変数 `.` は自動的には利用できません。スクリプトは LibreOffice と通信できますが、そのためには既に実行中の Office プロセスへの UNO 接続を設定する必要があります。最初のマクロの場合は、代わりに LibreOffice 内で関数を実行してください。

Pythonマクロはモジュール内の関数です.py。モジュールのg_exportedScriptsタプルによって、LibreOfficeがマクロリストに表示する関数が決定されます。これらの詳細は、LibreOfficeのPythonプログラミングリファレンスに記載されています。

CalcにPythonマクロを追加するにはどうすればよいですか?

1. ユーザーのPythonスクリプトフォルダを探します。

ユーザーアカウントで開いているLibreOfficeドキュメントから実行できるスクリプトを作成したい場合は、個人用の「マイマクロ」%APPDATA%\LibreOffice\4\user\Scripts\pythonフォルダを使用してください。LibreOfficeでは、Windowsでは、$HOME/.config/libreoffice/4/user/Scripts/pythonLinuxおよびmacOSでは、このフォルダを次のように記述します。Scripts/pythonフォルダが存在しない場合は、作成してください。スクリプトの場所に関するリファレンスでは、アプリケーションマクロやドキュメントに埋め込まれたマクロなど、他のマクロコンテナについても説明しています。

LibreOfficeのユーザーScripts/pythonフォルダにあるhello_calc.pyという名前のPythonファイル
マクロモジュールをユーザーのScripts/pythonフォルダに配置してください。そうすることで、LibreOfficeが「マイマクロ」にマクロモジュールを表示できるようになります。

ドキュメントマクロは特定のファイル内に保存され、そのドキュメントを開いている間のみアクセスできます。再利用可能な個人用ユーティリティとしては、「マイマクロ」の方が一般的に管理が容易です。LibreOfficeのアプリケーション全体のマクロフォルダは管理者権限が必要になる場合があるため、変更しないようにしてください。

2. 小さなテスト関数を作成してエクスポートする

プレーンテキストエディタを開き、hello_calc.py上記のフォルダ内にファイルを作成して、以下を追加します。

def hello_calc(*args):
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets[0]
    sheet.getCellRangeByName("A1").setString("Hello from Python")

g_exportedScripts = (hello_calc,)

この関数は、現在マクロ呼び出しに接続されているドキュメントを取得し、その最初のシートを選択して、A1 に無害なテスト文字列を書き込みます。最後の行が重要です。エクスポートされたタプルがないと、この関数は実行可能なマクロとして表示されない可能性があります。ファイルを.py拡張子付きのプレーンテキストとして保存してください。リッチテキスト ドキュメントや拡張子が のファイルとして保存しないでください.py.txt。

XSCRIPTCONTEXT を使用した Python マクロ コードと、g_exportedScripts に hello_calc をリストする
エクスポートされた関数は、XSCRIPTCONTEXT を使用して開いているドキュメントにアクセスし、テスト値をセル A1 に書き込みます。

LibreOffice はXSCRIPTCONTEXTマクロモジュールに変数を提供します。ただし、その変数はコードによってインポートされるモジュールに自動的に渡されるわけではないため、最初のテストは自己完結型にしてください。後で再利用可能な関数を他のモジュールに分割する場合は、LibreOffice のPython モジュールインポートに関するガイダンスに従ってください。

3. Calcファイルを開き、エクスポートした関数を実行します。

  1. Calcでテスト用のスプレッドシートを開きます。開発中は、コピーしたワークブックまたは空白のワークブックを使用してください。
  2. 「ツール」>「マクロ」>「マクロの実行」を選択します。
  3. ライブラリ一覧で「マイマクロ」を展開し、Pythonモジュールを選択して、hello_calcマクロ名から選択します。
  4. 「実行」をクリックします。

同じ機能は、LibreOfficeがプロセス内Pythonスクリプトに推奨し、Pythonシェルも提供するAPSO拡張機能からも起動できます。ただし、ここで説明する基本的なマクロ実行フローにはAPSOは必要ありません。

LibreOfficeのマクロセレクターで、「マイマクロ」の下にhello_calcがハイライト表示され、「実行」ボタンが表示されている。
「マイマクロ」からエクスポートしたhello_calc関数を選択し、Calcから実行してください。
LibreOffice Calcで選択したセルA1に「Hello from Python」と表示
A1セルに値が表示されていることで、テストマクロがCalcドキュメントに到達し、セルが変更されたことが確認できます。

マクロが存在しない場合、または何も機能していないように見える場合はどうすればよいでしょうか?

広範なセキュリティ設定を変更するのではなく、以下のチェック項目を順番に実行してください。

  • モジュールが一覧に表示されません。ファイルが正確なユーザーScripts/pythonパスにあり、.py拡張子が付いていて、スペルミスのないg_exportedScriptsタプルが含まれていることを確認してください。マクロダイアログを再度開きます。それでもLibreOfficeに新しく追加したファイルが表示されない場合は、LibreOfficeを閉じて再起動し、再度確認してください。
  • マクロ名がありません。エクスポートされたタプルに関数オブジェクトが含まれていることを確認してください。たとえば(hello_calc,)、 。カンマは、これを1項目のPythonタプルにします。
  • ターミナルには何も表示されません。標準のマクロダイアログからPythonマクロを実行すると、出力はprint()利用できません。上記のテストではA1セルに書き込まれるため、結果がシートに表示されます。対話型デバッグの場合、APSOのシェルが出力を表示します。
  • インポートが失敗しました。システムPython用のパッケージをインストールしても、LibreOfficeのPythonランタイムがそれをインポートできるとは限りません。パッケージはランタイムのPythonパス上に存在する必要があります。公式のインポートガイドには、ユーザーモジュールパスと共有モジュールパスが記載されています。まずは、オプションのインポートなしでマクロをテストしてみてください。
  • セキュリティ警告が表示されます。スクリプトは、ご自身で作成または確認し、信頼できるもののみ実行してください。マクロのセキュリティは、安全でないコードを制限するために存在します。見慣れないドキュメントのマクロを実行するためだけに、グローバルセキュリティレベルを下げないでください。警告の意味を理解する必要がある場合は、 LibreOfficeのマクロセキュリティオプションを参照してください。

自動化処理を端末、スケジューラ、または別のアプリケーションから開始する必要がある場合にのみ、外部プロセス方式を選択してください。LibreOfficeでは、パイプまたはソケットを使用してオフィスプロセスを開始し、UNOブリッジを介して接続する必要があります。通常のスタンドアロンスクリプトは、プロセス内Calcマクロとは同等ではありません。

マクロが正しく動作したことをどのように確認できますか?

「実行」をクリックした後、最初のシートのセルA1を確認してください。セルA1には「Hello from Python」と表示されているはずです。また、A1を選択すると、数式バーにも同じテキストが表示されるはずです。セルが変更されない場合は、目的のブックがアクティブになっていること、およびマクロが「マイ マクロ」から選択されていることを確認してください。この最小限のテストが成功したら、テスト用の書き込みを実際の計算式に置き換え、重要なデータに使用する前に、ブックのコピーでテストしてください。

コメントを残す

選択したライターテキストをセクションパスワードで保護する

選択したライターテキストをセクションパスワードで保護する

Writer文書の残りの部分はそのまま使用できるようにしつつ、特定の箇所を日常的な編集から保護する方法、そしてファイル暗号化がより適切な選択肢となる場合について学びましょう。

LibreOffice Calcのダークモードでスプレッドシートのテキストを読みやすくする方法

LibreOffice Calcのダークモードでスプレッドシートのテキストを読みやすくする方法

Calc でテーマ、セルのフォントの色、塗りつぶし、条件付き書式設定を確認することで、見づらいスプレッドシートのテキストを修正できます。

LibreOffice Calcで数式がテキストとして表示される場合、結果を復元する方法

LibreOffice Calcで数式がテキストとして表示される場合、結果を復元する方法

Calcで計算値ではなく数式テキストが表示される理由を学び、表示モード、テキスト形式のセル、アポストロフィ、または古い結果を修正します。

ライターの手紙をロゴとスプレッドシートのフィールドと結合する

ライターの手紙をロゴとスプレッドシートのフィールドと結合する

Calcの受信者データと共有埋め込み画像を使用して、再利用可能なWriterの差し込み印刷を作成し、パーソナライズされた手紙をプレビューして保存します。

LibreOffice でオプションの診断とデータ更新を制限する

LibreOffice でオプションの診断とデータ更新を制限する

LibreOfficeのオプションの更新統計情報とクラッシュレポートのプロンプトをオフにしてから、設定内容と検証方法を確認してください。

LibreOffice Writerで正規表現を使用してテキストを一括編集する

LibreOffice Writerで正規表現を使用してテキストを一括編集する

Writerの正規表現パターンを使えば、置換前にプレビューを確認しながら、スペースの整理、構造化されたテキストの検索、名前の並べ替えを行うことができます。

Writerでアラビア語とヘブライ語の段落を右から左に設定する

Writerでアラビア語とヘブライ語の段落を右から左に設定する

Writerの双方向制御を有効にし、右から左への段落の流れを設定し、英語の単語や数字を損なうことなく、アラビア語やヘブライ語が混在するテキストをチェックします。

LibreOfficeでCalibriとArialを推測なしで復元する方法

LibreOfficeでCalibriとArialを推測なしで復元する方法

メトリックに対応したLinuxフォントをインストールするか、LibreOfficeの代替フォントをマッピングする。その際、Microsoftフォントのライセンスやレイアウトの違いにも留意する。

LibreOffice Writerでフォームから入力可能なPDFを作成する

LibreOffice Writerでフォームから入力可能なPDFを作成する

Writerで使用可能なテキストフィールド、チェックボックス、ドロップダウンリストを追加し、受信者が入力して保存できるPDFをエクスポートします。

LibreOffice PDFを作成する際に、使用したフォントを保持する

LibreOffice PDFを作成する際に、使用したフォントを保持する

LibreOffice Writerで作成したPDFファイル内の欠落または置換されたフォントを修正し、適切なエクスポートプロファイルを選択し、共有前に埋め込まれているフォントを確認してください。