作成日:2025年04月21日
FileMakerからPowerShellを利用してExcelファイルを作成する


どうも、にゃん太です
FileMakerからExcelファイルを作成する方法ですが、PowerShellを使用する方法もあります
調べてみると、思いのほか簡単にできる様です
今回のメモでは、PowerShellを利用した作成方法を調べていきます
PowerShell の実行ポリシー
PowerShellについて調べてみると、実行ポリシーという言葉が出てきました
どうやら、実行ポリシーの設定によってはスクリプトが実行できないらしく、今回のFileMakerからExcelファイルを作成する処理も当然実行できません
Microsoft社のサイトを見てみると、現在のデフォルト設定は「RemoteSigned」となっており、特に問題は無いようです
しかし、過去のデフォルト設定は「Restricted」だった様で、その場合は実行できません
古い環境などで実行する場合も考慮して、実行ポリシーを調べる、変更する方法を調べてみます
PowerShell の実行ポリシーの取得と変更
PowerShellの実行ポリシーの取得および変更はコマンドプロンプトで実行できます
取得は「Get-ExecutionPolicy」、変更は「Set-ExecutionPolicy」です
実際にコマンドプロンプトで実行してみましょう

無事、取得も変更も実行できています
これを参考に、FileMakerで実行するスクリプトを作成してみます
権限確認
# ################################################## # Power Shell の実行ポリシー確認と変更 # ################################################## # クリップボード使用の確認 変数を設定 [$message; 値: "この処理はクリップボードを使用します。¶クリップボードを上書きされたくない場合は中止してください。"] カスタムダイアログを表示 ["確認"; $message] If [Get ( 最終メッセージ選択 ) = 2] 全スクリプト終了 End If # PowerShell の実行ポリシー取得 変数を設定 [$code; 値: "cmd /c PowerShell Get-ExecutionPolicy | clip"] Eventを送信 [「aevt」;「odoc」; $code] スクリプト一時停止/続行 [間隔(秒): .1] 貼り付け [選択; powerShell::policy] フィールドへ移動 [] 変数を設定 [$auth; 値: GetValue ( powerShell::policy; 1 )] # 実行ポリシー不足なら変更する If [not Exact ( $auth; "AllSigned" ) and not Exact ( $auth; "RemoteSigned" ) and not Exact ( $auth; "Unrestricted" ) and not Exact ( $auth; "Bypass" )] # 変更前に確認 変数を設定 [$message; 値: "現在の実行ポリシー:" & $auth & ¶] 変数を設定 [$message; 値: $message & "権限が不足しています" & ¶] 変数を設定 [$message; 値: $message & "「RemoteSigned」に変更してよろしいですか。"] カスタムダイアログを表示 ["確認"; $message] If [Get ( 最終メッセージ選択 ) = 2] 全スクリプト終了 End If # 実行ポリシーの変更 変数を設定 [$code; 値: "cmd /c PowerShell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser"] Eventを送信 [「aevt」;「odoc」; $code] # 変更後の実行ポリシー確認 変数を設定 [$code; 値: "cmd /c PowerShell Get-ExecutionPolicy | clip"] Eventを送信 [「aevt」;「odoc」; $code] スクリプト一時停止/続行 [間隔(秒): .1] 貼り付け [選択; powerShell::policy] 変数を設定 [$auth; 値: GetValue ( powerShell::policy; 1 )] If [not Exact ( $auth; "RemoteSigned" )] 変数を設定 [$message; 値: "実行ポリシーの変更に失敗しました。¶"] 変数を設定 [$message; 値: $message & "処理を中止します。"] カスタムダイアログを表示 ["ERROR"; $message] 全スクリプト終了 End If End If
実行ポリシーを確認し、必要な権限がなければ変更する仕組みです
コマンドプロンプトの結果を取得するためにクリップボードを使用するので安易には使えませんが、こうした処理を組み込んでおけば、安心してPowerShellが使えそうです
PowerShell でExcelファイルを操作する
では、PowerShellでExcelファイルを操作する方法を見てみましょう
- Excelアプリケーションを起動する
-
PowerShell
$xl = New-Object -ComObject Excel.Application; - ブックを新規作成する
-
PowerShell
$book = $xl.Workbooks.Add(); - 既存ブックを開く
-
PowerShell
$book = $xl.Workbooks.Open($path); - シートを新規作成する
-
PowerShell
$sheet = $book.WorksSheets.Add(); - シートを取得する(番号)
-
PowerShell
$sheet = $book.Sheets(1); - シートを取得する(名前)
-
PowerShell
$sheet = $book.Sheets("Sheet1"); - セルに書き込む(Range)
-
PowerShell
$sheet.Range("A1").Value = "PowerShell"; - セルに書き込む(Cells)
-
PowerShell
$sheet.Cells.Item(1, 1).Value = "PowerShell"; - セルの値を取得する(Range)
-
PowerShell
$val = $sheet.Range("A1").Text; - セルの値を取得する(Cells)
-
PowerShell
$val = $sheet.Cells(1, 1).Text; - 画像を配置する(参考)
-
PowerShell
$sheet.Shapes.AddPicture($path, $linkToFile, $saveWithDocument, $left, $top, $width, $height); - VBAを実行する
-
PowerShell
$xl.Run($target); - ブックを保存する
-
PowerShell
$book.Save(); - ブックを名前を付けて保存する
-
PowerShell
$book.SaveAs($path); - ブックを閉じる
-
PowerShell
$book.Close(); - Excelアプリケーションを終了する
-
PowerShell
$xl.Quit();
他にもいろいろな処理が可能ですが、ここではこれぐらいにしておきます
これらの機能を使用して、VBSでExcelファイルの作成と同様の処理をPowerShell で実行していきます
PowerShell でExcelファイルを作成する
Excel作成
# ################################################## # PowerShell でExcelテンプレートへ流し込み # ################################################## 変数を設定 [$path1; 値: Get ( テンポラリパス )] 変数を設定 [$path2; 値: Substitute ( Middle ( $path1; 2; Length ( $path1 ) - 1 ); "/"; "\\" )] # エクセルテンプレートの保存場所(保存用) 変数を設定 [$tempPath1; 値: $path1 & "temp.xltx"] フィールド内容のエクスポート [data::テンプレート;「$TEMPpath1」; フォルダを作成:オン] # エクセルテンプレートの保存場所(実行用) 変数を設定 [$tempPath2; 値: $path2 & "temp.xltx"] # プロフィール写真の保存場所(保存用) 変数を設定 [$imagePath1; 値: $path1 & "img.jpg"] フィールド内容のエクスポート [data::写真;「$imagePath1」; フォルダを作成:オン] # プロフィール写真の保存場所(実行用) 変数を設定 [$imagePath2; 値: $path2 & "img.jpg"] # PowerShellスクリプト 変数を設定 [$ps; 値: ""] 変数を設定 [$ps; 値: $ps & "$xl = New-Object -ComObject Excel.Application;¶"] 変数を設定 [$ps; 値: $ps & "$xl.DisplayAlerts = $False;¶"] 変数を設定 [$ps; 値: $ps & "$xl.Visible = $True;¶"] 変数を設定 [$ps; 値: $ps & "$book = $xl.Workbooks.Open(" & Quote ( $tempPath2 ) & ");¶"] 変数を設定 [$ps; 値: $ps & "$sheet = $book.Sheets(1);¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(4, 5).Value = " & Quote ( data::名前 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(6, 5).Value = " & Quote ( data::ふりがな ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(8, 5).Value = " & Quote ( data::生年月日 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(10, 5).Value = " & Quote ( data::血液型 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(12, 5).Value = " & Quote ( data::趣味 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells(14, 5).Value = " & Quote ( data::特技 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells(20, 3).Value = " & Quote ( data::自己PR ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells(29, 3).Value = " & Quote ( data::フリースペース ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Shapes.AddPicture(\"" & $imagePath2 & "\", 1, 1, 397, 114, 146, 146);¶"] 変数を設定 [$ps; 値: $ps & "[GC]::Collect();"] # PowerShellの保存場所(保存用) 変数を設定 [$ps1; 値: $path1 & "createXL.ps1"] # PowerShellの保存場所(実行用) 変数を設定 [$ps2; 値: $path2 & "createXL.ps1"] # PowerShellのエクスポート フィールド設定 [powerShell::code; $ps] フィールド内容のエクスポート [powerShell::code;「$ps1」; フォルダを作成:オン] 変数を設定 [$code; 値: $code & "$Content|Out-File -Encoding UTF8 -FilePath " & Quote ( $ps2 )] Eventを送信 [「aevt」;「odoc」; $code]
これを実行すると、エクセルファイルが作成されました

