シリーズ2担当分の記事です。AutomateでSPOからフォルダをZip化してダウンロードする実装の記事です。ポールさん)を見て、「おー!こんなん出来るんだ!すげー!」と当時にまねて作成。件数の問題などがあり、調整してある程度いい感じにはなったんですが、やっていることがトリッキーなので、日の目を浴びることがなかった(というか実運用での利用はやめといた)んですが、限定的でも使いたいっていう方もいるかなーと思い今回記事にしてみました。APIで実装している感じなので、本格的なシステムの実運用に取りこむなどは推奨しません。出来る範囲でもうれしいからやってみたいという方向けになります。自分も細かい部分まで把握できていないのでうまくいかない場合などのサポートは難しいのでその辺はご了承ください。サンプル動画ひさしぶりに動画も取ってみました。SPOライブラリのフォルダに複数ファイルがあり、それをアプリからフローを呼び出してZipファイル化、そのパスをアプリへ返却してダウンロードの流れです。AutomateではZip化するアクションは標準やプレミアムライセンスの範囲でも存在しません。(そのはず、間違っていたらすいません)ただしサードパティのコネクタを使用すれば出来ます。この場合はサードパティ側のライセンスが必要となります。以下がよく見る代表的なものかと思います。本格的なシステムで必要であればご検討いただくのが良いかと思います。(encodian.com))今回紹介する実装はポールさんがスタンドアロンライセンスが不要な範囲でSPOを使ってそれを実現させたという内容になります。本家の記事は以下です。actions.こちらのとおり実装すれば基本SPOライブラリの指定フォルダをZipファイルに変換できます。Appsから呼んでいる場合はそのPathを返却してDownLoad関数でダウンロードも可能です。実装の画面ショットと定義コードをそのまま載せてくれています。APIを使って実現するというイメージです。上記のままの場合は2点ほど問題がありました。・30件以上が取れない(投稿のコメントにもあり)・ある程度ファイル数が多いとエラーとなる(uriComponentで文字数超過のエラーが出る)上記2点については自分のほうで実装を調整してみたところ、100件以上でも取れるのを確認しました。いずれにしろ容量が100MB以上となるとダウンロードする時点でエラーになります。(フローの制限のため回避できず)ですので、30件以上やある程度の件数は取れるようにはできましたが限界は100MBまでとなります。TIPS※本サンプルでは作成時のチャンクの許可をオフにして上書き更新を出来るようにしてます。オフにした場合は作成時の上限は90MBまでなのでその場合は90MBが上限と言えます。※チャンクの許可や作成や取得の容量上限については以下記事をご参照ください。(youseibubu.com)NOTE作成するファイルはZipファイルではありますが圧縮はされていません。そのままの容量となります(これはSPO標準でも同じだった気と思います)そのため容量を抑える目的では使えないとなります。フォルダごとダウンロードしたい用途向けかと※ポールさんの場合、元々はワードファイルを編集するためにZipにしたいという目的だったようです実装(修正後)以下にポールさんのフローを一部自分が修正したフローについて記載します。※サンプル用にシンプルにしています。実際のユースケースに合わせて調整ください。以下のサンプルでは作成したZipファイルのパスをアプリへ返却してパスからZipファイルをダウンロードできるようにしています。※作成したZipファイル自体を返却してもダウンロードは不可なのでパスを渡す。サンプルでは以下のように定義しています。ご自身のものに置き換えていただくイメージです。TIPS対象フォルダなどはサンプルでは固定値で指定していますが、本来はアプリ側でフォルダパスを指定したり、処理の中でダウンロードしたい複数のファイルを作成してフォルダに詰めてそのパスを指定する。動的なものとなるかと思います。そのあたりはユースケースに置き換えて実装ください。上記の場合は以下SPOサイトのライブラリ(ドキュメント)は以下のフォルダ(DOC1/test)を指定となります。APIを使ってRenderListDataAsStermというやつでアクセストークンやサイズ、メディアのURLなどの情報を取ってきています。裏技な感じでややこしいですね!この情報を後の作成時に使用します。API内で使用するライブラリのパス(サイトとライブラリ)とZip化するフォルダのパスをSettingsで定義しています。ここは変数を使って組み立ててます。APIではPOSTにして、URIは上記のように書きます。これは元の記事そのままです。動的な部分をSettingの項目から取ってUriエンコードしている感じです。outputs(‘settings’)[‘zipFolderPath’]))}★このボディの部分を調整しています。以下のように調整します。4103}}ですが、そこにViewXmlでRowLimit1000を追加しています。これで1000行まで取れます(実際にはそこまで行くと別の箇所でエラーとなると思いますが)※この辺は公式のページでパラメータなどみて試しながらやった記憶です上記の箇所を元々の部分から調整して1000行まで増やしています。これで30件しか取れない問題は解消しました。次にアクセストークンを作成アクションに保持しています。★調整ポイント次にその他取得したレコード(アイテム)の各情報を選択アクションで成形しています。★ここを調整しています。ポールさんの記事だと選択アクションでそのまま項目を指定して、downloadZipのアクションでそれをuriComponentでエンコードしているんですが、その場合に文字数がある程度多いとエラーとなりました。(上記の対応で30件を突破したけどもう少し増やしたらこのエラーが出た感じ)そのため、この選択アクション部分で個別にエンコードする実装にしています。合わせてJSONの部分は別でリプレイスして対応しています。この対応でこの部分のエラーは出なくなりました。以下がもともとのポールさんのものです。downloadZipのボディの中でエンコードしているここを以下のように調整しています。EncodeUri(作成アクション)を追加して{、}なんかをリプレイスでエンコードしています。※あんまり覚えていないのですが上記の個別エンコードの対応だけだとJSON部分のエンコードが出来ないのでこれでやった記憶です💦もっといい方法があるかもしれない。EncodeUri:@{replace(replace(replace(replace(replace(replace(replace(string(outputs(‘Attachment_Items’)),'{‘,’%7B’),'”‘,’%22′),’:’,’%3A’),'[‘,’%5B’),’,’,’%2C’),’}’,’%7D’),’]’,’%5D’)}Zipファイル情報を取得し作成する以下の部分で実際にZipファイルにする情報をダウンロードしてそれをコンテンツにしてファイル作成しています。調整した箇所としては、ボディの部分を先ほどのエンコードした内容にしたのと、ファイル作成部分を変数で指定した場所に作成するようにしたくらいです。このサンプルではSPO上にそのままZipを作成してそのパスをアプリへ返却しています。ポールさんの記事だとOneDriveに保存するパターンも載っています。NOTEdownloadZipの内容は正直詳細までわかってませんが、ポールさんの通り実装していて、こうやるとうまいことダウンロードできるんだね!という感じです。@{variables(‘SiteURL’)}@{outputs(‘Zipファイル作成’)?[‘body/Path’]}サンプル動作では実際に以下フォルダにあるファイルをZip化してダウンロードしてみます。このフォルダには91個のファイル(テキスト、画像やエクセルなど)を置いています。フローだけで動かしてもZipファイルは出来ますが、今回はアプリから呼び出してZipをそのままダウンロードします。アプリから呼び出してZipをダウンロードアプリから呼び出すサンプルとして以下のアプリを作成しました。ボタンでフローを呼び出し、戻り値(Path)をそのままダウンロードします。※下のラベルにはPathを表示TIPSDownload関数でZipファイルのパスを指定すればそのままダウンロード画面が開く動作となります。※ダウンロードしたファイル自体を渡してもダウンロードはしてくれませんので注意ボタンをクリックしてフロー実行します。今回の量だと20秒ほど待てば返ってきました。そのままダウンロード画面が開き、ダウンロードが出来ます。ファイルの中身を開くとちゃんと91ファイル取れています。ファイルもちゃんとしているフローの結果フローの結果をみると以下のようにdownloadZipの部分である程度時間がかかっています。容量やサイズによって変わってきますね。今回は91ファイルで容量は27.2MBでした。この場合でトータルで20秒位でした。→60ファイル位、容量は全体で1MBほどの場合は4、5秒で返ってきました。Zipファイルは後で消すなど調整フローの処理でZipファイルを作成していて、そのパスをアプリへ渡しています。アプリへZipファイルそのものを渡してもダウンロードしてくれないので一旦SPOやOneDrive上に作成する必要があります。そのためダウンロードしてもらうまではこのファイルは必要で、その後に削除する必要があります(残しておいてもいいが基本不要)SPOライブラリの指定の場所にZipファイルが出来ている今回のサンプルではそのままにしていますが、一定時間待機した後にフロー内でファイルを削除したり、定期的に動作させる別のスケジュールフローで削除するなどで対応するのが良いかと思います。実装コード今回実装した内容のコードのスコープで囲った部分を一応貼っておきます。(定義は順不同なのでバラバラの順番です。“02696254-ae57-421f-9cb2-12ff7d998a76”}}}おわりに今回は2年ほど前に有識者の方の実装をまねて作ってみて改良までしたけど、内容の把握をしっかりしてない点とトリッキーな実装な点で実際に採用はせずに日の目を浴びなかったフローを記事にしてみました。(容量の上限(90MBほど)はあるし、なんかあっても解消できないかもなので提案しなかった)とはいえ、Zipファイルでまとめて落とせないのかなーという声はよく聞いたりもするので、限定的な利用でも構わないから使いたいという方もいるかなとおもい作り方を記事にしました。したシステムの実運用の場合はサードパティ製のコネクタを使用するほうが安全かと思います。そもそもZipでダウンロードしなくても、SPOやOneDriveにフォルダにまとめてあげて、そのパスに遷移できるようにしておいたら標準機能の手動操作でZipダウンロードできるので、そういう運用でやってもらう方が良いのかなとも思います。SPO参照してもらうなどの方法で代替えが効く範囲で取り入れていただくのが良いかなーと思います。ご自身のご責任の範囲でご利用ご参考ください。itこの記事は役に立ちましたか?もし参考になりましたら、下記のボタンで教えてください。Automate技術者へと転身。qiitaや自社HPでも技術ブログを書いていました。Apps2024.02.193エクセルから大量データをSPOへインポート(新規リスト作成限定)今回はSPOリストへデータをインポートする方法のひとつとしてエクセルからインポートする際の対応について軽く書きます。Apps2023.07.159追記型のコメント機能を作る(承認コメントを残す機能)はじめにTIPS本投稿は1年ほど前に自社ブログで書いた内容のリライト版です。承認操作のあるアプリを作成する場合には、コメント欄を用意して入力しその内容を履歴として保持しておきたいケースは多いと思います。多段階の承認や複数人の承認の場合は追記して削除できないようにする機能です。Listsとしても同様)列の内部名(InternalName)については作り方によって見づらいものになります。その辺と調べ方になります。エクセル取込み時やDataverseの場合などと絡めて記事にしました。タイトル部とギャラリーデフォルトの調整その3ではギャラリーの基本的な調整とカスタマイズのサンプルをご紹介しました。その4では初期状態でちょっと怪しい部分を調整するサンプルです。(メンテナンスモード、URL、アドレスなど)はじめに今回はキャンバスアプリを使用する際、アプリ自体の設定項目を管理するリストの作成・使用例についてご紹介します。開発ではよく開発環境で開発→検証環境で検証→本番環境で運用という感じでアプリを移送して運用します。いった場合にその環境ごとに変わる値があります。動画公開しましたTwitter(X)と同様ですが、YouTubeチャンネルを作ったのでそっちにもアップしています。トラックバックこの記事へのコメントはありません。トラックバックURLこの記事へのトラックバックはありません。返信をキャンセルする。