はじめに
業務現場では、情報共有の迅速化と効率化が求められています。特にチーム内での情報共有がスムーズに行われないと、業務の遅延やミスが発生する可能性があります。これを解決するために、適切なツールを活用したシステムの構築が重要です。
その解決方法の一つとして、Microsoft Teams、Power Apps、Power Automate、Dataverse for Teams、SharePointリストを組み合わせた仕組みが挙げられます。
ここでは、これらのツールを活用して教育現場において学生からの相談内容を記録し、チーム内で情報を共有できるサンプルアプリを構築します。このアプリを使用することで、相談内容を一元管理し、迅速な情報共有を実現できます。
なお、この記事は Power Apps および Power Automate の基本操作ができる方を対象としています。Power Apps/Automate の基本操作から学びたい方は、別途関連サイトや書籍を参考にしていただくことをおすすめします。
各ツールの概要
- Microsoft Teams: コミュニケーションとコラボレーションを効率化するプラットフォームで、アプリをチーム内で共有・利用する基盤となります。
- Power Apps: コーディング不要でアプリを作成できるツールです。ユーザーインターフェースを構築します。Power Apps のキャンバスアプリを利用してさまざまな機能を実装しています。
- Power Automate: 自動化フローを構築するツールです。データ処理や通知の自動化を実現します。本アプリでは相談記録データ登録や削除、基本情報のインポート、記録一覧のエクスポートなどで使用しています。
- Dataverse for Teams: Teams 専用のデータベース機能です。相談記録データを保存・管理します。相談記録にはセンシティブな内容が含まれることも考えられるため、行ごとにアクセス権を細かく設定できる Dataverse for Teams を採用しています。
- SharePoint リスト: スプレッドシートのように行と列で構成されるデータベースの一形態であり、扱いやすい一方で、大規模なデータセットに対するパフォーマンスの問題や、セキュリティの面で制限がある場合があります。ここでは基本情報を保存・管理します。
サンプルアプリの構築手順
(1)Dataverse for Teams でテーブルの作成: 学生名、相談日、相談内容などのカラムを持つテーブルを作成します。
(2)Power Apps でアプリを構築:

- レイアウト設計: ホーム画面、記録登録画面、編集画面を作成。
- データ接続: Dataverse for Teams および SharePoint リストと接続。
- 各機能の実装: 各コントロールのプロパティや関数を設定し、アプリの機能を実装します。
(3)Power Automate でフローの作成: データ処理の自動化: 記録の Excel エクスポートや通知の自動送信を設定します。
(4)Microsoft Teams でアプリを共有: 作成したアプリを Teams のチームに追加し、メンバーが利用できるようにします。
サンプルアプリの主な機能
本アプリが提供する主な機能と、それを実現するために使用した Power Apps のコントロールや関数、Power Automate の自動化フローについて解説します。これにより、チーム内の情報共有がどのように実現されているのかを具体的にご紹介します。
なお、各プロパティやアクションに示しているコードはサンプルであり、全体の一部を掲載しています。
メイン画面の構成

- [学生抽出] ボタンをクリックすると抽出条件フォームが表示されます。
- [学生抽出] ボタン右側のアイコンで基本情報のインポートができます(管理者のみの機能)。
- 抽出結果は抽出結果ブロックに一覧で表示されます。
- 抽出結果一覧から任意の学生をクリックすると基本情報ブロックに基本情報が表示されます。
- 基本情報は種別でカテゴライズされ、それぞれのボタンをクリックすると切り替えられます。
- 同時に選択した学生に対応記録があれば対応記録ブロックに対応記録の一覧が表示されます。
- 対応記録は種別でカテゴライズされ、それぞれのボタンをクリックすると切り替えられます。
- 対応記録操作ボタンで新規登録や対応記録の一覧から選択した項目の編集、閲覧ができます。
- 相談履歴をクリックするとすべての相談履歴を一覧にしたページを開きます。
対象学生の抽出

- 抽出条件フォームの表示
コンテナはデフォルトでは非表示に設定されていますが、[学生抽出] ボタンの OnSelect アクションにコンテキスト変数を用いた処理を設定することで、コンテナの Visible プロパティを切り替えて表示・非表示を制御しています。
//「学生抽出」ボタン : OnSelectアクション UpdateContext({コンテキスト変数:true}) //「抽出フォーム」コンテナ : Visibleプロパティ コンテキスト変数(true or false)
Microsoft Power App(以下、Power Apps)は、専門性の高い技術や開発の経験を持たなくてもビジネス ニーズに対応するモバイル アプリや Webアプリを比較的簡単に作成できるローコード ツールです。 Micro[…]
- 抽出条件の入力と決定
「抽出条件フォーム」内のテキストボックスやコンボボックスに抽出条件を入力し、[決定] ボタンをクリックすると、指定した条件に基づいて対象学生が抽出されます。
入力された抽出条件はコンテキスト変数に保存されます。それぞれの条件を変数に格納することで、抽出条件が整理され、抽出結果の表示に使用されます。抽出結果は抽出結果ブロックのギャラリーに一覧形式で表示されます。
//「抽出フォーム」- 「決定」ボタン - Onselectアクション UpdateContext({ContextGakuseiBango:TextBoxGakuseiBango.Value}); UpdateContext({ContextNyugakuNendo:TextBoxNyugakuNendo.Value}); UpdateContext({ContextGakuseiSei:TextBoxGakuseiSei.Value}); UpdateContext({ContextGakuseiMei:TextBoxGakuseiMei.Value}); UpdateContext({ContextFuriganaSei:TextBoxFuriganaSei.Value}); UpdateContext({ContextFuriganaMei:TextBoxFuriganaMei.Value}); UpdateContext({ContextSyozoku:TextBoxSyozoku.Value}); UpdateContext({ContextSodanKibo:ComboBoxSodanKibo.Selected.Value});
対象学生の情報表示

- 抽出結果一覧の表示
前述の抽出条件に基づき、コンテキスト変数を活用して「抽出結果ギャラリー」に対象学生の一覧が表示されます。このギャラリーでは、Items プロパティに Filter 関数と Sort 関数を組み合わせた式を設定し、条件に合致するデータを絞り込んで表示しています。
Filter 関数は、抽出条件に応じてデータをフィルタリングする役割を果たし、Sort 関数は、結果を指定したフィールド(例: 学籍番号)の昇順または降順に並べ替えます。これにより、抽出条件に合致する学生のデータを見やすい形で一覧表示できます。
//「抽出結果」ギャラリー : Itemsプロパティ Sort( Filter(データソース, StartsWith(入学年度,Text(ContextNyugakuNendo)) && StartsWith(学籍番号,Text(ContextGakuseiBango)) && StartsWith('所属(専攻コース)',Text(ContextSyozoku)) && StartsWith('氏名(姓)',Text(ContextGakuseiSei)) && StartsWith('氏名(名)',Text(ContextGakuseiMei)) && StartsWith('フリガナ(姓)',Text(ContextFuriganaSei)) && StartsWith('フリガナ(名)',Text(ContextFuriganaMei)) && StartsWith('相談希望(あり・なし)',Text(ContextSodanKibo)) ) ,学籍番号,SortOrder.Ascending))
- 基本情報の表示
「抽出結果ギャラリー」で任意の学生をクリックすると、その学生の基本情報が「基本情報ブロック」に表示されます。この機能では、基本情報フォームの DataSource プロパティにデータソース(例: SharePoint リスト)を指定し、Items プロパティにはギャラリーで選択された行(例: 学生番号)を設定します。これにより、選択された学生の情報が動的に切り替わります。
また、学生を選択すると、基本情報コンテナの Visible プロパティが切り替わり、対象学生の情報が表示される仕組みにしています。
さらに、初期状態では、基本情報ブロックにあらかじめデフォルトの学生情報を表示する設定を行っています。このデフォルト情報は、初期データや特定の条件に基づいて表示されます。
// 基本情報フォームの設定 DataSourceプロパティ: データソース(例: SharePointリスト) Itemsプロパティ: GalleryGakuseiList.Selected // 基本情報コンテナの初回表示処理 If(GakuseiKihonNumber = 0, UpdateContext({GakuseiKihonNumber: 1})); // フォームモードの設定 UpdateContext({Form_GakuseiKihon_FormMode: FormMode.View});
Microsoft Power App(以下、Power Apps)は、専門性の高い技術や開発の経験を持たなくてもビジネス ニーズに対応するモバイル アプリや Webアプリを比較的簡単に作成できるローコード ツールです。 Micro[…]
基本情報の編集

