VBSと連携するElectronアプリを作る

electronは大変便利なプラットフォームですが、Windows環境で使う場合に於いて、特に企業ユースの場合「あれは駄目、これは駄目」そういったケースが多いと思います。その1つがメール送信。(SMTP駄目やらWeb APIの使用駄目などなど)。

そうすると、メール1つ送るにしても、electronからはこのままでは送る事ができません。しかし、ほとんどの企業で穴になっている「VBA」や「VBS」については使える事が多いので、これを利用してVBScriptにそれら代理をしてもらう手段を考えました。VBScriptに引数を渡し、指定の条件でOutlookからのメール送信をやってもらうのが今回の目的。

VBScriptが使えると、Windows環境ではoffice製品のコントロールをelectronからも行えるようになるので、活用の幅が広がるのではないかと。

今回使用するプロジェクトファイル

※今回はjQuery以外に特に外部モジュールをnpm installしていません。

※中に入ってるmailer.vbsは、今回はデスクトップに配置してください。

図:こんな感じのウィンドウから作業開始になります。

ソースコード

VBSのみを実行するケース

electron側

レンダラプロセス側

  • IPC通信にて、メインプロセスにテキストボックスのメアドを送り込んでいます。
メインプロセス側

  • 同期的にコマンドラインを実行する必要があるので(返り値を取得するため)、child_processでは、spawnSyncを利用しています。
  • デスクトップに配置したmailer.vbsが今回メールを送信するVBSスクリプトファイルです。
  • vbsCommandにはvbsファイルへのパスと、ダイアログから受け取ったメアドを引数で渡しています。
  • spawnSyncにてコマンドライン実行。cscript.exeがvbscriptの実行本体。コマンドライン引数にfullpathとaddressをつなげています。
  • vbsファイルからの返り値は、child.statusとして取得しています。

VBS側(mailer.vbs)

  • 無事に送信されると、electron側に0のstatusが返る
  • Outlookが起動していなくとも、APIで実行されているのでメールはデフォルトアカウントで送信されます。
  • 冒頭のargsにて、引数として指定されてるメアドを取得しています。
  • 今回は、Microsoft365のOutlook Version 16.0でテストしています。
  • メールが送れるので、APIなしでOutlookを使って、Microsoft Teamsのチームチャンネルに投稿が可能です。
  • Teams投稿時にはVBSファイルは文字コードがANSIでないとSubjectが文字化けします。メモ帳で保存時に文字コードをUTF-8からANSIに変更して保存しましょう。

VBAを実行させるケース

VBSを介してVBAを実行させる事が可能です。また、その場合に引数を渡し、返り値を受け取る事が可能ですが、VBAからの結果出力はShift-JISでありそのままだと文字化けしてしまいます。そこでこれをiconv-liteを使って変換する事で、Electron側で受け取る事が可能です。事前にnpmで追加しておきましょう。

electron側

  • nologoオプションを指定しています。stdoutから結果にロゴが入ってしまうのを除外する為です。
  • 実行するVBAの入ったファイルは、argsにて指定していますが、このargsにはxlsmファイルへのフルパスと引数をカンマ区切りにした値が格納されています。
  • 返り値はテキストで帰ってくるのでchild.stdoutにて出力を受け取ります。
  • Buffer.fromでchild.stdoutを引き受けます
  • 受け取った出力はShift-JIS形式なので、iconv.decodeにてNode.jsで扱えるUTF-8に変換してretに格納しています。

VBS側

  • 単純にVBA側に文字列を渡して返り値を受け取って表示するだけ。
  • VBA側のModule1の中にあるtestmanという関数を実行しています。引数としてstrMsgを渡しています。相手方はVariant型で受け取る必要があります。

VBA側

  • 単純に引数に文字を足して返すだけの関数です
  • 引数も返り値もVariant型で指定します。

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)