最近、Microsoft の Power Automate とか、 ExcelScript とかばかり触っている。 業務でガッツリと、ではなく、業務の合間の空いている時間を使ってだけど。

それもこれも、お仕事のチャット製品が Slack から Microsoft Teams へ移行したためだ。 今や職場は SharePoint, Teams, OneDrive, Office365 等々と Microsoft 製品で溢れている。 ベンダーロックインされている感もあるが、別に悪いことじゃない。 いろんなものが上手いこと絡み合って楽になっている面もある。

ということで、まぁ割と満足している。

タスク管理

ただ、問題は、MS製品への歩み寄りと同時期にチームのリーダーが代わったことだ。 就職して4年目くらいだと聞いた。割と若い人だ。(フルリモートなので会ったことはない)

慣れない現場で苦労しているのだろう。 前リーダーとの引き継ぎ期間が2ヶ月ほどあったはずだが……。 チャットへ1日何も書き込みがなかったり、タスク管理をしてくれている雰囲気がなかったりするが、リーダー陣内の上位層のみが知る仕事があって、それをしているに違いない。

タスク管理してくれないのは仕方ない。仕方ないのだ。 仕方ないので、自分の身を守るためにチームのタスク管理をすることにした。

大規模なツールは要らないので、Microsoft Planner を採用。

規定では各種通知がメールで来る。が、Teams通知があると、そこを議論のきっかけにしやすい。 Power Automateで作ることにする。

  • 新着タスク
  • 完了タスク
  • 毎朝、仕掛中および今日期限のタスクと期限切れタスクの通知
    • 「進捗どうですか?」と一つずつ聞くなんてまっぴらごめんなので自動化
    • アサインされたメンバーへメンション付きでガンガン投稿

上記3つを作った。 Power Automateのコード入力欄の狭さに苦労したり、日付周りがUTCの10:00になっていて絶妙に扱いにくいところに苦労した。

作り終わって1〜2週間ほど経ち、早速、期限切れタスクが発生。蓋を開けたらリーダーが終わってなかった。 という事件もありつつ、なんとか回り始めたかなというところ。

アラート通知

管理対象サーバーからのアラートがメールで飛んでくる。 これもTeamsチャンネルに投稿を自動化させた。

絶賛進化中。

Ver 1.0

  1. Office365 Outlookの新着メールをトリガーに、
  2. HTMLメールをパース
  3. 各種項目をオブジェクト化
    • インシデント番号
    • 発生日時
    • 対象ノード
    • メッセージ
    • クラス(アラートの種類。ログだとかプロセスだとかディスクだとか)
  4. Teamsへ通知

Ver 2.0

過去アラートの分析ができるように、ログ的に記録したほうが良いと気付く。

  • SharePoint 上に Excel ファイルと各項目の列を持つ空テーブルを作成
  • テーブル追加する PowerAutomate タスクを追加

Ver 3.0

通知がたくさん来て五月蝿いことに気付いた。 根本的な対策は追々するとして、とりあえず通知しないアラートの振り分けをしたくなった。

が、気軽に正規表現で〜と考えていたがPowerAutomateに正規表現マッチングはなかったorz

ググって見つけたのが、Excel Online で「自動化」メニューからコードを書いて、それを PoserAutomate からキックする方法。 何この七面倒臭い方法は?と思いつつ試してみたら、景色が180度変わった。 ExcelScript もしくは OfficeScript (どっち?) という TypeScript ベースのスクリプトだった。 VBA を全く書けない(勉強する気がない)ので「Excelのコード…げぇ」となっていたが、俄然やる気が出た。 TypeScript ならちょうど Deno とかで遊んでたのである程度分かる。元々 JavaScripter だったし。

Excel Online上からも補完が効いたりして良い感じ。良い感じだが、やはり好きなエディタで書きたい。

  • VSCode や Vim で書けるように ExcelScript のインタフェース定義を *.d.ts に落とし込む (完全に趣味に走ってしまった。業務時間外に作ったものだから許して)
  • Ver 2.0で作ったアラート一覧Excelに無視対象アラートのシートを追加
    • メッセージ等は正規表現で記載
  • ExcelScript で無視対象アラートの一覧を取得し、マッチしたものがあったら true を返すようなコードを作成

こんな感じ。