4.2K Views
May 27, 23
スライド概要
Teamsの投稿から OneDriveに添付 ファイルを一括ダウ ンロードするフロー おいしみ なりのPower 勉強方法について
自己紹介 { “DisplayName” : “おいしみ”, “ID” : “ksgiksg”, “Introduce” : [ おいしみ “今年から情シス1年生”, “前職は「プラントエンジニア」と、非IT職”, “社内ではPower PlatformをはじめDX推進の講師役として活動中”, “Qiitaでアウトプット始めてみました(主にPower Automate関連)” ], “ContentURL” : [ “Twitter” : https://twitter.com/ksgiksg, @ksgiksg “Qiita” : “https://qiita.com/ksgiksg” ] }
非IT職が市民開発者として成長したお話 ITに全く関係のない仕事をしていた人間が、 情シス・Power Platform の社内講師に転職した記念に、 僕が普段やってる勉強法(?)をお話しします。
今日ご紹介する内容 Teamsの投稿からOneDriveに添付ファイルを一括ダウンロードするフロー ✓ なくてもいいけど、あったら便利 ✓ 手作業に戻しても最悪困らない(手間だけど) ✓ 自分の実力で できそうで できなさそうで できそう フローの詳しい内容や解説はQiitaにて配信済みなので、 今日はこのフローを作成するにあたって行った、試行錯誤をお話しします。
デモ!
これを作ろうと思った背景
組織として自動化していい範囲 集団の中でアプリやフローを維持していくには、 どうしても下限を意識してレベルを合わせる必要がある。 複雑なフローは 運用しない方がいい 組織で運用していいレベル でも、それだとつまんない…(∵)
じゃあ、どうやって楽しむ? 引継ぎの問題 : 引き継がなければ問題ない メンテナンスの問題 : 自分の手の届く範囲なら問題ない 不具合による業務への影響 : 主たる業務に使わなければ影響は軽微 結論 別に自動化しなくても困らない、 自分のためだけの些細な問題を解決して遊ぶ!!
要件定義
まず、やりたいことの整理 いっぱい届いた添付ファイルを どこかにまとめて保存しておきたい。
まず、やりたいことの整理 送られてくる方法にはどんな種類がある? • 個人チャット • グループチャット • チャネルの親投稿 • チャネルの返信 全部できた方がいい!
まず、やりたいことの整理 ダウンロードしたファイルはどこに保存する? • OneDrive for Business • SharePoint Online • ローカルフォルダ 個人の領域であり 一番手軽なOneDriveに決定!
そもそも添付ファイルって何だ? 添付ファイルを追加しようとすると、いくつか選択肢が出てきます。 …ここでも分岐が必要そうですね。 ※画面はチャネルで投稿する場合 添付ファイルといいますが、投稿に直接ファイルを保持しているわけではありません。 OneDriveやSharePointに保存されたファイルへのリンクとして投稿されます。
テスト用のデータを作成 まずはInputとなるデータを用意しておきます。 とりあえず、最初はチャネルの親投稿として用意しました。
テストデータの詳細を取得する 最初は場合分けを考えず、これくらいのフローで十分です。 単純にチャネルの親投稿を取得してみて、データの中身を確認します。
実行結果 “attachments”の中に配列で 添付ファイルの情報が入っているようです。
実行結果
attachmentsから、結果を2つ取り出してみました。
{
"id": "CF25B2B1-D53B-42DF-BDC0-4E8590CB79DE",
"contentType": "reference",
"contentUrl": "https://v45dm-my.sharepoint.com/personal/kyunmina_v45dm_onmicrosoft_
"content": null,
OneDriveのURL
"name": "適当なファイル (2).pptx",
"thumbnailUrl": null,
"teamsAppId": null
},
{
"id": "3f129094-cd3b-40e1-a143-bd3952ccde9b",
"contentType": "reference",
"contentUrl": "https://v45dm.sharepoint.com/sites/ksgiksg/Shared Documents/標準チャネ
"content": null,
SharePointのURL
"name": "Book1.xlsx",
"thumbnailUrl": null,
"teamsAppId": null
}
パターンを書き出す ここまでで考えられるパターンを列挙してみます。 メッセージの詳細を取得 URLからファイルを取得 • 個人チャット • グループチャット • OneDriveのファイル • チャネルの親投稿 • SharePointのファイル OneDriveに保存 ✅ • チャネルの返信 4 × 2 = 8 パターンありそうですね。 Power Automate では分岐が多くなると、横に長い視認性の悪いフローに なってしまうので、できれば避けたいところ。。。
メッセージの詳細を取得
メッセージの詳細を取得 基本的には、トリガーのアウトプットにチャネルの情報が含まれているかで分岐します。
メッセージの詳細を取得 チャネルの情報が空の場合はグループチャットとして取得します。 この方法で、個人チャットも取得できます。
メッセージの詳細を取得 チャネルの情報が空でない場合は、チャネルの投稿として取得します。 “Parent message ID”を指定しておくことで、返信も取得できます。
メッセージの詳細を取得 さらに言うと、メッセージの種類をグループチャットにすることで、チャネルの投稿を 含む全てのメッセージが取得できます。 これでメッセージの詳細を取得するための分岐はなくなりました。
添付ファイルの取得
URLからファイルをコピーするには① URLがわかっていて、OneDriveにファイルを保存したいとなったとき 一番に思いついたのはこのアクションでした。
URLからファイルをコピーするには① しかし、試したところ403エラーで失敗。。。
URLからファイルをコピーするには① 調べたところ、認証の必要なファイルは取得できないようでした。 自分にアクセス権のあるファイルでもダメなんですね。。。 URL からアップロードする - OneDrive API - OneDrive dev center | Microsoft Learn ということで、1つ目の方法は断念(∵)
URLからファイルをコピーするには② 次に思いついたのがこのアクションでした。
URLからファイルをコピーするには② サイトのアドレスはいったん置いといて、ファイル識別子にIDを指定してみます。 こんな感じで設定して・・・実行! テスト取得したattachments
URLからファイルをコピーするには② ・・・が、ダメ! ファイルの存在が見つからないというエラーでした。
余談:Inputの形式を確認する フローの作成時、動的コンテンツでどのプロパティを指定したらいいかが わからなくなることありませんか? 特にこういうファイルピッカーで選択する項目…
余談:Inputの形式を確認する そういうときは、手動で適当にInputを埋めたあと 「・・・」メニューから「コードのプレビュー」を確認します!
余談:Inputの形式を確認する フローの作成時、動的コンテンツでどのプロパティを指定したらいいかが わからなくなることありませんか?特にこういうファイルピッカーで選択する項目…
URLからファイルをコピーするには③ 最後に思いついたのがこのアクションでした。 ファイルコンテンツを取得して、同じ中身のファイルを作成します。
URLからファイルをコピーするには③
ここでもう一度テストデータを観察してみます。
添付ファイルから取得できたこの情報の中から、ファイルを特定する必要があります。
{
"id": "3f129094-cd3b-40e1-a143-bd3952ccde9b",
"contentType": "reference",
"contentUrl": "https://v45dm.sharepoint.com/sites/ksgiksg/Shared Documents/標準チャネル/Book1.xlsx",
"content": null,
"name": "Book1.xlsx",
"thumbnailUrl": null,
"teamsAppId": null
}
使えそうなのは、“id”と“countentUrl”ですね。
さっきは“id”を試してうまくいかないかったので“countentUrl”に注目します。
URLからファイルをコピーするには③ contentUrl と アクションのインプットを比較します。 ・・・よく見ると、なんとなく似ていませんか? "contentUrl": "https://v45dm.sharepoint.com/sites/ksgiksg/Shared Documents/標準チャネル/Book1.xlsx" or
URLからファイルをコピーするには③ contentUrl の前半がサイトのアドレス、後半がファイルパスになっています。 “/”で区切ってうまく再編すれば何とかなりそうですね。
URLからファイルをコピーするには③ split,join,take,skipを使って、うまくテキスト処理を行います。 個人的に、Automateでのテキスト処理にはsplitを多用する印象があります。
URLからファイルをコピーするには③ いったんこれで実行してみましょう。OneDriveのファイルはケアできていませんが、 SharePointのファイルは取得できるはず。
URLからファイルをコピーするには③ あれ? なぜか成功しました・・・(∵)
SharePoint Online と OneDrive for Business 実は、この2つの土台は同じ仕組みが使われているようです。 参考: SharePoint Technical Notes : Microsoft Teams, OneDrive for Business と SharePoint をファイル管理するときにどう使い分けるか? (lekumo.biz) SharePointコネクタのアクションですが、 OneDriveのサイトのアドレスを指定して ファイルを取得できるようです!! これで分岐が必要なくなりました(∵)
完成!?
テストしまくる 基本的なところはできたので、いろいろなパターンでテスト実行を行います。 メッセージの詳細を取得 URLからファイルを取得 • 個人チャット • グループチャット • OneDriveのファイル • チャネルの親投稿 • SharePointのファイル OneDriveに保存 ✅ • チャネルの返信 少なくとも、この4 × 2 = 8 パターンは確認しておく必要がありますね(∵)
あれ?失敗... グループチャットのファイルがうまく取得できませんでした。
あれ?失敗... よく見ると、ファイル名にあたる部分が謎の文字列になっています。
Power Automate 謎の文字列ランキング この“%”が多用された文字列は、 よくわからん文字列ランキング上位のpercent-encodingです。 日本語ファイル名がURLとしてエンコードされてしまっているようです。 順位 形式 1st Odata_x... 2nd Base64 3rd percent-encoding
デコード (日本語に戻)して完成! Power Automate にこの文字列を復元する関数が用意されているので、 少しだけ修正してフローは完成です。 split(decodeUriComponent(item()?['contentUrl']), '/')
おわりに
まとめ • 自分の手の届く範囲でやってみたいことを楽しんでやってみる • テストデータを作ってデータ構造を観察することが大事 • 試行錯誤は無駄にはならない!!