- 基本情報の編集フォームへの遷移
「基本情報編集アイコン」をクリックすると、基本情報フォームが編集モードに切り替わります。この機能は、フォームの FormModeプロパティを動的に変更することで実現しています。
具体的には、編集アイコンのクリック時に UpdateContext関数を使用してコンテキスト変数の値を更新し、フォームの動作を編集モードに変更します。
// 基本情報編集アイコン:OnSelectアクション UpdateContext({Form_GakuseiKihon_FormMode:FormMode.Edit});
- 基本情報の編集
基本情報編集モードでは、各項目を編集した後、「保存する」アイコンをクリックすると、編集内容がデータソースに保存されます。この保存処理では、学生の基本情報種別に応じて適切なフォームを選択し、そのフォームをサブミット(送信)する仕組みを実装しています。
// 保存するアイコン:OnSelectアクション Switch(GakuseiKihonNumber, 1,SubmitForm(Form_Gakusei_Kihon_1), 2,SubmitForm(Form_Gakusei_Kihon_2), 3,SubmitForm(Form_Gakusei_Kihon_3), 4,SubmitForm(Form_Gakusei_Kihon_4), 5,SubmitForm(Form_Gakusei_Kihon_5));
はじめに Microsoft Power App(以下、Power Apps)は、専門性の高い技術や開発の経験を持たなくてもビジネス ニーズに対応するモバイル アプリや Webアプリを比較的簡単に作成できるローコード ツールです。 […]
基本情報種別の切り替え

基本情報種別ボタンをクリックすると、選択された基本情報種別に応じて表示される内容が切り替わります。この機能では、コンテキスト変数(GakuseiKihonNumber)を更新し、切り替え処理を実現しています。詳細画面を表示するために、関連するコンテキスト変数を更新します。
// 基本情報種別ボタン - OnSelectアクション UpdateContext({GakuseiKihonNumber: 2}); // コンテナやフォームの表示条件(例: Visibleプロパティ) If(GakuseiKihonNumber = 2, true, false);
対応記録の新規登録

- 詳細画面の表示
対応記録の「新規」ボタンをクリックすると、選択された学生の新しい対応記録を登録するための詳細画面が表示されます。この処理は、OnSelect アクションで複数のコンテキスト変数を更新することで、画面の状態を制御しています。主な処理の流れは次のとおりです。
(1)「新規登録」モードに切り替え、画面を適切に制御します。
(2)新しい対応記録レコード用に GUID() を使用して一意な ID を生成します。この ID はデータの識別に使用されます。
(3)詳細画面を表示するために、関連するコンテキスト変数を更新します。
// 新規ボタン - OnSelectアクション UpdateContext({MyMode: "new"}); UpdateContext({Sodan_SelectID: GUID()}); UpdateContext({Container_SodanDetail_Visible_Status: true});
- リッチテキストエディターと編集フォームの使用
相談内容はリッチテキストエディターコントロールを使用します。その他の情報は編集フォーム内に配置され、入力項目が整理されています。
なお、データベースは、チーム内での共有を前提とした情報(例: 学生名や対応日)を保存する SharePoint リストと、センシティブな相談内容を柔軟に共有範囲を切り替えながら管理する Dataverse で構成します。
- 登録ボタンの処理
「登録」ボタンをクリックすると、相談内容の入力文字数をチェックし、3,000 文字以内であることを確認します。文字数が制限を超えた場合、エラーメッセージを表示します。問題がなければ、SubmitForm 関数を実行してデータをデータベースに書き込みます。
// 詳細画面登録ボタン - OnSelectアクション UpdateContext({RichTextSodanNaiyoTmp: RichTextEditorSodanNaiyo.HtmlText}); If( Len(RichTextSodanNaiyoTmp) >= 3000, Notify( "相談内容の文字数は3,000文字以下にしてください(" & Len(RichTextSodanNaiyoTmp) & ")", NotificationType.Error ), SubmitForm(FormSodanDetail) );
- 編集フォームのOnSuccessアクション
編集フォームのデータの書き込みが成功すると、Power Automate のフロー(insert_sodan_naiyo)を呼び出してリッチテキストエディターの内容(相談内容)をデータベースに登録します。エラーが発生した場合はエラーメッセージを表示し、成功した場合は登録完了のメッセージを表示します。
// 編集フォーム - OnSuccesアクション IfError( insert_sodan_naiyo.Run( TextBoxGaiyoGUID.Value, RichTextEditorSodanNaiyo.HtmlText, TextBoxKyoyuHani.Value, User().Email ), UpdateContext({ TorokuMessText: "登録できませんでした。", TorokuMessColor: "red", TourokuMessVisibleStatus: true }), UpdateContext({ TorokuMessText: "登録しました。", TorokuMessColor: "black", TourokuMessVisibleStatus: true }) );
Microsoft Power App(以下、Power Apps)は、専門性の高い技術や開発の経験を持たなくてもビジネス ニーズに対応するモバイル アプリや Webアプリを比較的簡単に作成できるローコード ツールです。 Micro[…]
対応記録の閲覧

「閲覧」ボタンをクリックすると、対応記録が閲覧モードで開きます。ただし、「閲覧」ボタンは記録の作成者か共有設定が「センター内(チーム内での共有)」の場合にボタンが有効化されます。
// 「閲覧」ボタン:DisplayModeプロパティ If( User().Email = DataTableSodanKiroku.Selected.ユーザーEmail || LookUp(ssc_sodan_gaiyo, ID = DataTableSodanKiroku.Selected.ID, Text(共有範囲)) = "センター内", DisplayMode.Edit, DisplayMode.Disabled ) //「閲覧」ボタン:OnSelectアクション UpdateContext({MyMode:"view"}); UpdateContext({Sodan_SelectID:DataTableSodanKiroku.Selected.ID}); UpdateContext({Container_SodanDetail_Visible_Status:true});
対応記録の編集

対応記録の編集は、新規登録の操作とほぼ同様の手順で行います。「編集」ボタンをクリックすると、選択した対応記録画面が編集モードで開きます。ただし、編集が可能なのは記録の作成者のみです。作成者以外はボタンが無効化され、編集権限を持ちません。
// 「編集」ボタン:DisplayModeプロパティ If(User().Email=DataTableSodanKiroku.Selected.ユーザーEmail,DisplayMode.Edit,DisplayMode.Disabled) // 「編集」ボタン:OnSelectアクション UpdateContext({MyMode:"edit"}); UpdateContext({Sodan_SelectID:DataTableSodanKiroku.Selected.ID}); UpdateContext({Container_SodanDetail_Visible_Status:true}); UpdateContext({Kyoyu_Hani_DBValue:LookUp(ssc_sodan_gaiyo,ID=DataTableSodanKiroku.Selected.ID,共有範囲)});
編集フォームにデータを入力後に、「登録」ボタンをクリックすると、SubmitForm 関数を実行して相談内容以外のデータをデータベースに書き込みます。
編集フォームの登録が成功すると、OnSuccess アクションにより、Power Automate のフロー(update_sodan_naiyo)を呼び出して相談内容のリッチテキストエディターのデータ(相談内容)を登録します。共有範囲の値に基づいて、適切なアクセス権限を設定し、柔軟にデータを管理できるように設計されています。
- 共有範囲が公開の場合 → Dataverse の共同作業テーブルに登録
- 共有範囲が非公開の場合 → Dataverse の非公開テーブルに登録
この仕組みにより、適切なユーザーのみが対応記録を閲覧・編集できるようにしています。
// 編集フォーム - OnSuccesアクション IfError( update_sodan_naiyo.Run( TextBoxNaiyoGUID.Value, TextBoxGaiyoGUID.Value, RichTextEditorSodanNaiyo.HtmlText, TextBoxKyoyuHani.Value, User().Email ), UpdateContext({ TorokuMessText:"登録できませんでした。", TorokuMessColor:"red", TourokuMessVisibleStatus:true }), UpdateContext({ TorokuMessText:"登録しました。", TorokuMessColor:"black", TourokuMessVisibleStatus:true }) );
はじめに 現代のビジネス環境では、情報の適切な共有とセキュリティ管理が重要です。特に、スタッフ間で共有すべき情報と、非公開にすべき情報を適切に管理することは、業務の効率化と情報セキュリティの両立に不可欠です。この記事では、Micro[…]
対応記録一覧の表示

