クリック画像の実寸表示

段ボール箱を机にした猫 ファイルメーカー(filemaker)のちらしの裏のメモ書き

TOP  >  FileMakerからPowerShellを利用してExcelファイルを作成する
作成日: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の代替ツールとして使用できそうです
今回作成したファイルを公開していますので、ご興味がありましたらこちらからダウンロードしてご確認ください

メモ書き終了の案内イラスト

以上で今日のメモ書きは終了です

内容はいかがでしたか?

もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください

ご連絡フォーム