サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

作業効率倍増ランチャーを作る(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を機会的に生成するツールが要りそうです。
ともかくこんな感じでランチャーはやっていけそうです。

投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog