PowerApps 印刷機能 ギャラリーの非表示の行や列を印刷する方法

PowerAppsのアプリはそれを使っている端末がプリンターに接続されていれば、その画面を印刷できる様になったのです。

この記事ではその基本とギャラリーで表示されていない部分もちゃんと印刷できる方法をご紹介します。

##PowerAppsの印刷機能：Print()関数##

PowerAppsは携帯端末で使うアプリの作成を比較的簡単にできると一般的に認識されています。
しかし、マイクロソフトTeamsと連携させる事でPCのデスクトップでも今後使われてくるのではないかとこの記事で書きました。

「MS Accessの終焉？デスクトップでもPowerApps【PowerApps＋MS Teams】」
https://econoshift.com/ja/powerapps-and-ms-teams/


その為には表示画面を印刷したり、PDFファイルに出力できる事は必須課題でしょう。
そこで最近のバージョンアップで新しい画面を追加する時に「縦長で印刷」と「横長で印刷」と言う画面を追加して、その画面上にある「印刷」というラベルをクリックすると印刷ができる様になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/de30e179-f350-8fc1-ef29-a62b87d8ee56.png)

そのラベルの「OnSelect」属性を見ると「Print()」が入っていて、

```ruby:「OnSelect」属性
Print()
```

「Visible」属性に次の数式が入っているだけです。

```ruby:「Visible」属性
Not(Parent.Printing)
```

実際にはこの画面を追加しなくても全てのコントロールの動作の属性（OnSelectやOnChange）に上記のPrint関数を入れるだけでこの機能を持たす事ができます。

「Visible」属性の数式でParent（この場合はそこの画面）が印刷中（Printing）ではない（Not関数）時が「true」になるので、そのコントロールを表示します。つまり印刷中にはそのコントロールを非表示にして印刷物に載せなくしています。

この二つの数式で上記の画面を追加せずに、同じ印刷機能を付ける事ができます。

##Print()関数の実務で使う注意点##
Print関数は簡単に実装できますが、いくつか注意点があります。
まず、その印刷ボタンをテストする時にはプレビューモードにして下さい。

プレビューモードにしてそのボタンをクリックするとお使いのブラウザーの印刷画面で印刷状態を見る事ができます。筆者はChromeを使っていて下の図はその例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/e95f5bd3-af01-c485-925e-4acf81306d12.png)

そこに各種印刷設定がありますが、残念ながらこれらの設定はPowerApps側では制御できないので、変更が必要なら毎回手で変更をする必要があります。縦長／横長のレイアウト位はアプリ側で制御できる様になれば良いのですが。。。

上の図で気になるのは既定ではアプリ画面の色などの書式が印刷されません。下図が本来のアプリ画面ですが、その様に手動により変更はできます。

設定内の「詳細設定」をクリックして、一番下の「オプション」の「背景のグラフィック」にチェックを入れると下の画像の様に正常に表示がされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/150c6b33-e161-10d1-a040-47edfdd84bdb.png)

##ギャラリーで非表示の部分も表示し印刷する方法##
このアプリでは縦方向のギャラリーを使っています。上の画像を見ると右側にスクロールバーが見えますので、もっと多くのデータがスクロールダウンをすればあるのですが、既定だと印刷ボタンをクリックした時の画面状態でしか印刷されません。これだと印刷機能として不十分ですね。完璧ではないですが、非表示の部分も印刷する方法があります。

下図がそのアプリ画面とそのギャラリーのプロパティー（属性）の一覧です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/db3f0c54-1b9a-e82e-81ea-944bcf755a76.png)

考え方としては印刷中はギャラリーの全データが見える分だけギャラリーとその画面の高さ（「Height」属性）を変更するのです。実際にはそれぞれの「Height」属性に下記の数式を入れます。

```ruby:ギャラリーの「Height」属性
If(
    Not(Parent.Printing),
    650,
    (Self.TemplateHeight + Self.TemplatePadding) * CountRows(Self.AllItems)
)
```

このギャラリーの元々の高さは「650」でした。ですので印刷中でない時にその高さにして、印刷中はその次の数式の結果が高さになります。

ここの「Self」はそのギャラリー自身です。ここの「Template」とはいつもギャラリーを編集をする一番上の部分です。

このギャラリーは縦方向ギャラリーですので、「TemplateHeight」属性でその部分の高さを取得しています。もし横方向ギャラリーでしたら「TemplateWidth」属性を使います。

次の「TemplatePadding」属性はギャラリー内のデータと次のデータの行間の長さです。そして「Self.TemplateHeight + Self.TemplatePadding」でデータの一つ分の高さを出して、それをデータの数で掛けて全データを出した時の長さをそのギャラリーの高さにしているのです。

次にその画面の高さの変更をする必要があります。

```ruby:その画面の「Height」属性
If(
    Not(Self.Printing),
    Max(
        App.Height,
        App.MinScreenHeight
    ),
    (Gallery1.TemplateHeight + Gallery1.TemplatePadding) * CountRows(Gallery1.AllItems) + Gallery1.Y
)
```

この画面の「Height」属性の元々の数式は上記のMax関数の部分です。

注意点は今まで印刷中を表すのに「Parent.Printing」にしてましたが、これは画面の属性なので「Self.Printing」にしています。

印刷中に実行する第三引数の数式内でさっきは「Self」を使っていましたが、今度はギャラリーの外から取得をするのでそのギャラリー名の「Gallery1」にしています。

最後に「Gallery1.Y」を足しています。これはギャラリーの縦方向の「位置」でギャラリーの上の部分の長さをギャラリーの全体の高さに足して画面全体の高さを出しているのです。

これの印刷プレビューが下図の様になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/cdc2338a-bcf6-f7c3-c559-8f17965b371e.png)

##しかし、これでも不十分。MSの改善を期待したい。##
今回の例ではギャラリーに17個のデータしかないので全てのデータを印刷できました。また、上の印刷プレビュー画像を見るともう少し余白があります。

しかし、この印刷機能は最初の一ページしか印刷ができないのです。フォントを小さくしたりの多少の対応はできますが、明らかに沢山のデータを印刷する事ができません。今後のマイクロソフトの改善に期待しましょう。

限定的ではありますが、今回ご紹介した方法で印刷機能を付ける事、また作ったアプリをMS Teams内のチームのタブに付ける事で多くの事ができると思います。（MS Teamsとの連携は下記のリンクの記事で詳述しています。）

「MS Accessの終焉？デスクトップでもPowerApps【PowerApps＋MS Teams】」
https://econoshift.com/ja/powerapps-and-ms-teams/