作業効率倍増ランチャーを作る(3/3)
2023-11-08 記載
概要 : javascript, PHP, URIスキーム,VBA を連携させたランチャーhtmlの作成
前後の記事:(1/3), (2/3)
Keyword : XMLHttpRequest, ms-excel, microsoft-edge:, vscode:,
FileZillaを接続までして起動するhrefの記述は以下。
<a href=”javascript:helper(‘\”C:/Program Files/FileZilla FTP Client/filezilla.exe\” -c=0/web_cloudfree_jp’);”>
exeのパスにスペースが入っていて、かつ起動オプションもあるパターン。
これがいまのところ一番複雑なパターンで、これをURLエンコードかけずとも動いてくれたのでこれでいくことにしています。大元を ‘ (シングルクォート)でくくるか ” (ダブルクォート)でくくるか、意味あるのか無いのかわからない試行錯誤をいっぱいしました。
javascript:helper は以下です。
function helper(cmd) {
const Http = new XMLHttpRequest();
Http.open("GET", "https://localhost/helper.php?cmd=" + cmd, false);
Http.send();
if (Http.status == 200) location.href = 'ms-excel:ofe|u|https://localhost/helper.xlsm';
}
Http.open の3つ目の引数は、同期or非同期で、省略するとtrueの非同期になります。
cmd.txtを確実に書いてもらったあとでないとhelper.xlsmを呼べないからここは同期です。
「ユーザー体験に対して好ましくない影響があるため、メインスレッドでの同期 XMLHttpRequest は推奨されません。詳しくは https://xhr.spec.whatwg.org/#sync-warning を参照してください。」と言われますが、必要な箇所では必要なのです。
https://localhost/helper.php をhttp://とすると
「19:24:11.826 クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、http://localhost/helper.php?cmd=hello_cmd_by_javascript にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Origin’ が足りない)。ステータスコード: 200」
と叱られます。
無駄な暗号計算しなくていいよ、とhttpにしてCPUを気遣ったつもりでしたが、そういう気持ちの通じるところではないようです。
helper.phpは以下です。
<?php
const PATH_APACHE = 'c:/pgm/apache24/';
//初期設定
mb_language('Japanese');
mb_internal_encoding('UTF-8');
date_default_timezone_set("Asia/Tokyo");
setlocale(LC_ALL, 'ja_JP.UTF-8');
$fp = fopen(PATH_APACHE.'htdocs/cmd.txt', 'w');
fwrite($fp, $_REQUEST['cmd'] ?? '');
fwrite($fp, "\n");
fclose($fp);
http_response_code(200);
helper.xlms のcmd.txt読み取り箇所は以下です。
今のところパラメータはcmdの1行だけですが将来を考えて日本語対応・復数対応させてます。
(Selenium Webdriverを通じて一層多機能な一括処理なども構想中 ^-^ )
javascriptの
location.href = ‘ms-excel:ofe|u|https://localhost/helper.xlsm’;
を受けて走るExcelマクロ
'htdocs\cmd.txt からパラメータ情報を取得
Private Sub LoadCmd(c As Collection)
Dim adoFile As New ADODB.Stream '参照:Microsoft ActiveX Data Objects 6.1 Library
Dim sText As String
Dim i As Long
adoFile.Charset = "utf-8"
adoFile.Open
adoFile.LoadFromFile PATH_APACHE & "htdocs\cmd.txt"
Do Until adoFile.EOS
i = i + 1
c.Add adoFile.ReadText(-2), "cmd-" & CStr(i)
Loop
End Sub
Dim oWSH As New IWshRuntimeLibrary.WshShell '参照:Windows Script Host Object Model
Dim win_style As VbAppWinStyle
Dim mode As Boolean
'デフォルト値
win_style = vbNormalFocus
mode = False '同期(True)/非同期(False)
oWSH.Run(cSys("cmd-1"), win_style, mode)
'vbNormalFocus, False 非同期が既定値
フォルダパスを渡せばエクスプローラで開いてくれます。
‘C:/pgm/Apache24/htdocs/’
URIスキームは他にもあり
href=”microsoft-edge:https://web.cloudfree.jp/journal/”
とすればこれはhelperシステムを介さずにEdgeで開いてくれます。
vscode:X:\xxx\superlauncher.php
とするとVSCodeで開いてくれました。
いろいろ試していて、バックスラッシュとスラッシュ、
どこでどっちを使えばよいのか訳わかんなくなってきました。

ランチャーで図れる時短以上の時間をまたランチャー制作に費やしていては本末転倒です。
メンテと項目の増減をスマートに行うためにランチャーhtmlを機会的に生成するツールが要りそうです。
ともかくこんな感じでランチャーはやっていけそうです。