ごきげんよう、百合宮桜(Miyu)です。
今回はあの頃に Play Back,Play Back✨(昭和に浸りたい方はあの歌姫の声でどうぞ!)
昔やっていた業務を Power Automate で自動化できるか試してみようと思います。今回は何度もあると地味に面倒で後回しにしがちな Zip ファイルの解凍と保存 がテーマです。
ユースケース
私が製造業で事務職をしていた頃、営業マンから取引先で採用された製品の資料(陳列された時の写真や売上情報のExcelなど)を頂き、採用理由やら売上効果やらを添えた1枚絵の資料を PowerPoint で作って、全社に共有するという業務がありました。みんな大好き 事例共有 というやつですね(*'▽')
昔ながらの超絶古風企業ですので、ファイルサイズが大きくなりがちな写真はメールに Zipファイル で添付して送るのが慣例です。
しかし Zip ファイルを解凍&展開して、SharePoint(クラウドストレージ)に保存するという作業は地味に面倒です。なのでひとまず メールが届く→Zipを自動で解凍&保存→Teamsに通知 というフローを Power Automate で作ってみました💛
本稿は以下の条件でのみ動作します。ご注意ください。
1. Zip ファイルは パスワードなし!
パスワード付きZipファイルは 対象外 です。パスワードなしの Zip ファイルでのみ検証しています。
2. Zip ファイルのサイズは最大 50MB 、解凍時のファイル数が 100ファイルまで!
これらは Microsoft Learn に書かれている最大サイズとファイル数の上限ですので、どちらかを超過すると動かない可能性があります。
3. Outlook メールの添付ファイルの最大サイズは1ファイルあたり 50MB もしくは Excharge 管理者が設定した上限のどちらか小さい方が上限
どちらが小さいかはテナントによって異なります。必ずフローを実行する環境でテストしてください。
フローの概要
今回のフローはメールに添付されているのは Zip ファイルのみ という前提です。
メールが来たのをトリガーにフローが実行されます。
フローで実行される処理は大きく分けて5つです。
- メールに添付された Zip ファイルの取得
- Zip ファイルを SharePoint のドキュメントライブラリに保存→解凍
- 解凍したフォルダのリンクを取得
- 2 で作った Zip ファイルを削除(解凍したフォルダは残す)
- 3 で取得したリンクを Teams で送信
Teams には解凍されたフォルダーのリンクが通知されます。
メールに添付された Zip ファイルの取得
トリガーについて
詳細パラメーターで「添付ファイル付きのみ」を はい にして、添付ファイル付きのメールでだけフローを実行するように制御します。
変数 FolderName について
3 で利用する SharePoint コネクタの ファイルの取得(プロパティのみ) アクションは指定したドキュメントライブラリのファイルを 複数取得できる アクションです。
しかし今回は メールに添付された Zip ファイルを解凍したフォルダー だけを取得したいので、フィルタークエリを利用して 1つに絞り込み ます。そのフィルタークエリの検索キーを格納するのに利用する変数が FolderName です。
For each の中では変数の初期化アクションは利用できないので、ここに設置しています。
メールに添付されているファイルの取得する
添付ファイルが複数ある場合は1個ずつ処理することになるので、ここは For each が自動でついてきます。
Zip ファイルを SharePoint のドキュメントライブラリに保存→解凍
添付ファイル1個ずつやっていく処理なので、For each の中に入れ込みます。
Zip ファイルを保存する
メールに添付された Zip ファイルをそのまま解凍することはできず、SharePoint のドキュメントライブラリに保存して解凍する必要があります。その為、SharePoint コネクタの ファイルの作成 アクションでメールに添付されている Zip ファイルをドキュメントライブラリに保存します。
Zip ファイルを解凍する
ファイルの作成アクションでドキュメントライブラリに保存した Zip ファイルを SharePoint コネクタの フォルダーの展開 アクションで解凍します。この時に Zip ファイルの保存先(ソースファイルのパス)と解凍先(宛先フォルダーパス)は 同一の SharePoint サイト内 である必要があります。
宛先フォルダーパスで指定したフォルダー(ドキュメントライブラリ)に他にもファイルがあり、フローの実行でフォルダーを追加していく場合は 上書きフラグを「はい」 にします。
解凍したフォルダのリンクを取得
変数 FolderName の設定
変数「FolderNeme」に SharePoint コネクタの ファイルの取得(プロパティのみ) のフィルタークエリで利用する検索キーを格納します。
split(outputs('ファイルの作成')?['body/Name'], '.')[0]
2 で作った Zip ファイルの名前を Split 関数 を使って .(ドット) で分割し、配列化しました。
| 要素番号 | 値 | 備考 |
|---|---|---|
| 0 | Bento_Sample | Zip ファイルの名称 |
| 1 | zip | . 以降の拡張子 |
その中で 0 番目の値を取ってくるという処理なので、上記テーブルの要素番号列が 0 の値が取得できるというイメージです。
解凍したファイルのリンクを取得する
前述した フォルダーの展開 アクションは Zip ファイルを解凍し、ドキュメントライブラリに保存しますが、解凍したフォルダーのリンクは取得できません。そこで SharePoint コネクタの ファイルの取得(プロパティのみ) アクションで、改めて解凍したフォルダーを検索し、リンクを取得する必要があります。
フォルダーの名称で検索するには FileLeafRef 列を利用します。検索キーは変数FolderName に入っているので、フィルタークエリの式は以下のようになります。
FileLeafRef eq '@{variables('FolderName')}'
FileLeafRef はファイル名を格納する列の内部名です。この列では Excel や Word など拡張子のつくファイルは「Text.docx」のように拡張子まで入った状態で格納されます。
2 で作った Zip ファイルを削除
必要なのは解凍したフォルダーだけで、Zip ファイル自体は不要なのでドキュメントライブラリから削除します。Zip ファイルの削除は SharePoint コネクタの ファイルの削除 アクションで実現できます。
ファイル識別子は ファイルの作成 アクションで取得できる Id を利用します。
3 で取得したリンクを Teams で送信
Teams コネクタの チャットまたはチャネルでメッセージを投稿する アクションでリンクを送信します。フォルダーの URL をメッセージにそのまま入れ込むだけだと、テキストとして処理されてしまいます。
これだとクリックしてブラウザーで開くことができないので、HTML タグで ハイパーリンク化 したものを埋め込みます。
HTML タグとフォルダーのURLを Concat 関数で結合しています。フォルダーのURL は ファイルの取得(プロパティのみ) アクションから取得できますが、単一データでも出力は配列です。その為 First 関数 で オブジェクト化 させることで For each の追加を防いでいます。
concat(
'<a href="', first(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])?['{Link}'],
'">',
variables('FolderName'),
'</a>'
)
例ではフローボットとして個人宛に送信していますが、Teams のチーム に送信することも可能です。
これでフローを実行すると以下のような通知が届き、リンクをクリックすると Zip ファイルを解凍したフォルダーが開きます。
まとめ
Zip ファイルの解凍→保存というような すぐに終わるけど面倒でやりたくない 作業は自動化効果が大きいです。 Power Automate でこうした小さな面倒事を取り除くことで、気持ちに余裕が生まれ、作業の初動が速くなります。
その結果、事例共有資料の作成という 価値を生む 業務にも早く取り掛かることができ、全体の業務スピードも向上します。
このような小さな改善の積み重ねが、大きな生産性アップ や 働きやすい職場作り の一助になりますのでぜひ積極的に取り組んでみてください。













