GASでメール本文から銀行口座の情報をゲットする(自分用)

自分用トリアーエズ
正規表現とかかなり怪しい(例外のほうが多いかも)

色々試して大丈夫そうなら、いずれちゃんと記事に。。。なるかなあ

BankCode API使用
https://bankcode-api.appspot.com/

var mySpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var mailSheet = mySpreadSheet.getSheetByName('メール');
var infoSheet = mySpreadSheet.getSheetByName('口座情報');

function screeningMailData(){
  var len = mailSheet.getLastRow();
  var range = mailSheet.getRange(2,1,len,5);
  var values = range.getValues();
  var newValues = [];
  var cnt = -1;
  var mailBodyCol = 4;

  for(var i=0;i<len;i++){
    var mailStr = values[i][mailBodyCol - 1];
    var codeNumStr = getCodeNumStr(mailStr);
    if(codeNumStr!=''){
      cnt++;
      newValues[cnt] = [];
      newValues[cnt] = values[i];
      
      var bankName = getBankName(mailStr);
      newValues[cnt][5] = bankName;      
      newValues[cnt][6] = getBankCode(bankName);
    
      var branchName = getBranchName(mailStr);
      newValues[cnt][7] = branchName;   
      newValues[cnt][8] = getBranchCode(newValues[cnt][6], branchName);
      
      newValues[cnt][9] = codeNumStr;
      newValues[cnt][10] = getKatakanaName(mailStr);
    }
 }      
  infoSheet.getRange(2,1,cnt + 1,newValues[1].length).setValues(newValues);  
}

//口座番号
function getCodeNumStr(mailStr){
  var re = /\d{7}/;
  var myArray = mailStr.match(re);
  if (myArray == null){
    return '';
  }
  return myArray[0];
}

//銀行名
function getBankName(mailStr){
  var re = /\n.{1,5}銀行/;
  var myArray = mailStr.match(re);
  if (myArray == null){
    return '';
  }
  var str =  myArray[0];
  str  = str.replace(/\r?\n/g, '');  //改行を消去
  return str ;
}

//銀行コード
function getBankCode(bankName){
  bankName = bankName.replace('銀行','');
  var url = 'https://bankcode-api.appspot.com/api/bank/JP?name=' + bankName;
  Utilities.sleep(1000);  //短時間に何度もアクセスしないように
  try{
    var response = UrlFetchApp.fetch(url);
    var content = response.getContentText('UTF-8');
    var obj = JSON.parse(content);
    var info = obj['data'][0]['code'];
  }catch(e){
    return '';
  }
  return info;
}

//支店名
function getBranchName(mailStr){
  var re = /[^  ))\n]{1,5}支店/;
  var myArray = mailStr.match(re);
  if (myArray == null){
    return '';
  }
  return myArray[0];
}

//支店コード
function getBranchCode(bankCode, branchName){
  if (bankCode=='' || branchName==''){    
    return '';
  }
  branchName = branchName.replace('支店','');
  var url = 'https://bankcode-api.appspot.com/api/bank/JP/' + bankCode + '?name=' + branchName;
  Utilities.sleep(1000);  //短時間に何度もアクセスしないように
  try{
    var response = UrlFetchApp.fetch(url);
    var content = response.getContentText('UTF-8');
    var obj = JSON.parse(content);
    var info = obj['data'][0]['code'];
  }catch(e){
    return '';
  }
  return info;
}

//口座名義
function getKatakanaName(mailStr){
  var re = /[ァ-ヴ]{1,10}\x20[ァ-ヴ]{1,10}/;
  var myArray = mailStr.match(re);
  if (myArray == null){
    return '';
  }
  return myArray[0];
}

VBAでこんなことできます_その1 フォルダ作成

イントロ

どうもinageです。
最近はRPAとかを中心に業務自動化であれこれやっております。

RPAとかGASとかIFTTTとか、手作業でやっていたことを自動化できる仕組みが色々あって、便利な世の中ですね。

たまに理解のある現場だと「VBAで良くないっすか」という意見が通ったり、運が良いと「じゃあちょっと教えてよ」と言われることもあって嬉しい限りです。

そんな時、「VBAでこんなことできます」ととりあえず見せて「おー」と言ってもらいたい。

何も準備がない時にすぐに見せられるものがあればいいな、ということで久しぶりにこのブログを思い出しました。

あんまり見せられるものがない。。。

簡単なもので、どんなことができるかわかるようなものをほぼ自分のためにいくつか上げていきたいとおもいます。

どんなマクロ

フォルダを選択して、その配下にサブフォルダを一括で作ります。

f:id:vba-belle-equipe:20190710114928p:plain
フォルダ作成マクロ

使い方

1)フォルダ選択ボタン-> フォルダを選択する
2)B7以下に作りたいサブフォルダ名を入力していく
3)フォルダ作成ボタンを押す

