はじめに
Power Automate はじめの一歩によく使われるForms ですが、このForms を利用すると、単なるアンケートだけではなく、ファイルを提出してもらうことが出来ます。
しかし、提出できるファイルの種類には、いくらかの制限があります。
特に個人的には、CSVファイルなどのテキストファイルや、ZIPファイルの受け取りができないことに不便を感じたので、今回はそれを何とかするフローを考えてみました。
フローの流れ
このフォームには、追加のファイルがある場合のチェックボックスを設けております。
フォームからの投稿があれば、投稿者にメッセージを返しますが、このチェックが入っている場合のみ、ファイルのアップロード用のリンクをつけてメッセージを送ります。
このアップロード用のURLは、SharePointのファイルの要求機能を使っています。
ある程度時間が経ったら、追加のアップロードが終わったとみなして、どんな回答が来たかを自分に通知します。
事前設定
前述の通り、ファイルの追加アップロードには、SharePointのファイルの要求機能を使用しています。
この機能を使うためには、テナントの設定として、機能が有効になっている必要があります。
通常の操作で、フォルダの右メニュー内に「ファイルを要求する」が表示されていればOKです。
表示されていない場合は、組織の管理者に機能を有効にしてもらいましょう。
共有範囲の設定を変更する必要があるため、組織の規定によっては、この機能を使用することが出来ないことがあります。
フォームの用意
- 所属を示す項目
- ファイルのアップロード
- 追加のファイルの有無
追加ファイルの有無は、チェックボックスを設けています。
選択肢形式の質問で、選択肢を一つだけにし、複数回答オプションをオンにすることでチェックボックスが作れます。
このとき、必須オプションをオンにすると、チェックが外せなくなるので注意してください。
フローの解説
基本的なFormsを使った部分については割愛して、ファイルの追加アップロードにかかわる部分のみを解説します。
フォルダの作成
ファイルの要求をするために回答ごとに固有のフォルダを作成する必要があります。
Forms の添付ファイルが格納される、質問ごとの固有のフォルダを使う方法もありますが、追加でアップロードされたファイルがどの回答に紐つくものなのかを特定することが困難になってしまいます。
そのため、フォームの回答IDを使って、重複しないような固有のフォルダを作成します。
せっかくフォルダを作るということで、ついでに所属ごとにフォルダ分けしました。
ここで作成したフォルダに、追加のファイルをアップロードしてもらうよう依頼します。
追加ファイルがあるか?(条件)
チェックが入っていない場合、この質問の動的なコンテンツが空になりますので、empty
関数でチェックができます。
チェックが入っていない場合は空=empty
関数の結果がtrueになるので、このように判定しました。
ファイルのアップロードURLの作成
先の質問で追加のファイルがある場合のみ、アップロード用のリンクを作成して送付します。
SharePointのファイルの要求を行うのですが、Power Automate の標準コネクタではこの機能が用意されておりません。
そのため、SharePoint に HTTP 要求を送信します
アクションを使用します。
方法については、コルネさんの解説が詳しかったので、参考にさせてもらいました。
不要なプロパティを指定していなかったり、ちょこちょこ値を変えているので、変更部分のみ解説します。
- allowAnonymousAccess
誰でも回答可能かどうかを指定するプロパティです。
true
にすると組織外のユーザーからもアップロードできるリンクになりますが、今回は社内ユーザーを想定しているため、false
にしました。
- expiration
リンクの有効期限を指定するプロパティです。
手動でリンクを発行するときには指定できないようですが、APIからは指定できました。
有効期限なしで開放しっぱなしにしてしまうのも管理が面倒なので、回答のあった日だけ有効になるように、以下の関数で次の日を期限にしています。
addDays(
utcNow(),
1,
'yyyy-MM-ddTHH:mm:ssZ'
)
分単位・時間単位の指定ができればよかったのですが、日単位での指定のみが可能なようです。
- description
リンクを開いたときの説明文を指定するプロパティです。
動的なコンテンツを利用してそれっぽい感じに仕上げています。
投稿者への通知
リンクを作成したら、それを投稿者へ送ります。
メッセージにリンクを付けておいて、
<a href="@{body('SharePoint_に_HTTP_要求を送信します')?['d']?['ShareLink']?['sharingLinkInfo']?['Url']}">追加ファイルのアップロード用リンク</a>
投稿者にTeamsでメッセージを送ります。
アップロードのための待機時間
有効期限が日単位でしかできなかったので、本当は10分間のみ有効にしたかったのですが、ごまかしてユーザーに対する通知として時間制限を行っています。
(リンクのDELETE方法を誰か教えてください🙏)
フローの方でも、10分間の待機を行っています。
アップロードされたファイルの取得
10分間の待機ののち、追加のファイルがフォルダに保存された前提でファイルの取得を行います。
もともとFormsで添付されたファイルも、作成したフォルダに移動しておきます。
Forms から直接アップロードしたファイルも、追加でアップロードしたファイルも同じフォルダに格納された状態です。
そのファイルの一覧をファイルの取得 (プロパティのみ)
アクションで、フォルダを制限することで取得します。
取得したファイルの一覧を、データ操作系のアクションを使って、いい感じにリンクに変換します。
選択アクションがちょっとテクいかもしれません。
こうやってリンクだけの配列を作りたいのですが、有効なJSONじゃないと怒られます。
なので、concat
関数で文字列結合をしてあげると、同じ結果でも怒られずにリンクのみの配列が作成できます。
concat(
'<a href="',
item()?['{Link}'],
'">',
item()?['{FilenameWithExtension}'],
'</a>'
)
自分への通知
最後に結果を自分に通知して終わりです。
Formsでは添付できないファイルも、このように受け取ることができました。
おわりに
今回利用したフローを応用して、そもそもファイルの添付を許可できない組織外の人からファイルをもらうフォームを作成することもできそうです。
その場合はメールアドレスの入力欄を設けたり、allowAnonymousAccess
をtrue
にするなどの変更が必要です。
HTTPリクエストを使わないといけないので、難易度が高いのがネックです。
Forms のカスタマイズ性がもうちょっと良くなればいいんですが・・・今後に期待!
メールアドレス形式のバリデーションチェックも欲しい!