LibreOffice CalcマクロでPythonスクリプトを実行する方法

はい。LibreOffice Calc は、LibreOffice プロセス内で Python コードをマクロとして実行できます。また、LibreOffice Basic マクロからも、LibreOffice のスクリプトフレームワークを介して Python 関数を呼び出すことができます。開いているスプレッドシートのセルを読み取ったり変更したりすることが目的であれば、プロセス内 Python マクロが最も簡単な出発点となります。既存の Basic マクロで、あるタスクを再利用可能な Python 関数に渡したい場合は、Basic から Python への呼び出しを使用してください。

これらの方法は、シェルコマンドで通常のシステムPythonスクリプトを起動する方法とは異なります。通常の外部Pythonプロセスは、Calcのドキュメントオブジェクトを自動的に取得しません。ワークブックにアクセスするには、LibreOffice経由でPythonマクロを実行するか、UNOを介して外部プロセスをLibreOfficeインスタンスに意図的に接続してください。

「Calcマクロ内でPythonを実行する」とはどういう意味ですか?

LibreOfficeは、スクリプトフレームワークを通じて複数のスクリプト言語をサポートしています。Pythonマクロでは、LibreOfficeはUNOコンテキストオブジェクトを提供し、スクリプトが現在のドキュメントとそのシートにアクセスできるようにします。Pythonマクロはモジュール内の関数であり.py、モジュールのg_exportedScriptsタプルはLibreOfficeが実行可能なマクロとして表示すべき関数を識別します。

Pythonマクロは、Calcのマクロメニューから単独で実行できます。Basicから呼び出す必要はありません。既にBasicマクロがあり、そこからPythonを呼び出したい場合は、LibreOfficeのスクリプトプロバイダ、またはより新しいScriptForgeSession.ExecutePythonScriptサービスを使用して、2つの言語を連携させることができます。

どちらのアプローチを選択すべきでしょうか?

  • タスクの大部分がPythonで行われ、現在のCalcドキュメントが必要な場合は、Pythonマクロを直接使用してください。言語の切り替えが不要になり、単一のスクリプトとしてデバッグが容易になります。
  • Basicコード、ボタン、またはドキュメントイベントが既に存在し、それらをそのまま残しておきたい場合に、Pythonヘルパーを使って特定の計算やデータ操作を実行させたいときに、BasicからPythonを呼び出します。
  • LibreOfficeに付属していない開発環境やPythonパッケージが必要な場合は、外部のPythonプロセスを使用してください。UNOへの接続を明示的に設定し、ターミナルから起動したスクリプトが開いているスプレッドシートにアクセスできるとは限らないことを念頭に置いてください。

例えば、小さなスプレッドシートのクリーンアップツールは、Pythonマクロとして完全に記述できます。既存のBasicボタンが既にレポートを実行するようになっている場合は、そのボタンのマクロをそのまま使用し、レポートの合計を計算するPython関数を呼び出すようにします。

Calcのセルを編集するPythonマクロを作成するにはどうすればよいですか?

LibreOffice は、個人の Python スクリプトをユーザー プロファイルに、アプリケーション全体のスクリプトをインストール ディレクトリに、ドキュメント スクリプトをドキュメントに保存します。最初のテストでは、個人用スクリプトが便利です。なぜなら、同じユーザーが開いているどの LibreOffice ドキュメントからでも利用できるからです。ただし、ODS ファイルには含まれないため、他のユーザーがスプレッドシートと一緒に自動的にスクリプトを受け取ることはありません。

LibreOffice ヘルプの「Python スクリプトの構成と場所」で、お使いのシステムの個人用 Python スクリプトフォルダを探してください。一般的な場所は、%APPDATA%\LibreOffice\4\user\Scripts\pythonWindows と~/.config/libreoffice/4/user/Scripts/pythonLinux にあります。実際のプロファイルは異なる場合があるため、推測で別のプロファイルディレクトリを作成するのではなく、インストール時にドキュメントに記載されている場所を使用してください。

