掲示板

ScriptでのTips集計【sample】

execute.jpg

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


##################

execute.jpg

◆修正版①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


7 件のコメント
1 - 7 / 7
少しずつ改良されてますね😄
まだやっていないので何とも言えませんが、日曜日にやってみますね🎶
永芳
永芳さん・投稿者
SGマスタ
💙HONOKA💙 さん

遅い時間に済みません。
チョコチョコ更新をかけた都度、通知が行ってしまうのですよね?

Script処理では、EXCELと違い「💙」が「??」に文字化けしてしまうのですが、コマンドライン引数(スイッチ)や、Formで全期間の指定や、昇順への変更もできるようにしました(^^;
ハートいりませんから(笑)

ネーム変更の1年縛りが解けるまで、まだあと7ケ月もあります😅

batファイルって比較的簡単に、いつまでも使えてるのがすごいですね🎶
ファイル名の一括変更やテキストの編集、ACCESS内で呼び出して連携とか、いまでも充分役に立ってます✨
永芳
永芳さん・投稿者
SGマスタ
💙HONOKA💙 さん

BATは文字列操作系の繰り返し処理には便利ですよね?

コマンドラインであれば、GUIのログインセッションが無くてもWinRMを用いたRemoteからの実行もできる筈ですので、Ansibleや近頃流行りのRPA(UiPath Orchestrator等)からも使え、会社で使う方にとってはその点も便利だと思います♫
永芳
永芳さん・投稿者
SGマスタ
◆browseIE.bat(修正版②のbrowseIE.js不要版)[No.1]

<【### 関数 ###】ブロック>
「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
}
永芳
永芳さん・投稿者
SGマスタ
◆browseIE.bat(修正版②のbrowseIE.js不要版)[No.2]
(~続き~)

# 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 = ""
永芳
永芳さん・投稿者
SGマスタ
◆browseIE.bat(修正版②のbrowseIE.js不要版)[No.3]
(~続き~)

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()
コメントするには、ログインまたはメンバー登録(無料)が必要です。