仕事で作業をしていると、Excelのセルデータを一個ずつWebページの入力フィールドにコピーするような作業が発生することがあります。とっても馬鹿馬鹿しい単純作業ですが、誰かが作業しなければ次に進まない!ルーターの初期設定画面にあらかじめ指定されているファイヤーウォールルールのパラメータをExcelシートの行からコピーして設定するようなケースですね。(ルーターなら普通はコンフィグファイルを読み込むでしょうけど、これは一例なので深く考えない。)
パラメータの数が少なければ、Excelファイルから直接コピー&ペーストを繰り返すのも良いかも知れませんが、コピーすべきパラメータ数が20とか50とかに増えてくると、コピー作業しているセルを見失って間違えそうです。または初期設定しなくてはならない機器台数が数10台に及ぶようなケースもあります。
Excel ファイルではなく、一行に位置パラメータが記述されている次のようなファイルのパラメータを上から順番に、コピー&ペーストするようなケースも同様に、作業しているセルを見失いがちです。
適当なパラメータシートがなかったので、サンプルは郵便番号-住所 データで代用。
<サンプルテキストファイル addr.txt>
〒 734-0053 広島県 広島市南区 青崎 アオサキ ・・・・・ ・・・・・
そこで、指定したテキストファイルを上から順番に一行ずつコピーバッファに取り込み、Enter を押す毎に次の行をコピーバッファに取り込む PowerShell スクリプトを書きました。
これを使うと何がいいかというと、マウスで行う作業がペースト(貼り付け)だけになるということ。コピーするセルを間違えることはないし、コピー範囲を間違えることもありません。
あらかじめ、設定する相手に合わせてテキストデータを作っておく必要はありますが、PowerShell ウィンドウと設定ウィンドウを左右に並べておいて、PowerShell 画面で Enter をタイプして一行データをクリップボードに取り込み、ウィンドウを切り替えて貼り付け。また Powershell に戻って Enter。
途中に空白行がある場合は、無視されて次のパラメータにスキップしてしまいます。(if文のところ。)
テキストファイルを正しく作成しておけば、コピー操作が不要になるためデータを間違えて書き込んでしまう可能性が大幅に低下し、ヒューマンエラーが減ります。
# <line_copy_to_clipboard.ps1>
# この関数は、以下のURLからコピーしたものです。
# https://gallery.technet.microsoft.com/scriptcenter/5481e36a-8073-40ae-92cd-fbef1e6df99a
#
Function Get-FileName($initialDirectory)
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "All files (*.*)| *.*"
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
} # Get-FileName 関数の終わり
# *** スクリプトのエントリ ポイント ***
$working_dir="C:\Users\usagi\OneDrive\ドキュメント"
$done_dir="C:\Users\usagi\OneDrive\ドキュメント\done"
$textfile_path=Get-FileName -initialDirectory "C:\Users\usagi\OneDrive\ドキュメント"
$parameters=(get-content $textfile_path)
$i=0
foreach ($para in $parameters){
$i++
if ($para -ne ""){
$para|clip
"$i : $para"
}
$in = Read-Host "Press ENTER KEY, then next"
}
echo ""
echo ""
echo "$textfile_path was finished."
# 作業済みファイルは別のフォルダーに移動して、重複作業しないようにする。
Move-Item $textfile_path $done_dir
PowerShell 実行結果はこんな感じ。表示だけ行番号を入れています。クリップボードに行番号はコピーしません。終了がわかるように、行末までゆくとメッセージを表示します。この時クリップボードには前のデータを保持しています。
<PowerShell ISE 実行結果>
1 : 〒 734-0053 Press ENTER KEY, then next: 2 : 広島県 Press ENTER KEY, then next: 3 : 広島市南区 Press ENTER KEY, then next: 4 : 青崎 Press ENTER KEY, then next: 5 : アオサキ Press ENTER KEY, then next: C:\Users\usagi\OneDrive\ドキュメント\addr.txt was finished.
ここには、紹介していませんが、Excel に複数のパラメータを記述する場合は、行方向に延ばして行く傾向にあるので、事前にExcel の1行が1ファイルになるように変換を行っておく必要があります。
Excel ファイルを直接 PowerShell から操作するのは面倒なので、一度 CSVテキストファイルに、自分の都合の良い並びに変換して保存しておいたものを、一行が1テキストファイルになるように変換するスクリプトを書きました。
先頭セルがファイル名になります。(セル内のA列に拡張子は不要)
$working_dir = "C:\temp\work"
$master_csv = "C:\temp\work\input_data.txt"
cd $working_dir
$master_data = (Get-Content $master_csv)
$i = 0
foreach ($l in $master_data){
$j=0
$file=$l.Split(",")[0]+".txt"
foreach($m in $l.Split(",")){
if ($m -ne ""){
$m >> $file
}
}
echo ""
$i++
}
C:\Temp\work\input_data.txt として保存した CSVファイルが、一行ごとにテキストファイルになり、C:\Temp\work に保存されます。