LoginSignup
12
3

Formsでアップロードできない拡張子のファイルをなんとかして受け取りたい

Last updated at Posted at 2023-12-18

はじめに

Power Automate はじめの一歩によく使われるForms ですが、このForms を利用すると、単なるアンケートだけではなく、ファイルを提出してもらうことが出来ます。

しかし、提出できるファイルの種類には、いくらかの制限があります。
image.png

特に個人的には、CSVファイルなどのテキストファイルや、ZIPファイルの受け取りができないことに不便を感じたので、今回はそれを何とかするフローを考えてみました。

フローの流れ

基本的な窓口はそのままForms で行います。
image.png

このフォームには、追加のファイルがある場合のチェックボックスを設けております。
image.png

フォームからの投稿があれば、投稿者にメッセージを返しますが、このチェックが入っている場合のみ、ファイルのアップロード用のリンクをつけてメッセージを送ります。
image.png

このアップロード用のURLは、SharePointのファイルの要求機能を使っています。
image.png

ある程度時間が経ったら、追加のアップロードが終わったとみなして、どんな回答が来たかを自分に通知します。
image.png

事前設定

前述の通り、ファイルの追加アップロードには、SharePointのファイルの要求機能を使用しています。

この機能を使うためには、テナントの設定として、機能が有効になっている必要があります。

通常の操作で、フォルダの右メニュー内に「ファイルを要求する」が表示されていればOKです。
image.png

表示されていない場合は、組織の管理者に機能を有効にしてもらいましょう。

共有範囲の設定を変更する必要があるため、組織の規定によっては、この機能を使用することが出来ないことがあります。

フォームの用意

今回は簡単のため、最低限の質問を設定しています。
image.png

  1. 所属を示す項目
  2. ファイルのアップロード
  3. 追加のファイルの有無

追加ファイルの有無は、チェックボックスを設けています。
選択肢形式の質問で、選択肢を一つだけにし、複数回答オプションをオンにすることでチェックボックスが作れます。

image.png

このとき、必須オプションをオンにすると、チェックが外せなくなるので注意してください。

フローの解説

基本的なFormsを使った部分については割愛して、ファイルの追加アップロードにかかわる部分のみを解説します。

フローの全体像

image.png

フォルダの作成

ファイルの要求をするために回答ごとに固有のフォルダを作成する必要があります。
Forms の添付ファイルが格納される、質問ごとの固有のフォルダを使う方法もありますが、追加でアップロードされたファイルがどの回答に紐つくものなのかを特定することが困難になってしまいます。
image.png

そのため、フォームの回答IDを使って、重複しないような固有のフォルダを作成します。
image.png

せっかくフォルダを作るということで、ついでに所属ごとにフォルダ分けしました。
image.png

フローでのアクションはこんな感じです。
image.png

ここで作成したフォルダに、追加のファイルをアップロードしてもらうよう依頼します。

追加ファイルがあるか?(条件)

この項目にチェックが入っているかどうかで判定します。
image.png

チェックが入っていない場合、この質問の動的なコンテンツが空になりますので、empty関数でチェックができます。
image.png

チェックが入っていない場合は空=empty関数の結果がtrueになるので、このように判定しました。
image.png

ファイルのアップロードURLの作成

先の質問で追加のファイルがある場合のみ、アップロード用のリンクを作成して送付します。

SharePointのファイルの要求を行うのですが、Power Automate の標準コネクタではこの機能が用意されておりません。
そのため、SharePoint に HTTP 要求を送信しますアクションを使用します。

方法については、コルネさんの解説が詳しかったので、参考にさせてもらいました。

image.png

不要なプロパティを指定していなかったり、ちょこちょこ値を変えているので、変更部分のみ解説します。

  • allowAnonymousAccess

誰でも回答可能かどうかを指定するプロパティです。

trueにすると組織外のユーザーからもアップロードできるリンクになりますが、今回は社内ユーザーを想定しているため、falseにしました。

  • expiration

リンクの有効期限を指定するプロパティです。

手動でリンクを発行するときには指定できないようですが、APIからは指定できました。
有効期限なしで開放しっぱなしにしてしまうのも管理が面倒なので、回答のあった日だけ有効になるように、以下の関数で次の日を期限にしています。

expiration
addDays(
    utcNow(),
    1,
    'yyyy-MM-ddTHH:mm:ssZ'
)

分単位・時間単位の指定ができればよかったのですが、日単位での指定のみが可能なようです。

  • description

リンクを開いたときの説明文を指定するプロパティです。

image.png

動的なコンテンツを利用してそれっぽい感じに仕上げています。

投稿者への通知

リンクを作成したら、それを投稿者へ送ります。
メッセージにリンクを付けておいて、

image.png

image.png

リンク部分
<a href="@{body('SharePoint_に_HTTP_要求を送信します')?['d']?['ShareLink']?['sharingLinkInfo']?['Url']}">追加ファイルのアップロード用リンク</a>

投稿者にTeamsでメッセージを送ります。

image.png

アップロードのための待機時間

有効期限が日単位でしかできなかったので、本当は10分間のみ有効にしたかったのですが、ごまかしてユーザーに対する通知として時間制限を行っています。
(リンクのDELETE方法を誰か教えてください🙏)

image.png

フローの方でも、10分間の待機を行っています。

image.png

image.png

アップロードされたファイルの取得

10分間の待機ののち、追加のファイルがフォルダに保存された前提でファイルの取得を行います。

もともとFormsで添付されたファイルも、作成したフォルダに移動しておきます。
image.png

image.png

Forms から直接アップロードしたファイルも、追加でアップロードしたファイルも同じフォルダに格納された状態です。

そのファイルの一覧をファイルの取得 (プロパティのみ)アクションで、フォルダを制限することで取得します。
image.png

取得したファイルの一覧を、データ操作系のアクションを使って、いい感じにリンクに変換します。

image.png

選択アクションがちょっとテクいかもしれません。

テキストモードに切り替えて
image.png

全部消して
image.png

単に値だけを入力すると、値だけの配列が作れるので
image.png

こうやってリンクだけの配列を作りたいのですが、有効なJSONじゃないと怒られます。
image.png

なので、concat関数で文字列結合をしてあげると、同じ結果でも怒られずにリンクのみの配列が作成できます。
image.png

選択
concat(
    '<a href="',
    item()?['{Link}'],
    '">',
    item()?['{FilenameWithExtension}'],
    '</a>'
)

自分への通知

最後に結果を自分に通知して終わりです。

image.png

Formsでは添付できないファイルも、このように受け取ることができました。

image.png

おわりに

今回利用したフローを応用して、そもそもファイルの添付を許可できない組織外の人からファイルをもらうフォームを作成することもできそうです。

その場合はメールアドレスの入力欄を設けたり、allowAnonymousAccesstrueにするなどの変更が必要です。
image.png

HTTPリクエストを使わないといけないので、難易度が高いのがネックです。
Forms のカスタマイズ性がもうちょっと良くなればいいんですが・・・今後に期待!
メールアドレス形式のバリデーションチェックも欲しい!

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3