日付と時刻を挿入(カレンダー版)

フォーラム https://www.haijin-boys.com/discussions/2933 でヒロさんが希望していた、カレンダーからの日付挿入マクロです。 パワーシェルで.netのカレンダーコントロールを使用して、クリップボード経由で貼り付けます。

↓↓をmeryのマクロファイルとして保存(例:calendar.js)

#title = "カレンダーで日付挿入"
/*
* PowerShellを使って .Net の MonthCalendar コントロールを表示します
* 環境に合わせて PowerShell スクリプトのフルパスを修正してください
*
* PowerShell.exe の実行コマンドラインでは、セッションのみローカルの
* スクリプトの実行を許可しています
* Run メソッドではウインドウ非表示で実行し、PowerShell スクリプトの
* 内部で Window.State を操作しています。
* また、Run メソッドでは終了を待つため、フォームが表示されている間、
* 他のマクロは実行できません。
* PowerShell.exe 終了の戻り値が 0 であればクリップボードから貼り付け
* ます。PowerShell.exe 終了から Mery マクロへの復帰までに、他のアプ
* リでクリップボードが操作される可能性は無視しています。
*
* なお、MonthCalendar コントロールでは休日の色付けは困難な模様です。
*/
(function(){
var mydoc = editor.ActiveDocument; //WScript.Shell.Runの終了待ちの間に操作される対策を追加
var psScript = 'c:\\temp\\calendar.ps1';//←環境に合わせて修正
var psCmd = 'PowerShell.exe -STA -ExecutionPolicy RemoteSigned -File '
var errlevel = new ActiveXObject('WScript.Shell').Run( psCmd +
psScript, 0, true);
if(errlevel==0 && editor.ActiveDocument==mydoc)document.Write(ClipboardData.GetData());
})();

↓↓をpowershellのスクリプトファイルとして保存(例:calendar.ps1)

# MonthCalendar コントロールで日付を選択する Powershell スクリプト
# Enter または F5 でクリップボードにコピー、 Esc でキャンセルして終了する

$exitcode = 0

Add-Type -AssemblyName System.Windows.Forms

$Calendar = New-Object System.Windows.Forms.MonthCalendar
$Calendar.ShowToday = $False
$Calendar.ShowTodayCircle = $False
$Calendar.MaxSelectionCount = 1
# 休日に色を付けるとかはできない模様

$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Select Date"
$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedToolWindow
$Form.Controls.Add($Calendar)
$Form.ControlBox = $False
$Form.TopMost = $True
$Form.KeyPreview = $True
$Form.Add_KeyDown({
    if (($_.KeyCode -eq "Enter") -or ($_.KeyCode -eq "F5")){
        $date = $Calendar.SelectionStart

        # "カスタム日時書式指定文字列" を参照
        # https://msdn.microsoft.com/ja-jp/library/8kb3ddd4.aspx
        # 曜日を日本語で表示するため CultureInfo を指定
        $culture = New-Object System.Globalization.CultureInfo("ja-JP")
        [Windows.Forms.Clipboard]::SetText($date.ToString("yy/MM/dd(ddd)",$culture))

        $Form.Close()
    }
})
$Form.Add_KeyDown({
    if ($_.KeyCode -eq "Escape"){
          $Form.Close()
          $exitcode = 1
    }
})
$Form.Add_Shown({ $Calendar.Location = New-Object System.Drawing.Point
@(0, 0); $Form.ClientSize = $Calendar.Size; $Form.WindowState = 0; })
$dialogresult = $Form.ShowDialog()
$Calendar.Dispose()
$Form.Dispose()
exit $exitcode

環境によってはpowershellの起動がやたらと遅いので、使い物にならないかもしれません。 core-i5 Windows7 のビジネスノートではストレスなく動作しましたが、Windows10 にアップグレードされた古い atom ネットブックでは無理でした。

スポンサーリンク