タグ別アーカイブ: JSON

Uploadしたエクセルファイルを直接コレクションにする~Power Apps~

【エクセルファイルをSharepointリストなどを経由せず、直接Power Apps内で編集できるようにします】

エクセルファイルの内容をSharepointリストに反映する前に、一旦編集したいケースもあると思います

その場合、一旦Sharepointリストに反映してしまうと「削除」を行う必要がでてくるなど、やたらと時間がかかることがあります

今回はJSON形式を経由して、直接エクセルファイルの内容をPower Appsに取り込みます

記事の解説は大きく分けると、次の3つになります

・エクセルをPower Appsから始動して一旦、OneDriveに名前を変えて保存する

・エクセルファイルをJSON形式に変えてPower Appsに送信する

・Power AppsでJSON形式を通常のコレクションにする

上記のうち「エクセルをPower Appsから始動して一旦、OneDriveに名前を変えて保存する」については、お手数ですが過去の記事をご参照願います

前提条件

・Uploadするエクセルファイルの中身は最初からテーブル形式になっていること

*OfficeScriptでPower Automateのフロー内で自動的にテーブル形式にすることもできます⇒過去記事

・Uploadするエクセルファイルの列は固定であること

ファイルのアップロード及びPower Automateの起動

フォームのパーツを使用してファイルをUploadする方法は過去の記事を参照してください

今回はファイルのアップロードしてコレクションを作成するまでの間は「処理中」と表示します

この「処理中」を表示するためには、ボタンの「OnSelect」プロパティにてUpdateContext関数を組み込みます

UpdateContext関数で更新する変数はラベルのVisibleプロパティに組み込んでおきます

そして、Power Automateフローを起動する時には変数:myflowで受け取れるようにします

UpdateContext({myflow: 

             エクセルインポート.Run(

                                         {

                                         contentBytes: First(DataCardValue.Attachments).Value,                                                              

             name: First(DataCardValue.Attachments).Name

                                    }

              )

});

Power Automate内でのJSON形式への変換

ファイルの作成

Power Automateフロー内ではPower Appsから受け取ったファイルの内容を基にして、まずはOneDrive内に新たなファイルを作成します

作成されるファイル名は過去に作成したものと同じにならないように、現在時刻をファイル名に入れます

*OneDrive内では作成したファイルを削除したり、ファイル自体を上書き更新するには一定期間を空けなくてはなりません。その為、このような処理を行います

JSON形式への変更

選択アクション

UploadしたエクセルファイルをJSON形式に変換するには、データ操作コネクタの選択アクションを使用します

「表内に存在する行を一覧表示」アクションで読み込んだ内容を「選択」アクションでJSON形式に当てはめていきます

この時に「日時」と「数値」形式の内容については、関数を使用してきちんと該当の形式に変換しておきます

・日時形式 ⇒例:formatDateTime(item()[‘Date’],’yyyy/MM/dd’)

・数値 ⇒例:int(item()?[‘Sales’])

注意

「選択」アクション内で、うまく動的コンテンツでエクセルの内容を拾えないことがあります

この時は2つ対応方法があります

・動的コンテンツの工夫

通常「表内に存在する行を一覧表示」アクション内では下の画像のように、ファイルの指定内容は動的コンテンツにて指定します

選択アクションにて動的コンテンツを使用するまでは「パス」ではなく、実際のファイルパスを指定しておきます

選択アクション内で動的コンテンツを設定したら、元通り「パス」を設定し直しておきます

・式での指定

一度、コードのプレビューを見てみましょう

上の画像を見ると、開始の「value」で処理する内容は<item()?[‘列の中身’]>で抽出できることがわかります

実際に<item()?[‘列の中身’]>を使用する時は、下の画像のように「式」の中で@を入れないことも大きなポイントです

JSONの解析

JSONの形式変更の最後では「JSONの解析」アクションを使用します

スキーマは「サンプルから生成」から作成しますが、こちらは一旦「””」で設定してフローを動かして設定します

*あまりUploadするファイルの行数が多いと取得できませんので、その場合は行数が少ないサンプルファイルを使用します

フロー動かした後の出力結果をコピーし、どこかメモ帳にでもコピーしておきます

その後、サンプルから生成をクリックし、次に表示される画面にコピーしてスキーマを作成します

Power Appsへの受け渡し

作成したJSONはPower Appsに受け渡します

上の画像では「msg」としてPower Appsに受け渡しますが、Power Apps内ではそのまま「msg」では抽出できませんので注意が必要です

Power Apps内でのコレクションの作成

Power Automateから受け取ったJSONの内容は、次の画像のようになっています

コンテキスト変数内で更に「msg」を経由することで「JSONの内容」を抽出できるようになっています

このJSONからコレクションを作成するには、2つの関数を使用します

ParseJSON関数」と「ForAll関数」です

最初のParseJSON関数では、受け取ったJSON形式の内容を解析します

解析した内容には形式がありませんので、次の画像のようにTable関数でTable形式にします

Table(ParseJSON(myflow.msg))

Table関数で作成したテーブルの内容は、ForAll関数でコレクションにします

ここで注意点です

ParseJSONで解析した内容はValueで抽出します

しかも、Valueで抽出しても形式が無いので、次のようにText関数やValue関数で形式を付与します

 {  

              Product:Text(Value.Product),  

              Date:Text( Value.Date),  

              Customer:Text( Value.Customer),  

              Sales: Value(Value.Sales)   

 }

ここで、JSON形式をコレクションにする内容を全てみてみましょう

 Clear(myJson);

