【#PowerApps Tip's】OfficeファイルをOnlineで起動させる

[Japan Power Platform User Group](https://power.users.community) のフォーラムによせられていた質問への回答、の補足です。Office Onlineで表示するポイントは簡単なのですが、周辺で得たナレッジ等を忘れないように。※主に自分の備忘用

# やりたいこと
PowerApps で、データソースがSharePoint Online のリスト。そのリストの添付ファイルを利用している状態で、PowerApps アプリ側でデータソースの添付ファイルをクリックした際などでダウンロードではなく、Office Online で表示させたい。

# 利用するデータ
SharePoint Online（以降、SPO）のリストです。リストを作成したままの状態で、タイトルに加えて添付ファイル列を表示しているだけです。

# 利用したアプリ
前述のリストから自動生成した PowerApps アプリを改造しています。アプリの自動生成などは検索すれば手順など大量に発見できるかと思いますので割愛。

# 実際の動作
下記の動画をご確認ください。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> open the SPO attachment in Office Online. [Launch] function and URL parameter “web = 1”. <a href="https://t.co/06tYe0Ua6m">pic.twitter.com/06tYe0Ua6m</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1191285902313607168?ref_src=twsrc%5Etfw">November 4, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 自動生成されるコントロールのプロパティではコト足りない！
Form コントロールの添付ファイル（"{Attachments}"）は、クリック時のアクション（OnSelect）が存在しません。記事投稿時点で確認できたアクションは下記です。

 - OnAddFile
 - OnRemoveFile
 - OnUndoRemoveFile
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/5c1c1a48-2c80-92c8-4fb8-acdbcd5c8e60.png)

メソッドの文字列を確認する限りでは、添付ファイルを〇〇したら、しかないですよね。そして、そのメソッドで検索しても公式ドキュメントが見当たらないときたもんだ！ヽ(`Д´)ﾉ
＃公式情報をご存じの方はDMやコメントで教えてくださると幸いです！

ということで、このコントロールのプロパティを何とかするコトは素直に諦めました。標準で持ってない＝何ともならない、ですからね・・・。

# では、どうするか？
SPOのリストアイテムには、複数の添付ファイルを登録することが可能です。そのため、複数レコードに対応した代替の部品が必要です。となると Gallery コントロールを選びますよね。その Gallery コントロールに拡張子から判定したアイコン画像を表示するコントロールと、ファイル名を表示するラベルを設置します。そのラベルのクリックイベント（OnSelect）で Launch関数を実行すれば代替品の出来上がりです。

前述の動画ではデフォルト生成された DataCardValue を比較のために表示しています。実際のアプリでは、そちらのコントロールが不要であれば非表示にしてしまって、追加した Gallery のみ表示にすれば問題ないかと思います。

# Office Online で起動させる方法
Office Online でファイルを開く際は、そのファイルのURLパラメーターに、

 ***"?web=1"***

を追加して起動するだけです。

その他パラメーター等もあるのですが、そこは下記参考URLを参考にしてください。（Special Thanks [@hrfmjp](https://twitter.com/hrfmjp))

■参考URL
　[SharePoint Online で、ドキュメント ライブラリから Office 文書を開く際の URL に注目してみる](https://idea.tostring.jp/?p=1581)

# さらに補足 あるいは 改造したポイント
前述の動画で実施しているポイントは下記になります。

1. DetailScreen の Formコントロール、添付ファイルのDataCardに、Gallery コントロールを追加
2. Gallery コントロールの［Items］は”ThisItem.添付ファイル”
3. 追加した Gallery コントロールへ画像とラベルコントロールを設定
4. 画像コントロールは拡張子を判定して、アイコンを切替
   ※画像は予めアプリへ登録しておいてください

    ```
    Switch(
        Last(Split(DisplayName, "." )).Result,
        "xlsx", 'Microsoft excel',
        "docx", 'Microsoft word',
        "pptx", 'powerpoint'
    )
    ```
4. ラベルコントロールに添付ファイル名（DisplayName）を表示
5. ラベルコントロールの［OnSelect］へ Launch関数で”AbsoluteUri”に続けて"?Web=1"パラメーターを指定

ぶっちゃけ、ポイントは『URLパラメーターをどういう風に指定するか？』だけで、他は「やりたいこと」にあわせて適宜改造してくださいませ、です。

# まとめ
- PowerApps の添付ファイルコントロールは情報が少ない
- PowerApps の添付ファイルコントロールはOnSelectがない
- PowerApps の添付ファイルコントロールはクリックするとファイルダウンロードしかできない（現状
- SPO上のファイルをOffice Online で開く場合はURLへ"?Web=1"パラメーター
- Launch関数 ＋ URLパラメーター で後は良しなにお任せできる


ちなみに、Officeクライアントアプリでの起動も考えたのですが・・・。以前、ASP.net MVC でJavaScript を組み合わせて色々した記憶があったので今回調べていません。（しかも、色々してくれたのは当時の優秀なメンバーで、当方は実装していないｗ）
URLをアレコレ加工するだけなら、文字列操作なので今回と同じような発想で何とかなると思います。ただ、JavaScriptで、関連API呼んでーとかやってるとチョッとPowerAppsだとツラいかなーですね。
　■2019/11/05 追記
　→ 今回と同様に文字列操作だけで実現できました！！
　→ [Officeファイルをクライアントアプリで起動させる](https://qiita.com/yamad365/items/314797ab42cf93606dde)

とはいえ、PowerApps のコントロールで限界があるのであれば、その他の関連する何かを工夫して組み合わせれば何とかなるかも？という良い例が提示できたかな、と個人的には考えています。今回でいえばSPO、Office 365（Office Online）の仕様を上手く利用して、標準機能ではダウンロードになってしまう動作を Office Online へ置き換えることができます。

PowerApps 標準機能やプロパティで用意されてない箇所は、関連サービスのテクニックを活用して実現方法がないか検討してみましょう！ということでしょうかね。

それでは、皆さま。素晴らしい Power Platform Life を！