2016年6月15日水曜日

ドラッグ&ドロップされたファイルからハイパーリンクを作成する

フォルダやファイルのPathをメールに添付する時に、単純な文字列ではなくハイパーリンク化すると、相手は「文字列をコピー → Win + R → 貼りつけ → Enter」などの手間なく、クリックするだけで開けるようになりますが、ハイパーリンクを作成する方法はメールソフトによっては少し面倒なやり方だったりします。その煩わしさを回避するためのサンプルを作成しました。Wordなどでもハイパーリンクの作成がラクになります。

※2016/06/17 21:00追記:ウィンドウサイズを内容に合わせて(6/17 1:00更新時よりも更に)適切なサイズになるように修正しました。あと、多重起動した場合は後始末のところでエラーが出てしまっていましたが、そちらも修正しました。



作成するハイパーリンクは以下のようなものです。
いかにもな見た目のヤツです。



サンプルソースは以下
※2016/06/17 01:00追記:表示アイテム数に応じてウィンドウサイズが変わるように変更しました。(わたし4Kモニター使いなのでサイズ未指定だと1アイテムでもムダにほぼ全画面のウィンドウが表示されて使いづらいので。。)
<job>
<script>
arg = WScript.Arguments, L=arg.length
// 引数がなければ終了する
if(!L){
WScript.Echo('WSFファイルに、ファイルかフォルダをドラッグ&ドロップしてください')
WScript.Quit()
}
fs = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('WScript.Shell')
WshNetwork = WScript.CreateObject("WScript.Network")
// ネットワークドライブのドライブ文字vsネットワークパスの組み合わせを取得する
drives = WshNetwork.EnumNetworkDrives()
objDrive={}
for(var i=0,L=drives.length;i<L;i+=2){
objDrive[drives.Item(i)] = drives.Item(i+1)
}
getPathUNC = function(p){
if(unc = objDrive[fs.GetDriveName(p)]){
return unc + p.replace(/^[A-Z]:/,'')
}else{
return 共有(p)
}
}
// 共有設定しているフォルダ内のファイルにも対応する
arr共有=[]
objEnum = new Enumerator(WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer().ExecQuery("Select * From Win32_Share"))
for(i=0; !objEnum.atEnd() ;objEnum.moveNext()){
item = objEnum.item()
if(!item.path){continue} // IPC$はpath無いので何にでもマッチしてしまう
arr共有[i++] = {path:item.path, name:item.name}
}
arr共有len = arr共有.length
reg = /[\\\/]$/
共有=function(path){
for(var i=0;i<arr共有len;i++){
// index=0以外は無視
if(path.indexOf(arr共有[i].path)){continue}
var head='\\\\'+WshNetwork.computerName+'\\'+arr共有[i].name
return head+(head.match(reg)?'':'\\')+path.slice(arr共有[i].path.length, path.length)
}
return path
}
str = ''
for(i=0,L=arg.length;i<L;i++){
path = getPathUNC(arg(i))
str += '<a href="'+path+'">'+path+'</a><br><br>'
}
ヘッダー = [
'<html><title>リスト作成</title><'+'script>',
'onload=function(){resizeTo(tbl.offsetWidth+60, tbl.offsetHeight+60)}',
'<'+'/script><body><table id=tbl><td>'
].join('\r\n')
フッター = '</td></table></body></html>'
path = fs.GetSpecialFolder(2)+'/リンク作成.hta'
with(fs.CreateTextFile(path)){
Write(ヘッダー+str+フッター)
Close()
}
shell.run(path, 1, true)
// 多重起動した場合は先に閉じられたヤツで削除されるので、ファイルの有無を判定する。
if(fs.FileExists(path)){fs.DeleteFile(path)}
</script>
</job>


複数のアイテムも処理できます。




表示されたリンクをグイグイッとメールソフトの本文エリアにドラッグ&ドロップするなどしてご利用ください。具体的なイメージは以下の通り。

ファイルやフォルダを「リンク作成.wsf」にドラッグ&ドロップすると、「リスト作成.hta」が起動します。「リスト作成.hta」の画面内のリンクをMicrosoftWordなどの編集画面上にドラッグ&ドロップすると、ハイパーリンクの挿入ができます。



ちなみにWordの場合、ファイルへのハイパーリンクを普通の方法でやる場合は以下の画面を使用しますが


表示するフォルダがネットワークドライブ上のフォルダだったり、フォルダ内に大量のサブフォルダ・ファイルなどがあると画面が表示されるのに数秒待たされたりします。この作業を何度もやる場合はその待ち時間は合計すれば結構な時間になります。今回のサンプルを使用すれば、そのような時間を省けます。


Wordでハイパーリンクを作成して「リンク先は"\\PC名\\C$\app…"にしたまま、表示文字列は"リンク"にしたい」という場合があります。
そんな時は、まず「ハイパーリンクの表示文字列が例えば10文字なら、2文字目から9文字目までを選択」します。イメージは以下。

先頭の「\」と、終端の「t」は選択していません。一見すると意味不明なやり方ですが、理由は後述します。


上記のように選択している状態で、選択範囲の文字を「リンク」に書き換えます。以下のようになります。



次に「終端の1文字前にカーソルがある状態(※)で"DEL"キーを押します」
※今回の例では、「ク」と「t」の間にカーソルがある状態です。

上記について、人によっては「いや、私はDELキーは使い慣れていないのでBackSpaceキーで消したいんだ!」という方もいるかもしれません。その場合は以下のように「t」を選択状態にしてからBackSpaceキーを押してください。


ただし、「t」の後ろにカーソルがある状態で「BackSpace」キーを押すと、以下のようになってしまいます。




上記の通り「ハイパーリンクの表示文字列の後ろからBackSpace」をすると、ハイパーリンクが解除されてしまいます。
同様に、先頭側も「ハイパーリンクの表示文字列の前からDEL」すると、ハイパーリンクを削除してしまいます。そのため、以下のように「2文字目の前にカーソルを合わせてから"BackSpace"」してください。



以上の操作により、以下の通りリンク先は変えずに表示文字列だけ変更できました。



ちなみに、上記のように「表示文字列の内側だけ書き換えて、先頭と終端の文字を後で消す」のようなことをせずに「表示文字列を全部選択してそのまま書き換える」をした場合、どうなるかというと以下のようになります。





上記の動作はWordのバージョンにもよるのかもしれませんが。
私が使用しているのは2010です。



上記のように、貼りつけた先のソフトの都合で微妙な編集が必要になって面倒な場合は、リンク先アドレスと表示文字列を個別に指定できるものを以下に作成しましたのでご利用ください。
表示文字列
リンク先

0 件のコメント:

コメントを投稿