メイン画面から「相談記録」アイコンを選択すると、相談記録一覧ページが表示されます。相談記録一覧は、データテーブルコントロールを使用して表示されます。
このテーブルでは、相談日時を基準に日付範囲を設定でき、さらに「共有範囲」や「対応予定」などのフィルタリングオプションを用いて、必要な記録を絞り込むことができます。
// 相談記録アイコン - OnSelectアクション Navigate(SodanList,ScreenTransition.Fade) // データテーブル - Itemsプロパティ With( {myEndDate:DateAdd(DateValue(DatePicker表示範囲至.Value),1)-1+Time(23,59,59)}, Sort( AddColumns( Filter(データソース, (相談日時>=DatePicker表示範囲始.Value&&相談日時<=myEndDate) && (ComboBox共有範囲.Selected.Text="すべて" || StartsWith(ComboBox共有範囲.Selected.Text,Text(共有範囲))) && (ComboBox対応予定.Selected.Text="すべて" || StartsWith(ComboBox対応予定.Selected.Text,Text(対応予定))) ), 学生氏名, LookUp(siu_profile_from_2024,学籍番号=crbeb_gakusekibango,'氏名(姓)'&" "&'氏名(名)') ), 相談日時,SortOrder.Descending ) )
Microsoft Power App(以下、Power Apps)は、専門性の高い技術や開発の経験を持たなくてもビジネス ニーズに対応するモバイル アプリや Webアプリを比較的簡単に作成できるローコード ツールです。 Micro[…]
ダブルクリックによる画面の遷移

相談記録一覧の学生番号をダブルクリックすると、その学生に関連する記録の記録詳細画面が表示されます。この遷移を実現するために、タイマーコントロールとコンテキスト変数を活用しています。
UpdateContext({is_TimerStart:true}); If(is_DoubleClick&&Label2.Text="センター内", UpdateContext({is_SyosaiVisible:true}); UpdateContext({Sodan_SelectID:DataTableSodanList.Selected.ID}); UpdateContext({Select_GakuseiBango:DataTableSodanList.Selected.学籍番号}); UpdateContext({Select_GakuseiSimei:DataTableSodanList.Selected.学生氏名}); );
Microsoft Power App(以下、Power Apps)は、専門性の高い技術や開発の経験を持たなくてもビジネス ニーズに対応するモバイル アプリや Webアプリを比較的簡単に作成できるローコード ツールです。 Micro[…]
基本情報のインポート

本システムでは、学生の基本情報を所定のレイアウトの Excel ファイルから SharePoint リストへデータをインポートする機能を提供しています。この処理は Power Automate を使用しており、Excel のデータを SharePoint リストに転送するフローを実装しています。
※ 本資料では Power Automate のフロー詳細については割愛します。
UpdateContext({ImportMess:true}); UpdateContext({Container_ImportOption_Visible_Status:false}); IfError(import_profile_data.Run(RadioGroupImportSyoriHouhou.Selected.Value), UpdateContext({ImportMess:false});Notify("インポートが失敗しました", NotificationType.Error), UpdateContext({ImportMess:false});Notify("インポートが成功しました", NotificationType.Success)); Refresh(siu_profile_from_2024);
まとめ
本稿では、Microsoft Teams、Power Apps、Power Automate、Dataverse for Teams、SharePoint リストを組み合わせた相談記録アプリの構築事例を紹介しました。このアプリを活用することで、相談内容の一元管理、迅速な情報共有、業務効率化を実現できます。
今回紹介した機能以外にも、Power Platform の柔軟性を活かして、さまざまな機能を追加することができます。例えば、相談内容の分析機能や、担当者への通知機能などを実装することで、より高度な相談管理システムを構築することができます。
本記事が、Power Platform を活用したシステム開発の一助となれば幸いです。