ForAll(

        Table(ParseJSON(myflow.msg)),

          Collect(

                    myJson,

                    {

                      Product:Text(Value.Product),

                      Date:Text( Value.Date),

                      Customer:Text( Value.Customer),

                     Sales: Value(Value.Sales)

                   }

        )

)

 まず最初に作成するコレクション:myJSONをクリアしておきます

その後に、前述のようにParseJSON関数で解析しながら、JSONの内容を全てコレクションにします

<まとめ>

今回はエクセルファイルをアップロードしてコレクションにする方法を解説しました

具体的な内容としては①エクセル⇒JSON、②JSON⇒コレクションというように2段階で変換を行うので少し重い内容となっています

但し、意外と躓きやすい箇所が他にあります

「表内に存在する行を一覧表示」のアクションです

既存の設定だと2つ注意点があります

1.出力される行数が256行に限定される

こちらは設定を変えておきましょう!

上の画像の設定をクリックすると次の画面が開きます

こちらで「しきい値」を変えると出力する行数の上限を引き上げられます

2.DateTime形式

こちらは「ISO 8601」にしておかないと、日付形式の箇所はエラーになります

「ISO 8601」の他に「Serial Number」というのもありますが、その場合は日付形式の内容を設定するには「addDays関数」を使用します

こちらについては後日、別途詳細な記事を書きたいと思います

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

POWER AUTOMATE DESKTOP でAPIを操作してデータを取得するの巻

 APIは「アプリケーション・プログラミング・インターフェイス」の略語で、Webスクレイピングとは違い、あらかじめネット上に公開してあるデータを収集します

今回の記事では、Power Automate Desktopを使用してAPIを操作する方法を解説します

 尚、APIそのものについてはこの記事では詳細には解説しませんので、もっと詳細を知りたい方は他のサイト等を参考にされてください

データの時間

ビジネス+IT

実際に記事の内容を動かしてみて、APIというものを実感して頂けたら幸いです

一番簡単なパターン/登録不要

通常、APIを利用する際にはAPIを利用するサイトで登録を行い、ID等を事前に取得する必要があります

今回は、登録が必要なしで使えるAPIで操作を行います

その代わり、取得するデータも1行だけになります

 Power Automate Desktopでは、JSON形式にてデータを取得し、さらにデータを成型してメッセージで表示します

実際のフローで使用するのは3つのアクションだけになります

使用するAPIは「zipcloud」の郵便番号検索APIになります

ポイント

データの取得

郵便番号検索APIのサイトで示してあるリクエストパラメーターの型式に従って、リクエスト文を指定の箇所に送り、データを取得します

データの変換

取得したデータはJSON形式になっており、人間の目では読みにくい内容になっています

こちらを郵便番号検索APIのサイトで示してあるレスポンスフィールドの階層に従い、人間の読める内容に変換します

リクエストURL及び指定項目

データの取得に使用するURLは以下のURLになります

https://zipcloud.ibsnet.co.jp/api/search

指定項目の中で必須は郵便番号/7桁のみです

試しに上の画像の(例)をそのままブラウザに入力してみます

https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060

*「search」と「zipcode」の間に「?」が入力されている点にご注目ください(検索対象の郵便番号を変える場合には最後の7桁を変更します)

すると、次のように表示されます

今回は上記の画像の「address1/高知県」と「address2/南国市」をメッセージで表示します

実際のフロー

APIを操作するフローは3つのアクションで構成されます

アクション1:Webサービスを呼出します

zipcloudのサイトに掲示されているリクエストURL(https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060)をそのまま使いデータを取得します

使用するアクションは「Webサービスを呼出します」になります

パラメーター:URLの箇所に上記のリクエストURLを入力します

このアクションを動かすと、サイトからJSON形式でデータを取得し、以下の変数にデータを格納します

 下の画像は変数:WebServiceResponseに実際にJSON形式のデータが格納されたところです

アクション2:JSONをカスタムオブジェクトに変換

難しそうなアクション名のアクションですが、要は人間の目では読みにくいJSON形式のデータを読みやすく変換します

上記の画像のようにパラメーター:JSONにはデータが格納されている変数:WebServiceResponseを指定します

このアクションで変換されたデータは変数:JsonAsCustomObjectに格納されます

ここでAPIの取得データ・詳細を確認します

以下の画像はzipcloudの「レスポンス」の画面です

データの階層が2段階に分かれていて、1階層目が「status」「message」「results」の3つなのが分かります

そして2階層目が「results」の下の階層の実際のデータ項目/address1等になっています

ですので、このアクションで変換したデータも同じ構造になっています

上記の画像 はこのアクションで変換した内容を格納した変数:JsonAsCustomObjectの内容です

resutlsの項目の詳細表示をクリックすると次の内容になります

今回取得するのは1行だけですので、1行だけになっています

更に詳細表示をクリックします

次のアクションで上記画像の「address1」と「address2」をメッセージで表示します

アクション3:メッセージを表示

前アクションにて、データをJSON形式から人間の目で見える形に変えて格納した変数:JsonAsCustomObjectから、項目別に抜き出してメッセージを表示します

上記の内容の振り返りになりますが、取得したデータは2階層になっています(一部省略)

・results >>(address1,address2・・・)

上記の階層に対応した形で取得データを「address1」と「address2」に分けて抜き出します

・address1 ➡ %JsonAsCustomObject.results[0].address1%

・address2 ➡ %JsonAsCustomObject.results[0].address2%

実際に上記の2つの内容をアクションに反映したのが次の画像です

以上です➡次回に続く

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