Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- $objMissingValue = [System.Reflection.Missing]::Value
- [void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms");
- # 指定した日付が平日かどうかを表す論理値を返す
- function IsWeekday($date)
- {
- $result = $true
- switch((Get-Date $date).DayOfWeek)
- {
- 'Sunday' {$result = $false}
- 'Saturday' {$result = $false}
- }
- $result
- }
- # 指定した日付の前営業日を返す(祝日考慮なし)
- function Get-PreviousWeekday($date)
- {
- $date = $date.AddDays(-1)
- while(!(IsWeekday($date)))
- {
- $date = $date.AddDays(-1)
- }
- $date
- }
- # 指定した日付の翌営業日を返す(祝日考慮なし)
- function Get-NextWeekday($date)
- {
- $date = $date.AddDays(1)
- while(!(IsWeekday($date)))
- {
- $date = $date.AddDays(1)
- }
- $date
- }
- function CreateMail($title, $body, $sendto, $replaceTable)
- {
- #文字列置換
- foreach ($item in $replaceTable.GetEnumerator())
- {
- $title = $title -creplace ("\{" + $item.Key + "\}"), $item.Value
- $body = $body -creplace ("\{" + $item.Key + "\}"), $item.Value
- }
- #Outlook Mail出力
- $outlook = New-Object -comObject Outlook.Application
- $mail = $outlook.CreateItem(0)
- $mail.BodyFormat = 2
- $mail.Subject = $title
- $mail.HtmlBody = $body
- $mail.To = $sendto
- $mail.save()
- }
- #フィルター作成
- #順序を崩すと作成できないので、編集時は注意
- function CreateFilter
- {
- $date=@{}
- $date["+0"] =(Get-Date ((Get-Date).AddDays(0)) -format "yyyy/MM/dd 00:00:00")
- $date["+1"] =(Get-Date ((Get-Date).AddDays(1)) -format "yyyy/MM/dd 00:00:00")
- $date["+2"] =(Get-Date ((Get-Date).AddDays(2)) -format "yyyy/MM/dd 00:00:00")
- $date["wd+2"]=(Get-Date (Get-NextWeekday(Get-NextWeekday(Get-Date))) -format "yyyy/MM/dd 00:00:00")
- [void]$project.FilterEdit("前日分",$true, $true , $true , $true, $objMissingValue, "達成率" , $objMissingValue , "より小さい", "100%" , "かつ" , $true, $true)
- [void]$project.FilterEdit("前日分",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "終了日" , "より小さい", $date["+0"] , "かつ" , $true, $true)
- [void]$project.FilterEdit("当日分",$true, $true , $true , $true, $objMissingValue, "達成率" , $objMissingValue , "より小さい", "100%" , "かつ" , $true, $true)
- [void]$project.FilterEdit("当日分",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "終了日" , "より小さい", $date["+1"] , "かつ" , $true, $true)
- [void]$project.FilterEdit("翌日分",$true, $true , $true , $true, $objMissingValue, "達成率" , $objMissingValue , "より小さい", "100%" , "かつ" , $true, $true)
- [void]$project.FilterEdit("翌日分",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "開始日" , "以上" , $date["+1"] , "かつ" , $true, $true)
- [void]$project.FilterEdit("翌日分",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "終了日" , "より小さい", $date["wd+2"], "かつ" , $true, $true)
- [void]$project.FilterEdit("仕掛中",$true, $true , $true , $true, $objMissingValue, "達成率" , $objMissingValue , "より小さい", "100%" , "かつ" , $true, $true)
- [void]$project.FilterEdit("仕掛中",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "開始日" , "より小さい", $date["+1"] , "かつ" , $true, $true)
- [void]$project.FilterEdit("仕掛中",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "サマリー タスク", "と等しい" , "いいえ" , "かつ" , $true, $true)
- [void]$project.FilterEdit("仕掛中",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "達成率" , "より大きい", "0%" , "または", $true, $true)
- [void]$project.FilterEdit("仕掛中",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "達成率" , "より小さい", "100%" , "かつ" , $true, $true)
- [void]$project.FilterEdit("仕掛中",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "開始日" , "以上" , $date["+1"] , "かつ" , $true, $true)
- [void]$project.FilterEdit("仕掛中",$true, $false, $false, $true, $objMissingValue, $objMissingValue, "サマリー タスク", "と等しい" , "いいえ" , "かつ" , $true, $true)
- }
- #プロジェクトファイルオープン
- function OpenProject($MppPath)
- {
- $msprj = New-Object -comObject MSProject.Application
- $msprj.Visible = $true
- [void]$msprj.FileOpen($MppPath,$true,0,$true,"","",$false,"","","MSProject.mpp.9","",4)
- $msprj
- }
- # クリップボード経由でタスクリスト取得
- function GetFilterTasks($filter)
- {
- # フィルター適用
- [void]$project.FilterApply($filter)
- [void]$project.OutlineShowAllTasks()
- # フィルター適用したタスクリストを全て選択
- [void]$project.SelectTaskColumn("アウトライン番号",8,$false,$false)
- [void]$project.Font("MS Pゴシック", 10, $false, $false, $false, [Microsoft.Office.Interop.MSProject.PjColor]::pjBlack, $false)
- # タスクを赤文字にする
- # 未着手タスクを青文字にする
- $row = 1
- $rows_task = @()
- $rows_nostart = @()
- foreach ($task in $project.ActiveSelection.Tasks)
- {
- if ($task.Summary -eq $false)
- {
- if (((Get-Date $task.Start -format "yyyy/MM/dd") -eq (Get-Date -format "yyyy/MM/dd")) -and ($task.PercentComplete -eq 0))
- {
- $rows_nostart += $row
- }
- else
- {
- $rows_task += $row
- }
- }
- $row = $row + 1
- }
- foreach ($row in $rows_task)
- {
- [void]$project.SelectRow($row, $false, 0, $false, $false)
- [void]$project.Font("MS Pゴシック", 10, $true, $false, $false, [Microsoft.Office.Interop.MSProject.PjColor]::pjRed, $false)
- }
- foreach ($row in $rows_nostart)
- {
- [void]$project.SelectRow($row, $false, 0, $false, $false)
- [void]$project.Font("MS Pゴシック", 10, $true, $false, $false, [Microsoft.Office.Interop.MSProject.PjColor]::pjGreen, $false)
- }
- # クリップボード経由でタスクリスト取得
- [void]$project.SelectTaskColumn("アウトライン番号", 8, $false, $false)
- [void]$project.EditCopy()
- $stream = [System.Windows.Forms.Clipboard]::GetData("Html Format")
- if ($stream -eq $null)
- {
- "全て完了"
- }
- else
- {
- $reader = New-Object System.IO.StreamReader($stream)
- # 余計な行を先読みして除去
- foreach ($i in 1..6) { [void]$reader.ReadLine() }
- $reader.ReadToEnd()
- }
- }
- function Get-MSProjectTasks($MpjPath, $filters)
- {
- $resTable=@{}
- # プロジェクトファイルオープン
- $project=OpenProject -MppPath $MpjPath
- # フィルター作成
- CreateFilter
- # フィルターかけてクリップボード経由で表取得
- foreach($key in $filters.Keys)
- {
- $resTable[$key]=GetFilterTasks -filter $filters[$key]
- }
- #プロジェクトファイルクローズ
- [void]$project.FileClose(0)
- [void]$project.Quit()
- $resTable
- }
- function CreateProjectMail($config)
- {
- $table=@{}
- # 置換文字列のテーブル生成
- foreach($item in $config.config.replacetable.replace)
- {
- $table[$item.key]=$item.value
- }
- $table["Now"]=Get-Date -format "M/d H:mm"
- $table["Yesterday"]=Get-Date (Get-PreviousWeekday(Get-Date)) -format "M/d(ddd)"
- $table["Today"]=Get-Date ((Get-Date).AddDays(0)) -format "M/d(ddd)"
- $table["Tomorrow"]=Get-Date (Get-NextWeekday(Get-Date)) -format "M/d(ddd)"
- # Microsoft Projectの読み込み設定
- foreach($item in $config.config.msprojects.project)
- {
- $table[$item.key+"."+"name"]=$item.name
- $table[$item.key+"."+"path"]=$item.projectpath
- $_filters=@{}
- foreach($keyValue in $item.filter)
- {
- $_filters[$keyValue.key]=$keyValue.value
- }
- $taskTable=(Get-MSProjectTasks -MpjPath $item.projectpath -filters $_filters)
- foreach($key in $taskTable.keys)
- {
- $table[$item.key+"."+$key]=$taskTable[$key]
- }
- }
- CreateMail -title $config.config.template.title -body (Get-Content (Join-Path $config.config.CurrentDir $config.config.template.htmlbody)) -sendto $config.config.template.sendto -replaceTable $table
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement