Power Appsをつかって脱PPAPアプリ作成② ～Power Apps編～

前回は、「[Power Appsをつかって脱PPAPアプリ作成① ～Power Automate編～](https://qiita.com/TND_SS/items/3a8dda6a723e374c8122)」で、Power Automateで脱PPAPのフローを作成しました。
今回の第２回では、連携するアプリをPower Appsで作成する手順を紹介します。

## PPAPとは
取引先などにファイルを共有する際、パスワード付きZIPファイルを送信し、別のメールでパスワードを送信するといった流れを一度は経験したことがあると思います。この一連の手順を「PPAP」と呼びます。

- P：パスワード付きZIP暗号化ファイルを送ります
- P：パスワードを送ります
- A：暗号化
- P：プロトコル

## Power Appsでアプリ化
「[Power Automateをつかって脱PPAP](https://mssp.tenda.co.jp/blog/office365/3715/)」では、脱PPAPの手段として、Power Automateでファイルを共有する方法を紹介しました。
しかし、以下のような課題があります。

- ファイル共有時に毎回フローの変数を変更、保存してから実行する必要がある
- 詳細な共有履歴が確認できない

今回は、上記の課題を解消するために、ファイル共有を自動化するアプリをPower Appsで作成する方法をご紹介します。

## Power Appsアプリの全体像
今回Power Appsで作成するアプリの画面イメージです。計３画面作成します。

- 一覧画面
ファイルの共有履歴を一覧表示する画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/b7583e13-bac4-462c-920f-e858c96365e6.png)


- 詳細画面
一覧画面で選択したアイテムの詳細情報を確認する画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/bf39549f-973f-425d-af6e-012d32d3febc.png)


- 入力画面
共有したいファイルの情報やファイルの権限、共有者を入力する画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/67b5e1be-2b79-4646-97ad-1207a9ef4369.png)

それではPower Appsでアプリを作成していきましょう。

## Share PointリストとPower Appsの統合
はじめに、「[Power Appsをつかって脱PPAPアプリ作成① ～Power Automate編～](https://qiita.com/TND_SS/items/3a8dda6a723e374c8122)」で作成しておいたSharePointリストにテストデータを1～2件登録しておきます。
※データがあるとレイアウトを変更しやすいため

（例）テストデータ登録後のリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/b9acc998-0406-4f13-8962-ccdf9b17b01c.png)

1.	Share Pointリストを開き、[統合]＞[Power Apps]＞[アプリの作成]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/b667efd6-3eec-4813-a916-fe9924d3a487.png)

2.	任意のアプリ名を入力し、[作成]ボタンをクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/d042fcc7-3e8a-4ebe-96fe-014b424e9088.png" width="180">

以上でShare PointリストとPower Appsが統合されました。
アプリを確認するとスクリーンが３つ作成されています。

## 画面表示と名称の設定
はじめに画面の設定を変更します。

1.	スクロールせず画面に表示したいので、レイアウトを縦から横に変更します。三点リーダーアイコンから[設定]を選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/d3708cd1-e7ed-433f-957d-c886e844ac82.png)


2.	[表示]の向きを「縦」から「横」に変更します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/49a888b7-fc79-43a1-8715-c4e625aaa989.png" width="280">


3.	表示を横に変更したことで、初期状態は以下のようなレイアウトになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/1e92bfd2-63bc-4033-bfe5-a45fd0230ccd.png)

4.	スクリーン名を変更します。
初期状態は編集画面ですが、今回は新規登録画面にするため名称を変更します。

    <table>
  <thead>
    <tr>
      <th>対象</th> <th>変更前</th> <th>変更後</th>
    </tr>
  </thead>
  <tr>
    <td> スクリーン名 </td> <td>EditScreen1</td> <td>NewScreen1</td>
  </tr>
  <tr>
    <td> フォーム名 </td> <td>EditForm1</td> <td>NewForm1</td>
  </tr>
</table>

## 一覧画面の設定
アプリの一覧画面に対して、レイアウトと一覧表示項目、画面の表示順などを設定します。

#### ▼レイアウトの設定
一覧画面である「BrowseScreen1」スクリーンのレイアウトの設定を行います。
文字サイズやカラーやフォントなどは任意で設定してください。


#### ▼項目の設定
1.　一覧画面に表示する項目を設定します。
共有した日時、ファイル名、共有者のメールアドレスを一覧に表示します。

| コントロール名1   | コントロール名2 | プロパティ | 設定値                                      |
|------------------|-----------------|------------|---------------------------------------------|
| BrowseGallery1   | Title1          | Text       | Text(ThisItem.登録日時,"yyyy/mm/dd hh:mm", "ja-JP") |
| BrowseGallery1   | Subtitle1       | Text       | ThisItem.ファイル名                         |
| BrowseGallery1   | Body1           | Text       | ThisItem.共有先アドレス                     |


2.　一覧に表示する項目のフォント位置やサイズを設定します。
フォント位置やサイズは任意で設定してください。

3.　項目名のヘッダーを作成します。BrowseScreen1 を選択した状態で[挿入]から[テキストラベル]を選択します。3回繰り返し、Label1～3を挿入します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/e9417b51-e38d-4de3-a9bc-b9ca5607856c.png" width="200">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/6bb578c4-ead5-41b9-b1fe-210cd0ce39c8.png" width="200">

4.　BrowseScreen1に挿入したテキストラベルの名前を変更します。
<table>
  <thead>
    <tr>
      <th>変更前</th> <th>変更後</th> <th>備考</th>
    </tr>
  </thead>
  <tr>
    <td> Label1 </td> <td>LabelDate</td> <td>共有日時</td>
  </tr>
  <tr>
    <td> Label2 </td> <td>LabelFileName</td> <td>共有ファイル名</td>
  </tr>
  <tr>
    <td> Label3 </td> <td>LabelAddress</td> <td>共有先アドレス</td>
  </tr>
</table>

5.　BrowseScreen1に挿入したヘッダー（テキストラベル）のプロパティを変更します。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>コントロール名</th>
      <th>プロパティ</th>
      <th>設定値</th>
      <th>備考</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="1">LabelFileName</td>
      <td>Text</td>
      <td>"ファイル名"</td>
      <td>ヘッダー文字(ファイル名)</td>
    </tr>
    <tr>
      <td rowspan="1">LabelAddress</td>
      <td>Text</td>
      <td>"共有先アドレス"</td>
      <td>ヘッダー文字(共有先アドレス)</td>
    </tr>
  </tbody>
</table>

#### ▼ソート順の設定
1.　BrowseGallery1のItemsにソート順の設定をします。


※ 設定値の`[@PPAPdemo]`は「[Power Appsをつかって脱PPAPアプリ作成① ～Power Automate編～](https://qiita.com/TND_SS/items/3a8dda6a723e374c8122)」で作成したSharePointリスト名です。自分の環境に合わせて変更してください。
| コントロール名 | プロパティ | 設定値             |
|----------------|------------|--------------------------|
| BrowseGallery1 | Items      | 下記参照 |

【設定値】
```PowerApps
SortByColumns(
    Filter(
        [@PPAPdemo], 
        StartsWith(共有先アドレス, TextSearchBox1.Text) || StartsWith(ファイル名, TextSearchBox1.Text)
    ), 
    "Created", 
    If(SortDescending1, SortOrder.Descending, SortOrder.Ascending)
)
```
以上で、一覧画面「BrowseScreen1」スクリーンの設定は完了です。
画面レイアウトは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/39dc924d-03db-449b-9d46-3c097f725e4e.png)


## 詳細画面の設定
アプリの詳細画面に対して、レイアウトを設定します。

#### ▼レイアウトの設定
1.　詳細画面である「DetailScreen1」スクリーンのカード（項目名_DataCard1）を編集するため、すべてのカードのロック解除をします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/b8a5bd09-35c3-4cf1-a587-66852447d13f.png" width="190">

2.　詳細画面の情報を2列で表示するため、「DetailForm1」のプロパティで「列」を「１」から「２」に変更します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/4708a1dd-176e-4b14-9ffc-9232aca4c858.png" width="190">

3.　ゴミ箱のアイコン「IconDelete1」（削除）と鉛筆のアイコン「IconEdit1」（編集）を削除します。
詳細画面は詳細情報の確認用なので、今回は削除と編集の機能は不要です。

4.　「DetailScreen1」スクリーンのヘッダー部分のレイアウトの設定を行います。
文字サイズやカラーやフォントなどは任意で設定してください。


