みなさん、Microsoft Copilotを使っていますか?
私はEdgeブラウザーをメインで使っているので、気軽にサイドバーでCopilotを使っています。文章の作成や確認などで便利ですよね。
今回はMicrosoft Copilotを使って、ほとんど使ったことがないVBScriptのスクリプトを作成してみます。
最終的にできたスクリプトは「ドラッグ&ドロップしたテキストファイルの内容の一部を変更して内容をクリップボードにコピーする」というものです。
それでは、作る背景なども含めて紹介します。スクリプトをすぐに見たい方は目次からジャンプしてくださいね。
スクリプトを作る目的
ゆうプリRを使い始めました
今回スクリプトを作る目的ですが、どこで使うのかを説明します。
販売している商品の出荷ラベルを作るために、「ゆうプリR」(正式名称:ゆうパックプリントR)を使おうと準備をしています。
「ゆうプリR」は日本郵便が提供しているゆうパック・ゆうパケットなどのWindows用ラベル作成アプリです。
この「ゆうプリR」は使ってみると分かるのですが、UIが古く、とても動作が重くて、挙動を理解することが難しいアプリです。先にクリックポストを使いまくっていたので、出荷情報はクラウドで保存されると思っていましたが、まさかローカルだけに保存されている(&再インストールで消える)なんてビックリです。
出荷情報のフォーマットが思いどおりにならない
さて、愚痴はこのくらいにして、ゆうプリRの出荷情報をCSV(カンマ区切りテキスト)やTSV(タブ区切りテキスト)で保存できます。
出荷情報をエクセルで管理しているのですが、このフォーマットに合わせて情報を出力しようと設定を進めていました。
私の現在の知識だと、ゆうプリRで必要とするフォーマットに一番近づけたものが以下のものでした。タブで区切られているTSVファイルです。
荷物の追跡番号① お客様の名前① 出荷方法① 出荷日① 荷物の追跡番号② お客様の名前② 出荷方法② 出荷日② 荷物の追跡番号③ お客様の名前③ 出荷方法③ 出荷日③ 荷物の追跡番号④ お客様の名前④ 出荷方法④ 出荷日④
この出荷日のフォーマットが「ゆうプリR」からだと「20240115」なっていて、いわゆる「YYYYMMDD」形式になっています(西暦4桁+月2桁+日2桁)。
出荷情報を管理しているエクセルでは出荷日の部分を「2024/01/15」と「YYYY/MM/DD」形式になっているので、この形式で出力してほしいのですが、方法がわかりませんでした。
スクリプトでテキスト置換をしてもらおう
そこで思いついたのは、TSV形式のテキストファイルをスクリプトで開いて、「YYYYMMDD」を「YYYY/MM/DD」に置換してもらうというものでした。
Windowsなので標準で使えるスクリプトといえばVBScriptですよね。
Microsoftの2023年10月の発表によれば将来的にはVBScriptが削除される(廃止される)そうですが、とりあえず今動けばいいので、VBScriptを使います(汗)。
米Microsoftは10月10日(日本時間)、WindowsクライアントOSで「VBScript」を非推奨とする方針を明らかにした。
(中略)
同社によると、「VBScript」は将来のWindowsリリースで削除されるとのこと。ただし、当面の間はオンデマンド機能としてプリインストールされ、必要であれば有効化できるという。
「VBScript」は非推奨に、将来のWindowsリリースで削除 - 窓の杜
こうした背景からスクリプトを作成することになりました。
スクリプトが分からないけど現在は生成AIがある
スクリプトを作ろう!と言っても、私はVBScriptを書いたことがありません。
ですが、現在、私たちには生成AIのMicrosoft Copilotがあります。スクリプトを書いてもらうことにします。
早速EdgeブラウザーのサイドバーのMicrosoft Copilotに聞いてみます。
タブ区切りテキストでは4列目(と言って良いのかわからないけど)にあるテキストだけを置換したいので以下のプロンプトを使いました。
Windowsで動くVBSファイルで、ドラッグアンドドロップしたテキストファイルの4列目のタブの文字をYYYYMMDDになっているものをYYYY/MM/DDに変換して保存するスクリプトを書いてください
今見てみると、ところどころ変な文になっていますが、回答はこんな感じ。
こんにちは、これはBingです。😊
VBSファイルは、VBScriptというプログラミング言語で書かれたスクリプトファイルです¹。VBSファイルを作るには、メモ帳などのテキストエディタでコードを書いて、拡張子を.vbsにして保存します²。テキストファイルの日付形式を変換するには、DATEVALUE関数やTEXT関数などを使うことができます³⁴⁵。以下は、ドラッグアンドドロップしたテキストファイルの4列目のタブの文字をYYYYMMDDからYYYY/MM/DDに変換して保存するVBSファイルの例です。テキストファイルのパスや区切り文字などは、必要に応じて変更してください。
ドラッグ&ドロップしたテキストファイルのテキストの一部を置換して保存するスクリプトを作る
提示されたスクリプトは以下のとおりです。
'ドラッグアンドドロップしたテキストファイルのパスを取得
Dim objArgs
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
WScript.Echo "テキストファイルをドラッグアンドドロップしてください。"
WScript.Quit
End If
Dim strFilePath
strFilePath = objArgs(0)
'テキストファイルを開く
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objFile
Set objFile = objFSO.OpenTextFile(strFilePath, 1)
'新しいテキストファイルを作る
Dim strNewFilePath
strNewFilePath = objFSO.GetParentFolderName(strFilePath) & "\converted_" & objFSO.GetFileName(strFilePath)
Dim objNewFile
Set objNewFile = objFSO.CreateTextFile(strNewFilePath, True)
'テキストファイルの内容を読み込んで日付形式を変換
Dim strLine, arrLine, strDate, strNewDate
Do While Not objFile.AtEndOfStream
'1行読み込む
strLine = objFile.ReadLine
'タブで分割する
arrLine = Split(strLine, vbTab)
'4列目の文字を取得する
strDate = arrLine(3)
'YYYYMMDDからYYYY/MM/DDに変換する
strNewDate = Left(strDate, 4) & "/" & Mid(strDate, 5, 2) & "/" & Right(strDate, 2)
'4列目の文字を置き換える
arrLine(3) = strNewDate
'タブで結合する
strLine = Join(arrLine, vbTab)
'新しいテキストファイルに書き込む
objNewFile.WriteLine strLine
Loop
'テキストファイルを閉じる
objFile.Close
objNewFile.Close
'完了メッセージを表示
WScript.Echo "日付形式の変換が完了しました。"
これをテキストエディタにコピペして「テキスト置換.vbs」で保存します。文字コードはUTF-8ではなく、シフトJISではないと動きませんでした。なぜ…。
できあがったVBScriptファイルにテキストファイルをドラッグ&ドロップすると、以下のダイアログが表示されて「converted_(変換するテキストファイル名)」で保存されます。(※変換元のテキストファイルの文字コードもシフトJIS。UTF-8だった場合、日本語部分が文字化けします)
すばらしい! ほとんど何も考えなくてもできました。これで終わりです。
テキスト置換した内容をクリップボードにコピーするスクリプトを作る
と思いましたが、作業の流れを考えるとテキスト置換されたテキストファイルを開いて、内容を全部選択して、エクセルにペースト(貼り付け)することになります。
最初からテキスト置換された内容がクリップボードにコピーされていれば、ファイルを開く必要もないですし、余計なファイルが生成されることもなくてフォルダーがファイルであふれることもありません。
Microsoft Copilotにスクリプトを書き換えてもらう
そうしたことができるかを、続けてMicrosoft Copilotに聞いてみます。
ありがとうございます
最期ファイルに保存するのではなく、変換した内容をクリップボードにコピーして終了するスクリプトに書き換えてもらえますか?
「最期」の文字が気になりますが、回答は以下のとおりでした。
どういたしまして。😊
クリップボードにコピーするスクリプトに書き換えるには、以下のようにします。- 新しいテキストファイルを作る代わりに、変換した文字列を変数に追加していく
- クリップボードにコピーする関数を定義する¹²
- 変数に格納した文字列をクリップボードにコピーする関数を呼び出す以下は、書き換えたスクリプトの例です。
'ドラッグアンドドロップしたテキストファイルのパスを取得
Dim objArgs
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
WScript.Echo "テキストファイルをドラッグアンドドロップしてください。"
WScript.Quit
End If
Dim strFilePath
strFilePath = objArgs(0)
'テキストファイルを開く
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objFile
Set objFile = objFSO.OpenTextFile(strFilePath, 1)
'変換した文字列を格納する変数を宣言
Dim strConverted
strConverted = ""
'テキストファイルの内容を読み込んで日付形式を変換
Dim strLine, arrLine, strDate, strNewDate
Do While Not objFile.AtEndOfStream
'1行読み込む
strLine = objFile.ReadLine
'タブで分割する
arrLine = Split(strLine, vbTab)
'4列目の文字を取得する
strDate = arrLine(3)
'YYYYMMDDからYYYY/MM/DDに変換する
strNewDate = Left(strDate, 4) & "/" & Mid(strDate, 5, 2) & "/" & Right(strDate, 2)
'4列目の文字を置き換える
arrLine(3) = strNewDate
'タブで結合する
strLine = Join(arrLine, vbTab)
'変数に追加する
strConverted = strConverted & strLine & vbCrLf
Loop
'テキストファイルを閉じる
objFile.Close
'クリップボードにコピーする関数を定義する
Sub PutInClipboardText (ByVal str)
Dim cmd
cmd = "cmd /c ""echo " & str & "| clip"""
CreateObject ("WScript.Shell").Run cmd, 0
End Sub
'変数に格納した文字列をクリップボードにコピーする関数を呼び出す
PutInClipboardText (strConverted)
'完了メッセージを表示
WScript.Echo "日付形式の変換が完了しました。"
ささっとスクリプトを書き換えてくれました。
実際このスクリプトを使ってみると、クリップボードにコピーされることはありませんでした。どうやら改行があるとうまくできないようです。
再度Microsoft Copilotにスクリプトを書き換えてもらう
そこでまたMicrosoft Copilotに以下のように依頼しました。
ありがとうございます
改行が含まれたテキストファイルだとクリップボードにコピーされないようです。改行にも対応できるよう書き直してください。
回答は以下のとおりでした。
どういたしまして。😊
改行が含まれたテキストファイルでもクリップボードにコピーできるようにするには、以下のようにします。- 改行コードを文字列に挿入するには、`vbCrLf`や`vbCr`や`vbLf`などを使います¹²³。
- `echo`コマンドでクリップボードにコピーするときには、改行コードを`^`でエスケープする必要があります⁴。以下は、改行にも対応したスクリプトの例です。
'ドラッグアンドドロップしたテキストファイルのパスを取得
Dim objArgs
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
WScript.Echo "テキストファイルをドラッグアンドドロップしてください。"
WScript.Quit
End If
Dim strFilePath
strFilePath = objArgs(0)
'テキストファイルを開く
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objFile
Set objFile = objFSO.OpenTextFile(strFilePath, 1)
'変換した文字列を格納する変数を宣言
Dim strConverted
strConverted = ""
'テキストファイルの内容を読み込んで日付形式を変換
Dim strLine, arrLine, strDate, strNewDate
Do While Not objFile.AtEndOfStream
'1行読み込む
strLine = objFile.ReadLine
'タブで分割する
arrLine = Split(strLine, vbTab)
'4列目の文字を取得する
strDate = arrLine(3)
'YYYYMMDDからYYYY/MM/DDに変換する
strNewDate = Left(strDate, 4) & "/" & Mid(strDate, 5, 2) & "/" & Right(strDate, 2)
'4列目の文字を置き換える
arrLine(3) = strNewDate
'タブで結合する
strLine = Join(arrLine, vbTab)
'変数に追加する
strConverted = strConverted & strLine & vbCrLf
Loop
'テキストファイルを閉じる
objFile.Close
'クリップボードにコピーする関数を定義する
Sub PutInClipboardText (ByVal str)
Dim cmd
'改行コードを^でエスケープする
str = Replace(str, vbCrLf, "^" & vbCrLf)
cmd = "cmd /c ""echo " & str & "| clip"""
CreateObject ("WScript.Shell").Run cmd, 0
End Sub
'変数に格納した文字列をクリップボードにコピーする関数を呼び出す
PutInClipboardText (strConverted)
'完了メッセージを表示
WScript.Echo "日付形式の変換が完了しました。"
残念ながらこれも動きませんでした。
動かないスクリプトはGoogleで検索して対処した
Googleで「VBScriptで改行を含むテキストをクリップボードにコピーする」と検索しました。
検索結果の中で「Yahoo!知恵袋」に該当のスクリプトがありました。
ベストアンサーにあるスクリプトを採用します。
Set ws = CreateObject("WScript.Shell")
ws.Exec("clip").StdIn.Write "ABC" & vbNewLine & "XYZ"
Set ws = Nothing
完成したスクリプト
最終的にオブジェクトを解放している(未定義化している?)ので、Set wsで変数を使う理由が分かりませんでしたが、早速組み込んでみました。
スクリプトのコメントで「クリップボードにコピーする関数を定義する」と書かれている中身を変えています。
'ドラッグアンドドロップしたテキストファイルのパスを取得
Dim objArgs
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
WScript.Echo "テキストファイルをドラッグアンドドロップしてください。"
WScript.Quit
End If
Dim strFilePath
strFilePath = objArgs(0)
'テキストファイルを開く
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objFile
Set objFile = objFSO.OpenTextFile(strFilePath, 1)
'変換した文字列を格納する変数を宣言
Dim strConverted
strConverted = ""
'テキストファイルの内容を読み込んで日付形式を変換
Dim strLine, arrLine, strDate, strNewDate
Do While Not objFile.AtEndOfStream
'1行読み込む
strLine = objFile.ReadLine
'タブで分割する
arrLine = Split(strLine, vbTab)
'4列目の文字を取得する
strDate = arrLine(3)
'YYYYMMDDからYYYY/MM/DDに変換する
strNewDate = Left(strDate, 4) & "/" & Mid(strDate, 5, 2) & "/" & Right(strDate, 2)
'4列目の文字を置き換える
arrLine(3) = strNewDate
'タブで結合する
strLine = Join(arrLine, vbTab)
'変数に追加する
strConverted = strConverted & strLine & vbCrLf
Loop
'テキストファイルを閉じる
objFile.Close
'クリップボードにコピーする関数を定義する
Sub PutInClipboardText (ByVal str)
CreateObject("WScript.Shell").Exec("clip").StdIn.Write strConverted
End Sub
'変数に格納した文字列をクリップボードにコピーする関数を呼び出す
PutInClipboardText (strConverted)
'完了メッセージを表示
WScript.Echo "日付形式の変換が完了しました。"
先ほどのクリップボードにコピーする部分は変数には入れないで直接実行する形式にしましたが、なにか問題があるようであれば教えてください。
できあがったスクリプトを「.vbsファイル」として保存して、そのファイルにテキストファイルをドラッグ&ドロップするとクリップボードにテキスト置換したデータがコピーされました!
スクリプトの完成です!!!
このスクリプトが完成するまで、およそ30分強。VBScriptを理解していない人間ですが、短時間にスクリプトの完成に持っていけました。
まとめ
Microsoft Copilotを使えば作業の自動化を進めるスクリプトを簡単に作ることができます。言葉が多少誤っていても、文意を読み取ってくれてスクリプトを作ってくれます。
今後はPowerShellのスクリプトなどに置き換える必要が出てくるのでしょうが、こうした作業もMicrosoft Copilotに依頼すればできるようになるでしょう。
みなさんもぜひMicrosoft Copilotを試してみてくださいね。
それではまた。
【余談】
Microsoft Copilotに依頼してVBScriptをPowerShellコマンドに変換してもらいました。
プロンプトは「以下のVBScriptをPowerShellのスクリプトに書き換えてください」で、VBScriptの内容をそのままペーストしただけです(笑)。
最後の完了メッセージを表示のダイアログが出ませんが、テキストを置換したデータがクリップボードにコピーされています。
「.ps1」ファイルをzipファイルとして圧縮してあるので見たい方は以下のボタンリンクからダウンロードしてみてください。
「.ps1」ファイルにはそのままドラッグ&ドロップできないので、こちらのページを参考にして作業をしてください。
関連情報・参考資料
- Microsoft Copilot
- PowerShellスクリプトにファイルをドラッグ&ドロップして処理させる方法(4thsight.xyz)