自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

For文での線形探索より高速 VBAで連想配列 Dictionaryオブジェクト

以下のような検索キー列がユニークであるテーブルからデータを取得したい(VLOOKUPみたいなイメージ)場合、処理回数が多いと WorksheetFanction.Vlookup やFor文での線形探索では時間がかかり過ぎる。

そんなときに役立つのが連想配列(Dictionaryオブジェクト)。

配列のようにインデックス番号からデータを取り出すのではなくキーの完全一致で要素を取り出せるので、処理が理解しやすいかつ高速であることが最大の利点。

f:id:maru0014:20200912124247p:plain

 

続きを読む

タスクスケジューラのxmlをコマンドで直接編集してバッテリーモードでも実行させる

バッチファイルで自分自身をタスクスケジューラに登録して再起動後も実行させようと思っても「コンピューターを AC電源で使用している場合のみタスクを開始する(P)」という項目がONの場合はノートPCが電源に接続されていない状態だとタスクを実行してくれない。

しかし、タスクスケジューラを操作できる schtasks コマンドで変更可能な項目は限られており、この項目もコマンドでは変更不可能なためどうしたものかと調べていたらxmlを直接操作することで変更できたのでご紹介。


バッテリー駆動でもタスクを実行させる関数

function disableOnlyRunAc-Task($taskName){
    $taskXml = [xml](schtasks /query /tn $taskName /xml)
    $taskXml.Task.Settings.DisallowStartIfOnBatteries = "false"
    $taskXml.Save("C:\tempTask.xml")
    schtasks /delete /tn $taskName /f
    schtasks /create /tn $taskName /xml "C:\tempTask.xml"
    Remove-Item "C:\tempTask.xml"
}

# コンピューターをAC電源で使用している場合のみタスクを開始するを無効化
disableOnlyRunAc-Task "<タスク名>"

※管理者権限での実行が必要

※xmlの操作を楽にするためにPowerShellを使用

続きを読む

自宅で開発・導入しているIoT機器や機能を晒してみる

多分生まれつきとにかく楽をしたい気持ちが強いが、GoogleアシスタントとAlexaなどの音声アシスタント、超小型の低消費電力コンピュータのRaspberry Pi、便利なIoTデバイスの登場がそれに拍車をかけた。

もしかしたら誰かの参考になるかもしれないので晒してみる。

  • 自動でSlackへ通知→GoogleHomeで読み上げ
    • お父さんが会社から出たらSlackへ通知→GoogleHomeで読み上げ
    • お父さんが自宅の半径100m以内に入ったらSlackへ通知→GoogleHomeで読み上げ
    • Slackへ定時投稿→GoogleHomeで読み上げ
  • スマートロック
  • Googleアシスタントコマンド
  • ペアレンタルコントロール
  • Raspberry Pi で作っている省電力サーバたち
  • スマート家電コントローラー(アプリ、Googleアシスタント、Alexaから操作可能)
  • GAS、スプレッドシート
  • 今後作りたいもの
続きを読む

New-DistributionGroup のMembers引数に配列を渡したいときはハッシュテーブルスプラッティング

Invoke-CommandInvoke-Expression なども考えられるが、今回の例に最も適しているであろう「スプラッティング」という方法を用いる。

実装例

以下のようなCSVをもとに配布リストの作成とメンバーの登録を同時に実行したいとする。

"address","members"
"sample1@codelife.cafe","alice@codelife.cafe,bob@codelife.cafe"
"sample2@codelife.cafe","alice@codelife.cafe,bob@codelife.cafe"

membersが一つの文字列として認識されてしまうパターン

これでいけると思いきや alice@codelife.cafe,bob@codelife.cafe というアドレスは存在しないとエラーが発生する。

$groups = Import-Csv "sample.csv"
foreach($group in $groups)
{
    New-DistributionGroup $group.Address $group.member
}
続きを読む

Slackのログ(JSONファイル)をExcel PowerQuery だけでなるべく楽に解析

Slackのログを分析するときは管理画面から一括ダウンロードするのが早い。しかし、出てくるデータはチャンネルごとにフォルダがバラバラかつ日付ごとにバラバラのJSONファイルとして出てくる。

CSVならあまり頭を使わなくてもそのまま開いたり、日付ごとのファイルでもbatで統合するなりすればいいがJSONファイルをExcelで扱うにはPowerQueryが最適VBA-JSONを使う手もあるが、初心者向けではない。


手順概要

  1. Slackからごそっとデータをダウンロード
  2. ZIPファイルを解凍
  3. Excel のデータタブでデータの取得→ファイルから→フォルダから
  4. 自動生成された関数を手直し
  5. シートに読み込む

 

1. Slackからごそっとデータをダウンロード

Slackの管理画面https://<ワークスペース名>.slack.com/admin/settings にアクセスし、画面右上の「データのインポート/エクスポート」をクリック。

f:id:maru0014:20200912123159p:plain  

続きを読む