5.　「DetailScreen1」スクリーンの一覧部分のレイアウトの設定を行います。
文字サイズやカラーやフォントなどは任意で設定してください。


設定が完了すると、以下のような画面レイアウトになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/7fcad2b2-fa36-4380-b6ff-edb9ae58c462.png" width="500">

カードをドラッグ&ドロップで動かすと項目の並び順を変更することができます。
参考までに、今回はこのように配置しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/bf251257-d526-4bf6-91a0-9be172c5bd69.png" width="500">

## 登録画面の設定
アプリの登録画面に対して、レイアウトや入力フォームの設定、登録処理を設定します。

#### ▼レイアウトの設定
1.　登録画面である「NewScreen1」スクリーンのカード（項目名_DataCard2）を編集するため、すべてのカードのロック解除をします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/5e900e00-353b-462e-bb4e-390f5c0f0ad4.png" width="190">

2.　登録画面の情報を2列で表示するため、「NewForm1」のプロパティの「列」を「１」から「２」に変更します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/ca56a0d4-4ebf-4141-8eaa-6fbc3fb7f02e.png" width="190">

3.　チェックマークアイコンを飛行機アイコンに変更します。
コントロール「IconAccept1」のアイコンを「チェック」から「送信」に変更します。
飛行機アイコンをクリックすると登録処理が実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/3e5f4170-a81f-45ec-86cc-6a7b6be3386c.png)

4.　「NewScreen1」スクリーンのヘッダー部分のレイアウトの設定を行います。
文字サイズやカラーやフォントなどは任意で設定してください。

5.　「NewScreen1」スクリーンの「NewForm1」配下にある「URL_DataCard2」は、登録画面には必要ないため削除します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/bca2f7df-7a9c-4ac6-8ad1-35759739321e.png" width="230">

6.　「NewForm1」スクリーンの入力部分のレイアウトの設定を行います。
文字サイズやカラーやフォントなどは任意で設定してください。


設定が完了すると、以下のような画面レイアウトになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/3f23d82a-4a80-412a-b9a7-0e0e5da39cea.png)

入力ボックスの幅と高さはカードをドラッグすることで変更できるので、任意で変更してください。

項目の並び順は「NewScreen1」の編集時と同様に、カードを移動することで変更が可能です。
参考までに、今回はこのように配置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/831d5b3c-249b-427d-9eed-e8b8b7f5d0cd.png)

※ カードの配置やサイズ調整が思うようにいかない場合は、NewFormのプロパティで、「列へのスナップ」を「オン」に設定し、再度「オフ」に切り替えることで、コントロールが可能になります。詳細は[こちら](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/working-with-form-layout)をご確認ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/3a09c3b8-49c9-48af-8d88-a1a5863d658b.png)

#### ▼ドロップダウンの変更
権限のドロップダウンをラジオボタンに変更します。
選択肢が「編集」と「閲覧」の２択なので、ドロップダウンである必要性がないためです。
※	この設定は必須ではありません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/cf3a149c-26b7-4185-988e-0a0e87ee9291.png" width="230">

1.　NewForm1の権限カードを選択し、ラジオボタンを追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/3aec60f4-e45e-451e-b6f6-d7fd7b9947b1.png" width="230">

2.　追加したラジオボタンを以下のとおり設定します。
位置（X,Yプロパティ）は任意で設定してください。
※	設定値の`[@PPAPdemo]`はSharePointリスト名です。自分の環境に合わせて変更してください。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>コントロール名</th>
      <th>プロパティ</th>
      <th>設定値</th>
      <th>備考</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="2">Radio1</td>
      <td>Items</td>
      <td>Choices([＠PPAPdemo].権限)</td>
      <td>表示レコード</td>
    </tr>
    <tr>
      <td>Default</td>
      <td>“閲覧”</td>
      <td>デフォルトで「閲覧」を選択</td>
    </tr>
  </tbody>
</table>

3.　権限カード（権限_DataCard）を以下のとおり設定します。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>カード名</th>
      <th>プロパティ</th>
      <th>設定値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="1">権限_DataCard2</td>
      <td>Update</td>
      <td>Radio1.Selected</td>
    </tr>
  </tbody>
</table>

4.　コンボボックス（DataCardValue）は必要ないため削除します。削除すると、ErrorMessageのYプロパティの参照先がなくなりエラーになりますが、こちらも必要ないため削除します。

#### ▼フォームの設定
入力フォーム（NewForm1）の項目を設定していきます。

1.　現在、画面にはSharePointリストの情報が表示されています。これは既定モードが「編集」であるためです。
新規入力画面にするため、既定モードを「新規」に変更します。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>プロパティ</th>
      <th>設定値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>DefaultMode</td>
      <td>FormMode.New</td>
    </tr>
  </tbody>
</table>


2.　カード（項目名_DataCard）のコントロール名から項目名を判別しにくいので変更します。以下に記載のないものは既定値のままとします。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>カード名</th>
      <th colspan="2">コントロール名</th>
    </tr>
    <tr>
      <th></th>
      <th>変更前</th>
      <th>変更後</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>サイトのアドレス</td>
      <td>DataCardValue9</td>
      <td>TextUrl</td>
    </tr>
    <tr>
      <td>ライブラリ名</td>
      <td>DataCardValue10</td>
      <td>TextLibrary</td>
    </tr>
    <tr>
      <td>ファイル名</td>
      <td>DataCardValue11</td>
      <td>TextFile</td>
    </tr>
    <tr>
      <td>共有先アドレス</td>
      <td>DataCardValue14</td>
      <td>TextAddress</td>
    </tr>
    <tr>
      <td>通知</td>
      <td>DataCardValue13</td>
      <td>Toggle1</td>
    </tr>
    <tr>
      <td>メッセージ</td>
      <td>DataCardValue15</td>
      <td>TextMessage</td>
    </tr>
  </tbody>
</table>

3.　入力ボックスに入力例としてテキストを設定します。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>カード名</th>
      <th>コントロール</th>
      <th colspan="2">プロパティ</th>
      <th>設定値（例）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>サイトのアドレス</td>
      <td>TextUrl</td>
      <td colspan="2">Default</td>
      <td>"https://tenant.sharepoint.com/sites/name"</td>
    </tr>
    <tr>
      <td>ライブラリ名</td>
      <td>TextLibrary</td>
      <td colspan="2"></td>
      <td>"ドキュメント"</td>
    </tr>
    <tr>
      <td>ファイル名</td>
      <td>TextFile</td>
      <td colspan="2"></td>
      <td>"test.xlsx"</td>
    </tr>
    <tr>
      <td>共有先アドレス</td>
      <td>TextAddress</td>
      <td colspan="2"></td>
      <td>"dummy01@XXX.co.jp"</td>
    </tr>
    <tr>
      <td>メッセージ</td>
      <td>TextMessage</td>
      <td colspan="2"></td>
      <td>"ファイルを共有します。"</td>
    </tr>
  </tbody>
</table>

4.　メッセージの入力ボックスは、「単一行」の設定になっています。
改行あり・複数行入力できるように変更します。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>カード</th>
      <th>コントロール</th>
      <th>プロパティ</th>
      <th>設定値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>メッセージ_DataCard</td>
      <td>TextMessage</td>
      <td>Mode</td>
      <td>TextMode.MultiLine</td>
    </tr>
  </tbody>
</table>

5.　登録成功時の処理をフォーム入力（NewForm1）に設定します。
下記のように設定すると、登録が成功した時に一覧画面（BrowseScreen1）を表示します。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>プロパティ</th>
      <th>設定値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>OnSuccess</td>
      <td>Navigate(BrowseScreen1);</td>
    </tr>
  </tbody>
</table>

#### ▼その他の設定
1.	キャンセルアイコンの設定をします。
下記のように設定すると、アイコンをクリックした時に一覧画面へ戻ります。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>コントロール</th>
      <th>プロパティ</th>
      <th>設定値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>IconCancel1</td>
      <td>OnSelect</td>
      <td>Navigate(BrowseScreen1)</td>
    </tr>
  </tbody>
</table>

2.　通知の表示を「オン/オフ」から「する/しない」に変更します。
※この設定は必須ではありません。
<table border="1" cellpadding="5" cellspacing="0">
  <thead>
    <tr>
      <th>カード</th>
      <th>コントロール</th>
      <th>プロパティ</th>
      <th>設定値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="2">通知_DataCard</td>
      <td rowspan="2">Toggle1</td>
      <td>FalseText</td>
      <td>“しない”</td>
    </tr>
    <tr>
      <td>TrueText</td>
      <td>“する”</td>
    </tr>
  </tbody>
</table>

#### ▼登録処理の設定
右上の飛行機アイコンをクリックしたときに、登録処理が実行されるよう設定します。

1.　左のメニューよりPower Automateを選択し、[フローの追加]をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/4fb2f70f-b68f-4716-9d17-da781ced1459.png" width="200">

2.　「[Power Appsをつかって脱PPAPアプリ作成① ～Power Automate編～](https://qiita.com/TND_SS/items/3a8dda6a723e374c8122)」で作成したPower Automateのフローを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/ca57d634-58ff-49c7-abc8-02be0772071c.png" width="300">

3.　飛行機アイコン（IconAccept1）に以下の設定をします。
※下記の２つは、自分の環境に合わせて変更してください。
・「連携用ファイル共有フロー」：Power Automateフロー名
・「PPAPdemo」：SharePointリスト名

OnSelectの値
```
// 1.必須項目入力チェック
If(!IsBlank(TextUrl.Text) && !IsBlank(TextLibrary.Text) && !IsBlank(TextFile.Text) && !IsBlank(TextAddress.Text),
    // PowerAutomate処理実行
    UpdateContext({Result:
        連携用ファイル共有フロー.Run(
            TextUrl.Text,
            TextLibrary.Text,
            TextFile.Text,
            TextAddress.Text,
            Radio1.Selected.Value,
            TextMessage.Text,
            Toggle1.Value
        )
    }),
    Notify("必須項目を入力してください", NotificationType.Error);
);

// 1つ目の条件が真の場合
If(!IsBlank(TextUrl.Text) && !IsBlank(TextLibrary.Text) && !IsBlank(TextFile.Text) && !IsBlank(TextAddress.Text),
    // 2.PowerAutomateエラーチェック
    If(!IsBlankOrError(Result),
        SubmitForm(NewForm1);
        Set(GetTextSharedAddress,Result.url);
        Patch(PPAPdemo,{ID:Value(NewForm1.LastSubmit.ID)},{URL:GetTextSharedAddress}),
        Notify("エラーが発生しました。入力値またはエラー内容を確認してください。",NotificationType.Error);
    );
);

// 1つ目と2つ目の条件が真の場合
If(!IsBlank(TextUrl.Text) && !IsBlank(TextLibrary.Text) && !IsBlank(TextFile.Text) && !IsBlank(TextAddress.Text) && !IsBlankOrError(Result),
    // 3.更新処理エラーチェック
    If(!IsBlankOrError(PPAPdemo),
        Notify(Result.flowmsg,NotificationType.Success),
        Notify(Concat(Errors(PPAPdemo), Column &": "& Message), NotificationType.Error);
    );
);

```

#### ▼登録処理の補足
登録処理の流れはざっくりと下記のとおりです。

①	PowerApps内で飛行機アイコンが押下される
　・必須項目が全て入力されている場合：②へ進む
　・必須項目に入力不足がある場合：エラーメッセージを表示して入力を促す

②	Power Automateが起動し、フロー実行
　・１． SharePointリストにアイテム登録する
　・２．共有URLを変数にセットする
　・３． SharePointリストを更新(共有URLを登録)し、③へ進む
　※実行中に失敗した場合：エラーメッセージを表示して終了

③	PowerAppsに成功メッセージが表示される

## 次回の予告
これでPower Appsのアプリが完成しました。
次回（最終章）は、実装手順を確認しながら動かしてみます。ぜひご確認ください！

## 最後に
テンダでは、「こんなプロジェクトに挑戦したい」「こんなチームで働きたい」「理想のチームを創りたい」と願う仲間を求めています。
カジュアル面談も随時受付中です。ぜひ一度お話ししましょう！:relaxed:
- [募集職種一覧](https://hrmos.co/pages/tenda/jobs)
- [カジュアル面談の申込](https://hrmos.co/pages/tenda/jobs/031002/apply)
- [テンダで働く人や社風について](https://note.com/tenda_recruit)
- [テンダのMicrosoftサービス](https://mssp.tenda.co.jp/)