コード

Option Explicit

Sub フォルダ選択()
    Dim r As Range
    Set r = Sheets(1).Range("B2")
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        .InitialFileName = ActiveWorkbook.Path
        If .Show = True Then
            r = .SelectedItems(1)
        End If
    End With
End Sub

Sub フォルダ作成()
    Dim rootPath As String
    Dim i As Long
    Dim maxRow As Long
    Dim folderName As String
    Dim fullPath As String
    Const startRow = 7
    
    rootPath = Range("B2")
    If Dir(rootPath, vbDirectory) = "" Then
        MsgBox "フォルダを選択してください"
        End
    End If
    
    maxRow = Cells(Rows.Count, 2).End(xlUp).Row
    If maxRow < startRow Then
        MsgBox "サブフォルダ名をB列に1つ以上入れてください"
        End
    End If
    
    For i = startRow To maxRow
        folderName = Cells(i, 2)
        fullPath = rootPath & "¥" & folderName
    '    Debug.Print i & "_" & fullPath
        If Dir(fullPath, vbDirectory) = "" Then
            MkDir fullPath
        End If
    Next
    
End Sub

ファイルのダウンロード

フォルダ作成01.xlsm - Google ドライブ

上記リンク先からダウンロードしてください。

できなかったらゴメンナサイ。

諸注意

Windowsで動作します
・デモ用なので、エラー処理とかちゃんとやってません
・自由に使っていただいて構いませんが、自己責任でお願いします
・バナナはおやつに入りません

ASUSのMEMOPADが反応しなくなったのでとりあえずFireタブレットでLineができるようになれ

イントロ

愛用のASUS ME173タブレットが2度目の反抗期(電源が入らない。反応しない)に入り、前回は色々調べて

タブレットの電源が入らない!ASUS MeMO Padを強引に蘇生させた方法 | 伊東制作所

こんな感じのことをして回復したのですが、今回は何度やっても反応がない。



で、手元にあるFireタブレットでとりあえずLineだけでも復活させたいなと。

androidlover.net


こちらのページをとても参考にさせていただきました。

ただし自分の環境のせいか、何か変わったのか、一部うまくいかなかったのでその記録。

・Windows10 Home
・Fire タブレット 8GB、ブラック(第5世代)

Fire タブレット 8GB、ブラック(第5世代)

Fire タブレット 8GB、ブラック(第5世代)

Lineゲットまでの手順

Lineはamazonのアプリストアにないので、

  1. FireをUsbでつないでPCから色々できるようにする(ドライバ入れたりデバッグできるように設定したり)
  2. FireにGoogle Playストアを入れる
  3. Google PlayストアからLineとか入れる

という手順を踏む必要があります。


うまくいかなかったところ

androidlover.net
Google USB Driver をインストールしても Android ADB Interface として認識されない。

解決策

developer.amazon.com

どうやってたどり着いたか忘れましたが、上の本家amazonのページにKindle Fire 用のusbドライバーへのリンクがあります。
(ちなみに、日本語ページには無さそう。why?)

https://s3.amazonaws.com/android-sdk-manager/redist/kindle_fire_usb_driver.zipというところ


バイスマネージャーでFireを一旦削除してから解凍した

[Fire_Devices ADB drivers.exe]

を実行して、接続しなおすと

f:id:vba-belle-equipe:20170725105618p:plain

こんな感じで、認識されました。



ADBとして認識されたあとは、参考ページのとおりにやってGoogle Playストアがインストール完了。
androidlover.net
改めまして、お世話になりました。

f:id:vba-belle-equipe:20170725111151p:plain

大事なこと

JSO(自己責任でお願いします)

VBAを使ってロト6のデータを形にする その3

はじめに

前回、

vba-belle-equipe.hatenablog.com


「ボーナス数字」と「連続ハズレ回数」を出すところまでいきました。
今回は連続でハズレた回数の履歴をつけていきたいと思います。

「結果」シート

f:id:vba-belle-equipe:20161208145251p:plain

変わりません。

「メイン」シート

f:id:vba-belle-equipe:20161219111421p:plain

連続ハズレ回数を記録する列が増えています。
※回数はどこまでも伸びる可能性がありますが、とりあえず40回以上は一くくりにしてみました。

コード

こんな感じになりました。