個人のPythonスクリプトフォルダにという名前のファイルを作成しcalc_tools.py、次の簡単な例を追加してください。

def double_a1(args=None):
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.getCurrentController().getActiveSheet()

    source = sheet.getCellRangeByName("A1")
    target = sheet.getCellRangeByName("B1")
    target.setValue(source.getValue() * 2)

g_exportedScripts = (double_a1,)

これは、アクティブシートのセル A1 の数値を読み取り、その値の 2 倍を B1 に書き込みます。XSCRIPTCONTEXTは、実行時に LibreOffice Python マクロに渡されます。同じファイルが LibreOffice の外で起動された場合、通常の Python グローバル変数ではありません。パブリック関数は にリストされているg_exportedScriptsため、マクロセレクタに表示されます。

ファイルを保存してから、Calc を開くか、Calc に戻って、[ツール] > [マクロ] > [マクロの実行]を選択します。LibreOffice のバージョンやプラットフォームの翻訳によっては、メニューのラベルが単数形になる場合があります。[マイ マクロ] > [calc_tools] > [double_a1]を選択して実行します。まず A1 に数値を入力し、B1 に 2 倍の値が含まれていることを確認します。モジュールが表示されない場合は、ファイル拡張子が . であること.py、ファイルが正しいプロファイルの Python フォルダーにあること、および Python スクリプトのサポートがインストールされていることを確認してください。新しいモジュールを追加した後に LibreOffice を再起動すると、スクリプト リストが更新される場合があります。

BasicマクロからPython関数を呼び出すにはどうすればよいですか?

BasicからPythonへの呼び出しを行うには、Pythonモジュールを個人用スクリプトフォルダに配置し、ScriptForgeのSessionサービスを介してその関数を呼び出します。この例では、Pythonで2つの値を加算し、その結果を現在のCalcシートのB1セルに書き込みます。

においてcalc_tools.py、関数を定義します。

def add_values(first, second):
    return float(first) + float(second)

g_exportedScripts = (add_values,)

次に、CalcでBasicマクロを作成し、以下を使用します。

Sub RunPythonHelper()
    Dim session As Object
    Dim result As Variant
    Dim sheet As Object

    session = CreateScriptService("Session")
    result = session.ExecutePythonScript( _
        session.SCRIPTISPERSONAL, _
        "calc_tools.py$add_values", _
        12, 30)

    sheet = ThisComponent.CurrentController.getActiveSheet()
    sheet.getCellRangeByName("B1").setValue(result)
End Sub

Basicマクロセレクタから実行してくださいRunPythonHelper。呼び出しが成功すると、B1に42が表示されます。スクリプト参照は、 の形式に従いますmodule.py$function_name。サブフォルダーまたは別のストレージ場所にあるモジュールの場合は、そのScriptForgeバージョン用に文書化されている構文と場所定数を使用してください。引数と戻り値は、数値、文字列、単純なシーケンスなど、両方の言語で適切に表現できるデータ型にしてください。

CreateScriptService最新のLibreOfficeバージョンでは、ドキュメントに記載されているScriptForgeセッションヘルパーが利用できますが、古いバージョンや配布パッケージ版ではメニュー名やバンドルされているコンポーネントが異なる場合があります。このサービスが利用できない場合は、LibreOfficeのドキュメントに記載されているUNOスクリプトプロバイダメソッドを使用してくださいXScript。このメソッドは、スクリプトURIからを取得し、それを呼び出します。マクロの場所設定を変更せずに、コード断片を別の場所にコピーすることは避けてください。

Pythonコードは、個人用、共有用、または組み込み用として扱うべきでしょうか?

ストレージ最適なフィット感トレード・オフ
マクロ / ユーザープロフィールドキュメント間で再利用可能な独自のツールスプレッドシートを送信しても自動的に含まれません
アプリケーションマクロ1つのインストール環境で複数のユーザー向けに管理されるスクリプト通常、インストールまたはメンテナンスには管理者権限が必要です。
ドキュメントマクロ1つのドキュメントに関連付けられることを意図したコード受信者はマクロを許可する必要がある場合があります。対象のLibreOfficeバージョンで移植性とセキュリティ動作をテストしてください。

チームワークフローの場合は、個人用マクロを含むワークブックを作成する前に、受信者がコードを入手して信頼する方法を決定してください。Pythonロジックをスプレッドシートに添付する必要がある場合は、受信者が使用するLibreOfficeと同じバージョンで、ドキュメントのマクロ保存とセキュリティプロンプトをテストしてください。管理された展開の場合、管理者はユーザー向けにスクリプトをパッケージ化したり、組織の通常のソフトウェア制御の下で拡張機能を配布したりできます。

マクロが見つからない、または失敗する原因は何でしょうか?

  • Pythonオプションまたはモジュールが存在しません。一部のGNU/Linuxディストリビューションでは、LibreOfficeのPythonスクリプトフレームワークはオプションパッケージとなっています。マクロダイアログにPythonマクロが表示されない場合は、ディストリビューションのLibreOfficeパッケージング手順を確認してください。
  • スクリプトが間違ったプロファイルに保存されています。LibreOfficeは複数のユーザープロファイルを使用できます。実行中のインストール環境のプロファイルパスを確認し、モジュールをそのScripts/pythonディレクトリに保存してください。
  • この関数はエクスポートされていません。マクロセレクタから実行する関数には、この関数を追加してくださいg_exportedScripts。タプル構文には、1項目のタプルの場合は末尾のカンマが含まれていることを確認してください。
  • このスクリプトはLibreOfficeの外部で実行されます。LibreOffice XSCRIPTCONTEXTによって起動されたマクロに対しては存在しますが、同じファイルがシステムのpythonコマンドで起動された場合は存在しません。マクロランナーを使用するか、ドキュメントに記載されているUNO接続を設定してください。
  • マクロのセキュリティ設定により、埋め込みコードはブロックされます。LibreOfficeのマクロのセキュリティ設定を確認し、信頼できるソースからのコードのみを有効にしてください。グローバルセキュリティレベルを下げることは、問題解決のための安易な方法ではありません。
  • インポートされたモジュールはドキュメントのコンテキストを参照できません。LibreOfficeドキュメントは、XSCRIPTCONTEXTインポートされたモジュールには渡されません。インポートされたモジュールがグローバルな情報を読み取ることを期待するのではなく、必要なドキュメントまたはシートオブジェクトをヘルパー関数に渡してください。
  • コンソール出力は表示されません。マクロを「ツール」>「マクロ」メニューから実行した場合、Pythonの標準出力は利用できません。フィードバックが必要な場合は、結果をセルに書き込むか、LibreOfficeのダイアログサービスを使用するか、または指定したファイルパスにログを記録してください。

結果を安全に検証するにはどうすればよいですか?

スプレッドシートのコピーと既知の入力値を使用してテストしてください。Pythonマクロがランナーに表示されることを確認し、一度実行して、出力セルを手計算の結果と比較してください。BasicからPythonへの呼び出しの場合は、簡単な入力値を1つテストし、返された値が意図したシートに書き込まれることを確認してください。シートを削除したり、広範囲を上書きしたり、オペレーティングシステムコマンドを実行したりするスクリプトから始めることは避けてください。

テストが正常に動作したら、他のコンピュータにスクリプトをインストールする方法を決定し、必要なPythonライブラリやLibreOfficeのバージョンに関する前提条件を文書化してください。LibreOfficeにバンドルされているPython環境は、プロセス内マクロに使用されます。別のシステムPythonインタープリタ用にインストールされたパッケージは、LibreOfficeでは利用できない場合があります。別のインタープリタのパッケージが必要な場合は、外部プロセス/UNO方式を使用し、その接続を意図的に構成してください。

