ScriptでのTips集計【sample】
EXCELでのTips集計【sample】
https://king.mineo.jp/my/b81d47db53bec75f/reports/45903
に続き、
Windows機で、EXCELが無くても集計で楽ができるように、
Script(Javascript,BAT(PowerShell)併用)で作成してみました。
#ひとまず、
Windows10[64bit]でザッとは確認しましたが、
しっかりと検証してはいません。。。
(最初にJavascriptでデータ収集の部分だけ作り、
期間限定、集計を行うのが面倒になり、
後からPowerShellで処理を付け足したので、
洗練されていない作りのためsampleです)
ただそれだけなんです。。。
<準備>
1. browseIE.batを自身の環境に合わせ修正/保存
2. browseIE.jsを自身の環境に合わせ修正/保存
<実行方法>
1. browseIE.batを実行する。
※ 既にIEでログイン済みだとエラーになる筈です...
(エラーハンドリング未実装なので。。。)
◆browseIE.js(browseIE.batから呼び出されます)◆
var target_url = WScript.Arguments.Unnamed(0);
var page_txt = get_page_txt( target_url );
WScript.Echo( page_txt );
WScript.Quit();
// ---------- 関数 ----------
function get_page_txt( target_url )
{
// ' Object準備
var ie = new ActiveXObject("InternetExplorer.Application");
var sh = new ActiveXObject("WScript.Shell");
var TITLE = "Internet Explorer";
sh.AppActivate(TITLE);
// ' IE起動(非表示)
ie.visible = false;
// ' ページ移動
ie.navigate( target_url, 4 );
// ' 完全にページが表示されるまで待機
while (ie.ReadyState != 4 || ie.Busy ) {
WScript.Sleep( 100 );
}
/*-----------------------------------------------------------*/
// ログイン
// フォームに入力
var TextBox1 = ie.document.getElementById( "session_login" );
var TextBox2 = ie.document.getElementById( "session_password" );
TextBox1.value = '<ご自身のマイネ王アカウント>';
TextBox2.value = '<ご自身のパスワード>';
// 100ミリ秒停止
WScript.Sleep( 100 );
// ボタンを押す
var Button = ie.document.getElementsByName( "commit" ).item(0);
Button.click();
// ' 完全にページが表示されるまで待機
while (ie.ReadyState != 4 || ie.Busy ) {
WScript.Sleep( 100 );
}
/*-----------------------------------------------------------*/
// テーブル表示
var s = '';
// var allParas = ie.document.getElementsByTagName("th");
// var ths = allParas.length;
// for(var i=0; i < ths; i++) {
// if (i == 0) {
// s = s + ie.document.getElementsByTagName("th")[i].outerText;
// } else {
// s = s + '\t' + ie.document.getElementsByTagName("th")[i].outerText;
// }
// }
//
// s = s + '\n';
var allParas = ie.document.getElementsByTagName("td");
var tds = allParas.length;
for(var j=0; j < tds; j++) {
if ( (j % 4) == 0 ) {
s = s + ie.document.getElementsByTagName("td")[j].outerText;
} else {
s = s + '\t' + ie.document.getElementsByTagName("td")[j].outerText;
}
if ( (j % 4) == 3) {
s = s + '\n';
}
}
WScript.Echo( s );
/*-----------------------------------------------------------*/
// ログアウト
WScript.Sleep( 100 );
ie.navigate( "https://king.mineo.jp/logout?.done=https://king.mineo.jp/my/<ご自身のマイページ>/tips", 4 );
// var Signout = ie.document.getElementsByClassName( "btn btn-default btn-block" ).item(1);
// Signout.click();
// ' 完全にページが表示されるまで待機
while (ie.ReadyState != 4 || ie.Busy ) {
WScript.Sleep( 100 );
}
// Internet Explorerを終了
ie.Quit();
// オブジェクトを解放
ie = null;
}
◆browseIE.bat(処理本体です)◆
@(echo '> NUL
echo off)
setlocal enableextensions
set "THIS_PATH=%~f0"
set "PARAM_1=%~1"
PowerShell.exe -Command "iex -Command ((gc \"%THIS_PATH:`=``%\") -join \"`n\")"
exit /b %errorlevel%
-- この1つ上の行までバッチファイル
') | sv -Name TempVar
# ここからPowerShellスクリプト
# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms
#Add-Type -AssemblyName System.Drawing
# Form設定
$Form = New-Object System.Windows.Forms.Form
$Form.Size = "480,140"
$Form.StartPosition = "CenterScreen"
$Form.Text = "開始/終了日時入力"
# 年月日設定(開始)
$SDatePicker = New-Object System.Windows.Forms.DatetimePicker
$SDatePicker.Location = "42,10"
$SDatePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$SDatePicker.CustomFormat = "yyyy/MM/dd"
# 時刻設定(開始)
$STimePicker = New-Object System.Windows.Forms.DateTimePicker
$STimePicker.Location = "250,10"
$STimePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$STimePicker.CustomFormat = "HH:mm"
$STimePicker.ShowUpDown = $TRUE
#ラベル(開始)
$Slabel = New-Object System.Windows.Forms.Label
$Slabel.Location = New-Object System.Drawing.Point(5,12)
$Slabel.Font = New-Object System.Drawing.Font("Calibri",8,[System.drawing.FontStyle]::Bold)
$Slabel.Size = New-Object System.Drawing.Size(35,20)
$Slabel.Text = "開始:"
# 年月日設定(終了)
$EDatePicker = New-Object System.Windows.Forms.DatetimePicker
$EDatePicker.Location = "42,30"
$EDatePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$EDatePicker.CustomFormat = "yyyy/MM/dd"
# 時刻設定(終了)
$ETimePicker = New-Object System.Windows.Forms.DateTimePicker
$ETimePicker.Location = "250,30"
$ETimePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$ETimePicker.CustomFormat = "HH:mm"
$ETimePicker.ShowUpDown = $TRUE
#ラベル(終了)
$Elabel = New-Object System.Windows.Forms.Label
$Elabel.Location = New-Object System.Drawing.Point(5,32)
$Elabel.Font = New-Object System.Drawing.Font("Calibri",8,[System.drawing.FontStyle]::Bold)
$Elabel.Size = New-Object System.Drawing.Size(35,20)
$Elabel.Text = "終了:"
# OKボタンの設定
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = "150,70"
$OKButton.Text = "OK"
$OKButton.DialogResult = "OK"
$OKButton.Flatstyle = "Popup"
# $OKButton.Backcolor = "black"
# $OKButton.forecolor = "yellow"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
# キャンセルボタンの設定
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = "285,70"
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = "Cancel"
$CancelButton.Flatstyle = "Popup"
$CancelButton.DialogResult = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
# フォームにアイテムを追加
$Form.Controls.Add($SDatePicker)
$Form.Controls.Add($STimePicker)
$Form.Controls.Add($Slabel)
$Form.Controls.Add($EDatePicker)
$Form.Controls.Add($ETimePicker)
$Form.Controls.Add($Elabel)
$Form.Controls.Add($OKButton)
$Form.Controls.Add($CancelButton)
# キーとボタンの関係
$Form.AcceptButton = $OKButton
$Form.CancelButton = $CancelButton
# 最前面に表示:する
$Form.Topmost = $True
# Formを表示
### [void] $Form.ShowDialog()
$result = $Form.ShowDialog()
if ( $result -eq "OK" )
{
# 開始日時を変数に代入
$sD = $SDatePicker.Text
$sT = $STimePicker.Text
$sDT = "$sD $sT"
# echo $sDT
# 終了日時を変数に代入
$eD = $EDatePicker.Text
$eT = $ETimePicker.Text
$eDT = "$eD $eT"
# echo $eDT
echo "`n 開始:$sDT`n 終了:$eDT`n"
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 -Descending | Format-Table -AutoSize -Wrap
}else{
echo "キャンセルされました。"
}
pause
##################
◆修正版①browseIE.bat
・引数で全期間、Sort順をコントロール可能
・Form上でも全期間、Sort順をコントロール可能(優先)
@echo off & setlocal enableextensions & set "THIS_PATH=%~f0" & goto DoExec
# 上の行はバッチファイル、この行以降はPowerShellの扱い
Param (
[string] $mode = "",
[string] $order = ""
)
<# ここまでPowerShell、以下の行からバッチファイル
:DoExec
PowerShell.exe -Command "& (iex -Command ('{#' + ((gc '%THIS_PATH:'=''%') -join \"`n\") + '}'))" %*
exit /b %errorlevel%
この1つ上の行までバッチファイル、この行から再びPowerShell #>
if ($order -eq "")
{
# Descending Order(降順)
}elseif ($order -eq "A"){
# Ascending Order(昇順)
}else{
echo "`r`n -order スイッチに無効な値 ${order} が指定されました。`r`n`r`n Usage:`r`n $($env:THIS_PATH) {-mode ALL} {-order A}`r`n"
pause
exit 1
}
if (($mode -eq "") -Or ($mode -eq "ALL"))
{
if ($mode -eq "")
{
# Interactive Mode
# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms
#Add-Type -AssemblyName System.Drawing
# Form設定
$Form = New-Object System.Windows.Forms.Form
$Form.Size = "480,140"
$Form.StartPosition = "CenterScreen"
$Form.Text = "開始/終了日時入力"
# 年月日設定(開始)
$SDatePicker = New-Object System.Windows.Forms.DatetimePicker
$SDatePicker.Location = "42,10"
$SDatePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$SDatePicker.CustomFormat = "yyyy/MM/dd"
# 時刻設定(開始)
$STimePicker = New-Object System.Windows.Forms.DateTimePicker
$STimePicker.Location = "250,10"
$STimePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$STimePicker.CustomFormat = "HH:mm"
$STimePicker.ShowUpDown = $TRUE
#ラベル設定(開始)
$Slabel = New-Object System.Windows.Forms.Label
$Slabel.Location = New-Object System.Drawing.Point(5,12)
$Slabel.Font = New-Object System.Drawing.Font("Calibri",8,[System.drawing.FontStyle]::Bold)
$Slabel.Size = New-Object System.Drawing.Size(35,20)
$Slabel.Text = "開始:"
# 年月日設定(終了)
$EDatePicker = New-Object System.Windows.Forms.DatetimePicker
$EDatePicker.Location = "42,30"
$EDatePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$EDatePicker.CustomFormat = "yyyy/MM/dd"
# 時刻設定(終了)
$ETimePicker = New-Object System.Windows.Forms.DateTimePicker
$ETimePicker.Location = "250,30"
$ETimePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$ETimePicker.CustomFormat = "HH:mm"
$ETimePicker.ShowUpDown = $TRUE
#ラベル設定(終了)
$Elabel = New-Object System.Windows.Forms.Label
$Elabel.Location = New-Object System.Drawing.Point(5,32)
$Elabel.Font = New-Object System.Drawing.Font("Calibri",8,[System.drawing.FontStyle]::Bold)
$Elabel.Size = New-Object System.Drawing.Size(35,20)
$Elabel.Text = "終了:"
# OKボタンの設定
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = "250,75"
$OKButton.Text = "OK"
$OKButton.DialogResult = "OK"
$OKButton.Flatstyle = "Popup"
# $OKButton.Backcolor = "black"
# $OKButton.forecolor = "yellow"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
# ALLボタンの設定
$ALLButton = New-Object System.Windows.Forms.Button
$ALLButton.Location = "42,75"
$ALLButton.Text = "ALL"
$ALLButton.DialogResult = "Ignore"
$ALLButton.Flatstyle = "Popup"
$ALLButton.Backcolor = "black"
$ALLButton.forecolor = "yellow"
$ALLButton.DialogResult = [System.Windows.Forms.DialogResult]::Ignore
# ラベル設定(チェックボックス)
$Clabel = New-Object System.Windows.Forms.Label
$Clabel.Location = New-Object System.Drawing.Point(100,53)
$Clabel.Size = New-Object System.Drawing.Size(145,20)
$Clabel.Text = "Sort方式を選択してください:"
# チェックボックスを作成
$CheckedBox = New-Object System.Windows.Forms.CheckBox
$CheckedBox.Location = "250,45"
$CheckedBox.Size = "230,30"
$CheckedBox.Text = "Ascending Order(昇順)"
# キャンセルボタンの設定
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = "370,75"
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = "Cancel"
$CancelButton.Flatstyle = "Popup"
$CancelButton.DialogResult = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
# フォームにアイテムを追加
$Form.Controls.Add($SDatePicker)
$Form.Controls.Add($STimePicker)
$Form.Controls.Add($Slabel)
$Form.Controls.Add($EDatePicker)
$Form.Controls.Add($ETimePicker)
$Form.Controls.Add($Elabel)
$Form.Controls.Add($OKButton)
$Form.Controls.Add($CancelButton)
$Form.Controls.Add($ALLButton)
$Form.Controls.Add($Clabel)
$Form.Controls.Add($CheckedBox)
# キーとボタンの関係
$Form.AcceptButton = $OKButton
$Form.CancelButton = $CancelButton
# 最前面に表示:する
$Form.Topmost = $True
# Formを表示
### [void] $Form.ShowDialog()
$result = $Form.ShowDialog()
#echo $result
if ( $result -eq "OK" )
{
# 開始日時を変数に代入
$sD = $SDatePicker.Text
$sT = $STimePicker.Text
$sDT = "$sD $sT"
# 終了日時を変数に代入
$eD = $EDatePicker.Text
$eT = $ETimePicker.Text
$eDT = "$eD $eT"
echo "`n 開始:$sDT`n 終了:$eDT`n"
if ($order -eq "")
{
if ($CheckedBox.Checked -eq "True") {
# Ascending Order(昇順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 | Format-Table -AutoSize -Wrap
}else{
# Descending Order(降順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 -Descending | Format-Table -AutoSize -Wrap
}
}else{
# Ascending Order(昇順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 | Format-Table -AutoSize -Wrap
}
}elseif ( $result -eq "Ignore" ){
# Interactive ALL Mode
# 開始日時を変数に代入
$sDT = (Get-Date -Day 1).AddMonths(0).AddDays(0).ToString("yyyy/MM/dd 00:00")
# 終了日時を変数に代入
$eDT = (Get-Date -Day 1).AddMonths(1).AddDays(-1).ToString("yyyy/MM/dd 23:59:59")
echo "`n 開始:$sDT`n 終了:$eDT`n"
if ($order -eq "")
{
if ($CheckedBox.Checked -eq "True") {
# Ascending Order(昇順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 | Format-Table -AutoSize -Wrap
}else{
# Descending Order(降順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 -Descending | Format-Table -AutoSize -Wrap
}
}else{
# Ascending Order(昇順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 | Format-Table -AutoSize -Wrap
}
}else{
echo "キャンセルされました。"
}
}else{
# Silent Mode
# 開始日時を変数に代入
$sDT = (Get-Date -Day 1).AddMonths(0).AddDays(0).ToString("yyyy/MM/dd 00:00")
# 終了日時を変数に代入
$eDT = (Get-Date -Day 1).AddMonths(1).AddDays(-1).ToString("yyyy/MM/dd 23:59:59")
echo "`n 開始:$sDT`n 終了:$eDT`n"
if ($order -eq "")
{
if ($CheckedBox.Checked -eq "True") {
# Ascending Order(昇順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 | Format-Table -AutoSize -Wrap
}else{
# Descending Order(降順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 -Descending | Format-Table -AutoSize -Wrap
}
}else{
# Ascending Order(昇順)
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT + ":59") } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 | Format-Table -AutoSize -Wrap
}
}
}else{
echo "`r`n -mode スイッチに無効な値 ${mode} が指定されました。`r`n`r`n Usage:`r`n $($env:THIS_PATH) {-mode ALL} {-order A}`r`n"
pause
exit 2
}
pause
##################
◆修正版②browseIE.bat
・集計表で【合計】を追加
・ツールチップ表示の追加
・Javascript実行ブロックの関数化
@echo off & setlocal enableextensions & set "THIS_PATH=%~f0" & goto DoExec
# 上の行はバッチファイル、この行以降はPowerShellの扱い
Param (
[string] $mode = "",
[string] $order = ""
)
<# ここまでPowerShell、以下の行からバッチファイル
:DoExec
PowerShell.exe -Command "& (iex -Command ('{#' + ((gc '%THIS_PATH:'=''%') -join \"`n\") + '}'))" %*
exit /b %errorlevel%
この1つ上の行までバッチファイル、この行から再びPowerShell #>
### 関数 ###
function AscendingO{
# Ascending Order(昇順)
# 0. テンポラリファイルを定義
$MyTMP = [System.IO.Path]::GetTempFileName()
# 1. 処理結果をテンポラリファイル(tab区切り)に保存
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT) } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 | ConvertTo-Csv -NoTypeInformation -Delimiter "`t" | % {$_ -replace '"',''} | Out-File $MyTMP -Encoding Default
# 2. GCで テンポラリファイルを1行飛ばして読み込み、CSVに変換後、合計行を計算し、「Add-Content」でテンポラリファイルに追記
(Get-Content $MyTMP) | Select-Object -Skip 1| ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t"| group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | Select-Object "お相手","送付","受領","差分" | %{$sum2 += [int]$_.送付;$sum3 += [int]$_.受領;$sum4 += [int]$_.差分};"【合計】`t$sum2`t$sum3`t$sum4" | Add-Content -Path $MyTMP -Encoding Default
# 3. GCで テンポラリファイルを読み込み、CSVに変更後に表示
(Get-Content $MyTMP) | ConvertFrom-Csv -Delimiter "`t"| Format-Table -AutoSize -Wrap
# 4. テンポラリファイルを削除
del $MyTMP
}
function DescendingO{
# Descending Order(降順)
# 0. テンポラリファイルを定義
$MyTMP = [System.IO.Path]::GetTempFileName()
# 1. 処理結果をテンポラリファイル(tab区切り)に保存
cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/" | %{$a = $_ -creplace "10MB" , "1"; "$a" }|ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t" | where { ($_.日時 -ge $sDT) -and ($_.日時 -le $eDT) } | group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | sort 差分, 送付, 受領 -Descending | ConvertTo-Csv -NoTypeInformation -Delimiter "`t" | % {$_ -replace '"',''} | Out-File $MyTMP -Encoding Default
# 2. GCで テンポラリファイルを1行飛ばして読み込み、CSVに変換後、合計行を計算し、「Add-Content」でテンポラリファイルに追記
(Get-Content $MyTMP) | Select-Object -Skip 1| ConvertFrom-Csv -Header "日時", "送付", "受領", "お相手" -Delimiter "`t"| group "お相手" | select @{Name="お相手";Expression={$_.Name}}, @{Name="送付";Expression={($_.group | measure "送付" -Sum).sum}}, @{Name="受領";Expression={($_.group | measure "受領" -Sum).sum}}, @{Name="差分";Expression={($_.group | measure "送付" -Sum).sum - ($_.group | measure "受領" -Sum).sum}} | Select-Object "お相手","送付","受領","差分" | %{$sum2 += [int]$_.送付;$sum3 += [int]$_.受領;$sum4 += [int]$_.差分};"【合計】`t$sum2`t$sum3`t$sum4" | Add-Content -Path $MyTMP -Encoding Default
# 3. GCで テンポラリファイルを読み込み、CSVに変更後に表示
(Get-Content $MyTMP) | ConvertFrom-Csv -Delimiter "`t"| Format-Table -AutoSize -Wrap
# 4. テンポラリファイルを削除
del $MyTMP
}
### 処理本体 ###
if ($order -eq "")
{
# Descending Order(降順)
}elseif ($order -eq "A"){
# Ascending Order(昇順)
}else{
echo "`r`n -order スイッチに無効な値 ${order} が指定されました。`r`n`r`n Usage:`r`n $($env:THIS_PATH) {-mode ALL} {-order A}`r`n"
pause
exit 1
}
if (($mode -eq "") -Or ($mode -eq "ALL"))
{
if ($mode -eq "")
{
# Interactive Mode
# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms
#Add-Type -AssemblyName System.Drawing
# Form設定
$Form = New-Object System.Windows.Forms.Form
$Form.Size = "480,140"
$Form.StartPosition = "CenterScreen"
$Form.Text = "開始/終了日時入力"
$Form.ShowInTaskbar = $False
$Form.ControlBox = $False
# 年月日設定(開始)
$SDatePicker = New-Object System.Windows.Forms.DatetimePicker
$SDatePicker.Location = "42,10"
$SDatePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$SDatePicker.CustomFormat = "yyyy/MM/dd"
# 時刻設定(開始)
$STimePicker = New-Object System.Windows.Forms.DateTimePicker
$STimePicker.Location = "250,10"
$STimePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$STimePicker.CustomFormat = "HH:mm"
$STimePicker.ShowUpDown = $TRUE
#ラベル設定(開始)
$Slabel = New-Object System.Windows.Forms.Label
$Slabel.Location = New-Object System.Drawing.Point(5,12)
$Slabel.Font = New-Object System.Drawing.Font("Calibri",8,[System.drawing.FontStyle]::Bold)
$Slabel.Size = New-Object System.Drawing.Size(35,20)
$Slabel.Text = "開始:"
# 年月日設定(終了)
$EDatePicker = New-Object System.Windows.Forms.DatetimePicker
$EDatePicker.Location = "42,30"
$EDatePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$EDatePicker.CustomFormat = "yyyy/MM/dd"
# 時刻設定(終了)
$ETimePicker = New-Object System.Windows.Forms.DateTimePicker
$ETimePicker.Location = "250,30"
$ETimePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
$ETimePicker.CustomFormat = "HH:mm"
$ETimePicker.ShowUpDown = $TRUE
#ラベル設定(終了)
$Elabel = New-Object System.Windows.Forms.Label
$Elabel.Location = New-Object System.Drawing.Point(5,32)
$Elabel.Font = New-Object System.Drawing.Font("Calibri",8,[System.drawing.FontStyle]::Bold)
$Elabel.Size = New-Object System.Drawing.Size(35,20)
$Elabel.Text = "終了:"
# OKボタンの設定
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = "250,75"
$OKButton.Text = "OK"
$OKButton.DialogResult = "OK"
$OKButton.Flatstyle = "Popup"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
# キャンセルボタンの設定
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = "370,75"
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = "Cancel"
$CancelButton.Flatstyle = "Popup"
$CancelButton.DialogResult = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
# ALLボタンの設定
$ALLButton = New-Object System.Windows.Forms.Button
$ALLButton.Location = "42,75"
$ALLButton.Text = "ALL"
$ALLButton.DialogResult = "Ignore"
$ALLButton.Flatstyle = "Popup"
$ALLButton.Backcolor = "black"
$ALLButton.forecolor = "yellow"
$ALLButton.DialogResult = [System.Windows.Forms.DialogResult]::Ignore
# ラベル設定(チェックボックス)
$Clabel = New-Object System.Windows.Forms.Label
$Clabel.Location = New-Object System.Drawing.Point(100,53)
$Clabel.Size = New-Object System.Drawing.Size(145,20)
$Clabel.Text = "Sort方式を選択してください:"
# チェックボックスの設定
$CheckedBox = New-Object System.Windows.Forms.CheckBox
$CheckedBox.Location = "250,45"
$CheckedBox.Size = "230,30"
$CheckedBox.Text = "Ascending Order(昇順)"
# ツールチップ(ALLボタン)
$ATooltip = New-Object System.Windows.Forms.Tooltip
$ATooltip.ShowAlways = $True
$ATooltip.ToolTipIcon = "none"
$ATooltip.ToolTipTitle = "ALLボタン"
$ATooltip.UseFading = $False
$ATooltip.AutoPopDelay = 3000
$ATooltip.InitialDelay = 100
$ATooltip.ReshowDelay = 500
# ツールチップ(チェックボックスラベル)
$CTooltip = New-Object System.Windows.Forms.Tooltip
$CTooltip.ShowAlways = $True
$CTooltip.ToolTipIcon = "none"
$CTooltip.ToolTipTitle = "Sort方式"
$CTooltip.UseFading = $False
$CTooltip.AutoPopDelay = 3000
$CTooltip.InitialDelay = 100
$CTooltip.ReshowDelay = 500
# フォームにアイテムを追加
$Form.Controls.Add($SDatePicker)
$Form.Controls.Add($STimePicker)
$Form.Controls.Add($Slabel)
$Form.Controls.Add($EDatePicker)
$Form.Controls.Add($ETimePicker)
$Form.Controls.Add($Elabel)
$Form.Controls.Add($OKButton)
$Form.Controls.Add($CancelButton)
$Form.Controls.Add($ALLButton)
$Form.Controls.Add($Clabel)
$Form.Controls.Add($CheckedBox)
# キーとボタンの関係
$Form.AcceptButton = $OKButton
$Form.CancelButton = $CancelButton
# 最前面に表示:する
$Form.Topmost = $True
# ALLボタンのマウスオーバーイベント
$ALLButton.Add_MouseHOver({$ATooltip.SetToolTip($ALLButton,"全期間で即時実行します")})
# チェックボックスラベルのマウスオーバーイベント
$CheckedBox.Add_MouseHOver({$CTooltip.SetToolTip($CheckedBox,"デフォルトはDescending Order(降順)です。`r`n変更する場合にチェックを付けて下さい。")})
# Formを表示
$result = $Form.ShowDialog()
if ( $result -eq "OK" )
{
# 開始日時を変数に代入
$sD = $SDatePicker.Text
$sT = $STimePicker.Text
$script:sDT = "$sD $sT"
# 終了日時を変数に代入
$eD = $EDatePicker.Text
$eT = $ETimePicker.Text
$script:eDT = "$eD $eT" + ":59"
echo "`n 開始:$sDT`n 終了:$eDT`n"
if ($order -eq ""){
if ($CheckedBox.Checked -eq "True") {
# Ascending Order(昇順)
AscendingO
}else{
# Descending Order(降順)
DescendingO
}
}else{
# Ascending Order(昇順)
AscendingO
}
}elseif ( $result -eq "Ignore" ){
# Interactive ALL Mode
# 開始日時を変数に代入
$script:sDT = (Get-Date -Day 1).AddMonths(0).AddDays(0).ToString("yyyy/MM/dd 00:00")
# 終了日時を変数に代入
$script:eDT = (Get-Date -Day 1).AddMonths(1).AddDays(-1).ToString("yyyy/MM/dd 23:59:59")
echo "`n 開始:$sDT`n 終了:$eDT`n"
if ($order -eq ""){
if ($CheckedBox.Checked -eq "True") {
# Ascending Order(昇順)
AscendingO
}else{
# Descending Order(降順)
DescendingO
}
}else{
# Ascending Order(昇順)
AscendingO
}
}else{
echo "キャンセルされました。"
}
}else{
# Silent Mode
# 開始日時を変数に代入
$script:sDT = (Get-Date -Day 1).AddMonths(0).AddDays(0).ToString("yyyy/MM/dd 00:00")
# 終了日時を変数に代入
$script:eDT = (Get-Date -Day 1).AddMonths(1).AddDays(-1).ToString("yyyy/MM/dd 23:59:59")
echo "`n 開始:$sDT`n 終了:$eDT`n"
if ($order -eq ""){
if ($CheckedBox.Checked -eq "True") {
# Ascending Order(昇順)
AscendingO
}else{
# Descending Order(降順)
DescendingO
}
}else{
# Ascending Order(昇順)
AscendingO
}
}
}else{
echo "`r`n -mode スイッチに無効な値 ${mode} が指定されました。`r`n`r`n Usage:`r`n $($env:THIS_PATH) {-mode ALL} {-order A}`r`n"
pause
exit 2
}
pause
まだやっていないので何とも言えませんが、日曜日にやってみますね🎶
遅い時間に済みません。
チョコチョコ更新をかけた都度、通知が行ってしまうのですよね?
Script処理では、EXCELと違い「💙」が「??」に文字化けしてしまうのですが、コマンドライン引数(スイッチ)や、Formで全期間の指定や、昇順への変更もできるようにしました(^^;
ネーム変更の1年縛りが解けるまで、まだあと7ケ月もあります😅
batファイルって比較的簡単に、いつまでも使えてるのがすごいですね🎶
ファイル名の一括変更やテキストの編集、ACCESS内で呼び出して連携とか、いまでも充分役に立ってます✨
BATは文字列操作系の繰り返し処理には便利ですよね?
コマンドラインであれば、GUIのログインセッションが無くてもWinRMを用いたRemoteからの実行もできる筈ですので、Ansibleや近頃流行りのRPA(UiPath Orchestrator等)からも使え、会社で使う方にとってはその点も便利だと思います♫
<【### 関数 ###】ブロック>
「cmd /C "cscript //nologo //E:JScript <格納場所>\browseIE.js https://king.mineo.jp/my/<ご自身のマイページ>/tips/"」
⇒「$s」に置換
<「### 処理本体 ###」ブロック>
先頭に以下のCodeを挿入。
$url = "https://king.mineo.jp/my/<ご自身のマイページ>/tips"
# シェルを取得/Internet Explorerの起動
$shell = New-Object -ComObject Shell.Application
$ie = New-Object -ComObject InternetExplorer.Application
# Internet Explorerを表示する。
$ie.Visible = $false
# HWNDを記憶
$hwnd = $ie.HWND
# $urlへ移動
$ie.Navigate($url, 4)
# ページが完全に切り替わるのを待つ
while ($ie.busy -or $ie.readystate -ne 4){
Start-Sleep -Milliseconds 100
}
while ($true){
# IE画面操作を行うためのドキュメントオブジェクト取得
$ie = $shell.windows() | ? {$_.HWND -eq $hwnd}
$doc = $ie.Document
# $searchが取得できたらループを抜ける
$search = $doc.getElementById("session_login")
if ($search -ne [System.DBNull]::Value){break}
Start-Sleep -Milliseconds 100
}
(~続き~)
# ID入力
$idElements = $doc.getElementById('session_login')
$idElements.value = '<ご自身のマイネ王アカウント>'
# パスワード入力
$passwdElements = $doc.getElementById('session_password')
$passwdElements.value = '<ご自身のパスワード>'
# ボタンクリック
$inputElements = $doc.getElementsByName('commit').item(0)
Foreach($inputElement in $inputElements) {
if ($inputElement.value -eq 'commit') {
$inputElement.click()
}
}
# ページが完全に切り替わるのを待つ
while (($ie.busy) -Or ($ie.readystate -ne 4)){
Start-Sleep -Milliseconds 100
}
$allParas = $ie.document.getElementsByTagName("td")
$tds = $allParas.length
[string]$script:s = ""
(~続き~)
for ($i=0; $i -lt $tds; $i++){
if ( ($i % 4) -eq 0 ) {
$s = $s + $allParas.item($i).outerText
} else {
$s = $s + "`t" + $allParas.item($i).outerText
}
if ( ($i % 4) -eq 3) {
$s = $s + "`n"
}
}
$s
$ie.navigate( "https://king.mineo.jp/logout?.done=https://king.mineo.jp/my/<ご自身のマイページ>/tips", 4 )
# ページが完全に切り替わるのを待つ
while (($ie.busy) -Or ($ie.readystate -ne 4)){
Start-Sleep -Milliseconds 100
}
$ie.Quit()