Sub 更新()
  Dim startnum As Long, endnum As Long
  Dim i As Long, j As Long
  Dim hit(1 To 43) As Long
  Dim bonus(1 To 43) As Long
  Dim nohit(1 To 43) As Long
  Dim renzoku(1 To 43, 0 To 40) As Long
  Dim num As Long, num2 As Long
  
  With Sheets("メイン")
    startnum = .Range("C1")
    endnum = .Range("C2")
    .Range("C3") = endnum - startnum + 1
  End With
  
  With Sheets("結果")
    For i = startnum + 1 To endnum + 1
      '連続ハズレ
      For j = 1 To 43
        nohit(j) = nohit(j) + 1
      Next
    
      '本数字(当たり処理)
      For j = 2 To 7
        num = .Cells(i, j)
        hit(num) = hit(num) + 1
        
        '連続ハズレ調整
        nohit(num) = nohit(num) - 1
        If nohit(num) > 40 Then
          nohit(num) = 40
        End If
        renzoku(num, nohit(num)) = renzoku(num, nohit(num)) + 1
        
        nohit(num) = 0  'ハズレリセット
      Next j
      
      'ボーナス数字
      num = .Cells(i, 8)
      bonus(num) = bonus(num) + 1
    Next i
  End With
  
  For i = 6 To 48
    Cells(i, 3) = hit(i - 5)  '当選回数
    Cells(i, 4) = bonus(i - 5)  'BONUS
    Cells(i, 5) = nohit(i - 5)  '連続ハズレ
    
    '連続ハズレ過去回数
    For j = 7 To 46
      Cells(i, j) = renzoku(i - 5, j - 7)
    Next j
  Next i
  
End Sub

連続ハズレ回数の履歴

連続ハズレ回数(現在進行形)を

Dim nohit(1 To 43) As Long

という配列に入れるのは前回と同じです。
(当たったら、0にリセットされる)


加えて今回は、各数字と連続ハズレ回数の情報を持たせるために

Dim renzoku(1 To 43, 0 To 40) As Long

という2次元配列を使っています。

f:id:vba-belle-equipe:20161219104804p:plain

こういう表のイメージです。

「1 To 43」の部分で各数字ごとに行を作り、「0 To 40」で回数ごとの列を作っているという感じでしょうか。

結果

f:id:vba-belle-equipe:20161219105613p:plain

こんなん出ました~
(ごちゃごちゃしすぎるので、下のほうは割愛しています)


考察

連続40回ハズレというのはどれくらいの確率でしょうか。

1回ハズレる確率は、37/43で、およそ86%です。

それが40回連続ともなると、0.25%くらい。


しかし、40回以上連続のハズレは、ロト6の歴史で20回以上出現しているようです。
そこまで珍しいことではないみたいですね。



では、連続で外れているという情報を次に買う際の根拠としてよいか。

難しいところです。

絶対に雨が降る雨ごい

と同じように、買い続ければいずれはその数字が当たると思いますが、

問題は

一緒に当たる数字が何なのかわからん

ということですよね。


方法をご存じの方がいたら是非ともご連絡ください。


参考

ロト6長期的分析データ

結果の答え合わせに、参考にさせていただきました。

VBAを使ってロト6のデータを形にする その2

はじめに

前回、

vba-belle-equipe.hatenablog.com

本数字の当り回数を43の数字それぞれでカウントし、表示するところまでいきました。
今回は「ボーナス数字」と「連続ハズレ回数」を出してみます。

コード

こんな感じになりました。

Sub 更新()
  Dim startnum As Long, endnum As Long
  Dim i As Long, j As Long
  Dim hit(1 To 43) As Long
  Dim bonus(1 To 43) As Long
  Dim nohit(1 To 43) As Long
  Dim num As Long
  
  With Sheets("メイン")
    startnum = .Range("C1")
    endnum = .Range("C2")
    .Range("C3") = endnum - startnum + 1
  End With
  
  With Sheets("結果")
    For i = startnum + 1 To endnum + 1
      '連続ハズレ
      For j = 1 To 43
        nohit(j) = nohit(j) + 1
      Next
    
      '本数字
      For j = 2 To 7
        num = .Cells(i, j)
        hit(num) = hit(num) + 1
        nohit(num) = 0  'ハズレリセット
      Next j
      
      'ボーナス数字
      num = .Cells(i, 8)
      bonus(num) = bonus(num) + 1
    Next i
  End With
  
  For i = 6 To 48
    Cells(i, 3) = hit(i - 5)
    Cells(i, 4) = bonus(i - 5)
    Cells(i, 5) = nohit(i - 5)
  Next
  
End Sub

ボーナス数字

単純に

Dim bonus(1 To 43) As Long

と新しい配列を作って、カウントしています。

連続ハズレ回数

こちらは

Dim nohit(1 To 43) As Long

という配列を作り

  • For文の「i」が増える(= 「回」を重ねる)ごとに連続ハズレ回数が1回ずつ増えていく
  • ただし、当たったらその数字のカウントはゼロになる

というふうにしています。

結果

f:id:vba-belle-equipe:20161211174629p:plain

こんな感じです。

27回連続とか、なかなかハズレとんなという感じですが、どうなんでしょうか。
その辺の統計を次回はとってみたいと思います。