公式資料

コメントを残す

ONLYOFFICEデスクトップエディターでプラグイン開発を有効にする方法

ONLYOFFICEデスクトップエディターでプラグイン開発を有効にする方法

ONLYOFFICEデスクトップエディターでプラグイン開発を設定するには、ローカルの.pluginアーカイブをインストールし、ソースフォルダーをリンクし、開発者ツールを有効にして、変更をテストします。

LibreOffice CalcマクロでPythonスクリプトを実行する方法

LibreOffice CalcマクロでPythonスクリプトを実行する方法

CalcでPythonマクロを直接使用するタイミングや、LibreOffice BasicからPython関数を呼び出す方法を、UNOとScriptForgeの実践的な例を通して学びましょう。

Collabora Online CODE で「Unauthorized WOPI Host」エラーを修正する

Collabora Online CODE で「Unauthorized WOPI Host」エラーを修正する

Collabora Online CODEの「Unauthorized WOPI Host」エラーを修正するには、WOPIホスト名を一致させ、Dockerホストグループを設定し、Nextcloudの個別のIP許可リストを確認し、接続性を検証してください。

ONLYOFFICE Nextcloud連携における「トークンが無効です」エラーを修正する

ONLYOFFICE Nextcloud連携における「トークンが無効です」エラーを修正する

JWTシークレット、認証ヘッダー、Docker設定、プロキシの動作、コネクタの状態を確認することで、NextcloudにおけるONLYOFFICEの「トークンが無効です」エラーを修正します。

NextcloudでONLYOFFICEの「ドキュメントを保存できませんでした」エラーを修正する

NextcloudでONLYOFFICEの「ドキュメントを保存できませんでした」エラーを修正する

コールバック、内部URL、JWT、TLS、プロキシルーティング、ログ、ストレージを確認することで、NextcloudにおけるONLYOFFICEの「ドキュメントを保存できませんでした」エラーを修正します。

Collabora Onlineの「ソケット接続が予期せず閉じられました」エラーを修正する:WebSocketとプロキシのチェック

Collabora Onlineの「ソケット接続が予期せず閉じられました」エラーを修正する:WebSocketとプロキシのチェック

Collabora Onlineのソケット接続エラーを修正するには、26.04 WebSocketの変更点、プロキシルート、アップグレードヘッダー、タイムアウト、TLS、およびログを確認してください。

Collabora Onlineで複数の言語のスペルチェックを有効にする方法

Collabora Onlineで複数の言語のスペルチェックを有効にする方法

Collabora Onlineで多言語スペルチェックを有効にするには、サーバー辞書を追加し、言語コードを許可し、テキストに言語を割り当て、複数の言語を含む文書をテストします。

LibreOffice Writerで画像を含む自動メールマージを作成する方法

LibreOffice Writerで画像を含む自動メールマージを作成する方法

Calcデータ、名前付き画像プレースホルダー、およびBasicマクロを使用して、レコードごとに画像を挿入する信頼性の高いLibreOffice Writerメールマージを作成する方法を、トラブルシューティングと検証の手順とともに解説します。

Collabora Onlineの「これは恥ずかしい」接続エラーを修正する

Collabora Onlineの「これは恥ずかしい」接続エラーを修正する

WOPI、リバースプロキシ、TLS、DNS、WebSocket、およびサーバー間の接続可能性をチェックすることにより、Collabora Onlineのドキュメント接続障害を診断および修正します。

ONLYOFFICEデスクトップエディターでPDFを編集可能なDOCXに変換する方法

ONLYOFFICEデスクトップエディターでPDFを編集可能なDOCXに変換する方法

ONLYOFFICEデスクトップエディター(オフライン版)でPDFファイルを編集可能なDOCXファイルに変換します。「名前を付けて保存」の手順に従い、PDFファイルがスキャンされているか確認し、書式設定をチェックしてください。