xlogI125’s blog

パソコン作業を効率化したい

PowerShell練習 基準となる順番に並べ替える

メモ

メール宛先の順番を考えて入力する作業に一苦労するので、作業負担の軽減を考えてみる。この例の場合はExcelのユーザー設定リストで対応可能だと思う。

実際にはメール宛先の順番を臨機応変に対応する必要があり、そもそもメール宛先を思うように取得できないので、他の例が良いのかもしれない。

使い捨てスクリプト

# PowerShell 5.1, Windows 11

$null | Set-Clipboard

# Array.Sort<T>(T[], IComparer<T>) での並べ替え用
Add-Type -TypeDefinition @'
using System;
using System.Collections.Generic;

public class SortMailAddr : Comparer<string> {
  public string[] list;

  public SortMailAddr(string[] list) {
    this.list = list;
  }

  public override int Compare(string x, string y) {
    // 特殊文字は考慮しない
    int iox = Array.IndexOf(this.list, x);
    int ioy = Array.IndexOf(this.list, y);

    if (iox > ioy) { return 1; }
    else if (iox < ioy) { return -1; }

    return 0;
  }
}
'@

<#
# 貼り付け先は PowerShell ISE の スクリプト ウィンドウ にする
class SortMailAddr : System.Collections.Generic.Comparer[string] {
  [string[]]$list

  SortMailAddr([string[]]$list) {
    $this.list = $list
  }

  [int]Compare([string]$x, [string]$y) {
    # 特殊文字は考慮しない
    # IndexOf  Method  int IList.IndexOf(System.Object value)
    $iox = $this.list.IndexOf($x)
    $ioy = $this.list.IndexOf($y)

    if ($iox -gt $ioy) { return 1 }
    elseif ($iox -lt $ioy) { return -1 }

    return 0
  }
}
#>

# 基準となる並び順
$addresses = @(@'
"◎◎◎部長" <aa01@xxxxx.yy.jp>
"〇〇〇次長" <bb01@xxxxx.yy.jp>
"△△△課長" <cc01@xxxxx.yy.jp>
"□課長補佐" <dd01@xxxxx.yy.jp>
"●●●係長" <ee01@xxxxx.yy.jp>
"▲▲▲主任" <ff01@xxxxx.yy.jp>
"■51社員" <gg51@xxxxx.yy.jp> ☆元部長
"■97社員" <gg97@xxxxx.yy.jp> *元課長
"■99社員" <gg99@xxxxx.yy.jp> ※大ベテラン
"■01社員" <gg01@xxxxx.yy.jp>
"■02社員" <gg02@xxxxx.yy.jp>
"■03社員" <gg03@xxxxx.yy.jp>
"■52社員" <gg52@xxxxx.yy.jp>
"■53社員" <gg53@xxxxx.yy.jp>
"■98社員" <gg98@xxxxx.yy.jp>
'@ -split "`n") -replace '(>).*$', '$1'

# 現在作成中のメール宛先
$a = @(@'
"■02社員" <gg02@xxxxx.yy.jp>
"■51社員" <gg51@xxxxx.yy.jp>
"■99社員" <gg99@xxxxx.yy.jp>
"●●●係長" <ee01@xxxxx.yy.jp>
"他の宛先02" <eee@fffff.gg.hh>
"□課長補佐" <dd01@xxxxx.yy.jp>
"■98社員" <gg98@xxxxx.yy.jp>
"〇〇〇次長" <bb01@xxxxx.yy.jp>
"◎◎◎部長" <aa01@xxxxx.yy.jp>
"△△△課長" <cc01@xxxxx.yy.jp>
"他の宛先01" <aaa@bbbbb.cc.dd>
"■01社員" <gg01@xxxxx.yy.jp>
"他の宛先03" <iii@jjjjj.kk.ll>
'@ -split "`n") -replace '(>).*$', '$1'

$b = [string[]]($a | Sort-Object)

[Array]::Sort($b, [SortMailAddr]::new($addresses))

$b | Set-Clipboard

$b