概ね期待通りに配置されましたが、自己PR欄の改行が正しく出力されていません
どうやら改行コードの問題の様です
FileMakerの改行コードは「Char ( 13 )」なので、これを「Char ( 10 )」に置き換えます
Excel作成
# ################################################## # PowerShell でExcelテンプレートへ流し込み # ################################################## 変数を設定 [$path1; 値: Get ( テンポラリパス )] 変数を設定 [$path2; 値: Substitute ( Middle ( $path1; 2; Length ( $path1 ) - 1 ); "/"; "\\" )] # エクセルテンプレートの保存場所(保存用) 変数を設定 [$tempPath1; 値: $path1 & "temp.xltx"] フィールド内容のエクスポート [data::テンプレート;「$TEMPpath1」; フォルダを作成:オン] # エクセルテンプレートの保存場所(実行用) 変数を設定 [$tempPath2; 値: $path2 & "temp.xltx"] # プロフィール写真の保存場所(保存用) 変数を設定 [$imagePath1; 値: $path1 & "img.jpg"] フィールド内容のエクスポート [data::写真;「$imagePath1」; フォルダを作成:オン] # プロフィール写真の保存場所(実行用) 変数を設定 [$imagePath2; 値: $path2 & "img.jpg"] # PowerShellスクリプト 変数を設定 [$ps; 値: ""] 変数を設定 [$ps; 値: $ps & "$xl = New-Object -ComObject Excel.Application;¶"] 変数を設定 [$ps; 値: $ps & "$xl.DisplayAlerts = $False;¶"] 変数を設定 [$ps; 値: $ps & "$xl.Visible = $True;¶"] 変数を設定 [$ps; 値: $ps & "$book = $xl.Workbooks.Open(" & Quote ( $tempPath2 ) & ");¶"] 変数を設定 [$ps; 値: $ps & "$sheet = $book.Sheets(1);¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(4, 5).Value = " & Quote ( data::名前 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(6, 5).Value = " & Quote ( data::ふりがな ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(8, 5).Value = " & Quote ( data::生年月日 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(10, 5).Value = " & Quote ( data::血液型 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells.Item(12, 5).Value = " & Quote ( data::趣味 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells(14, 5).Value = " & Quote ( data::特技 ) & ";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells(20, 3).Value = \"" & Substitute ( data::自己PR; "¶"; Char ( 10 ) ) & "\";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Cells(29, 3).Value = \"" & Substitute ( data::フリースペース; "¶"; Char ( 10 ) ) & "\";¶"] 変数を設定 [$ps; 値: $ps & "$sheet.Shapes.AddPicture(\"" & $imagePath2 & "\", 1, 1, 397, 114, 146, 146);¶"] 変数を設定 [$ps; 値: $ps & "[GC]::Collect();"] # PowerShellの保存場所(保存用) 変数を設定 [$ps1; 値: $path1 & "createXL.ps1"] # PowerShellの保存場所(実行用) 変数を設定 [$ps2; 値: $path2 & "createXL.ps1"] # PowerShellのエクスポート フィールド設定 [powerShell::code; $ps] フィールド内容のエクスポート [powerShell::code;「$ps1」; フォルダを作成:オン] 変数を設定 [$code; 値: $code & "$Content|Out-File -Encoding UTF8 -FilePath " & Quote ( $ps2 )] Eventを送信 [「aevt」;「odoc」; $code]

今度は、改行コードも正しく出力されました
サンプルファイル
以上でPowerShellを利用したExcelファイルの作成処理は終了です
VBSの代替ツールとして使用できそうです
今回作成したファイルを公開していますので、ご興味がありましたらこちらからダウンロードしてご確認ください

以上で今日のメモ書きは終了です
内容はいかがでしたか?
もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください