Power Apps だけで承認できる旅費承認アプリを作る

【O365ライセンス内でPowerApps開発】シリーズの全体説明

はじめに

こちらは、なかなか長期シリーズとなっている【O365ライセンス内でPowerApps開発】のインデックス(目次)ページです。

各ページの説明を分類ごとに行っていきます。

Vol. 1
シリーズの説明とOffice 365ライセンスにおけるPower Apps の説明

「Vol.1 はじめに – ライセンスの説明」では、このシリーズの位置づけの説明をしています。

Office 365 以外のコストを発生させたくないテーマということで、外部のデータソースとしてOffice 365についてくるSharePointを使いながら今後のアプリケーション開発を行っていこうということを説明しているポストです。

Vol. 2 〜 4
アーキテクチャの説明とSharePoint の構築
「Vol.2 SharePoint構築 – 環境の初期セットアップ」では、SharePointの説明と環境の初期セットアップを行います。
いきなりPower Appsの開発は基本的にはできません。先に接続先のデータソースを作成して準備しておき、それからPower Apps を触ることなります。
したがって、以下のようにまずはSharePoint を立ち上げることを先に説明していきます。
ここではテーブルの代表例として営業支援関連のテーブルを作成します。

「Vol.3 SharePoint構築 – データ構造の考え方」では、Power Apps からSharePointを見ると、SharePoint サイトが「データベース」、SharePoint リストが「テーブル」といった関連性となることをご理解いただきます。

MEMO
ここではテーブルを「エンティティ」と呼んでいます。
マスターデータと、機能(トランザクション)用のエンティティ一覧にはこんなものがあるとして紹介しています。これだけ作っておけばかなり高機能なアプリ開発ができるようになります。
注意
ただ、小さく始めるのをお勧めします。すぐに行き詰まりますので…。

「Vol.4 SharePoint構築 – リストの作成」では、すでにVol. 2で作ったサイトを元に、SharePoint リストを作成していく手順を紹介しています。

さてさて、ここまででデータソースの準備ができました。ついにアプリを開発していきましょう!

Vol. 5 〜 11
Power Apps によるアプリケーション開発
現在、3種類のアプリケーションの開発方法を紹介しております。

棚卸アプリの作成

「Vol.5 在庫の棚卸アプリの作成」では、SharePoint に棚卸の結果を登録していく機能の開発を行っていきます。
面白いところは、バーコードリーダー機能を参考に紹介しているところかと思います。ハンディとの代替ができる業態は一部かもしれませんが。

 

 

営業支援アプリ(タブレット&PCレイアウト)
「Vol.7」では、営業支援アプリ(タブレット&PCレイアウト)の概要の説明を行っています。

「Vol.8」では、まずは新規レコードを作成できる機能の作成までを紹介しています。

「Vol.9」では、スマホレイアウトに比べて表示できる情報をタブ切り替えにて制御する機能の開発を行います。

「Vol.10」では、顧客マスタの表示、編集機能を実装します。

「Vol.11」では、活動リストの関連付けとFilter機能の説明を行います。

8 COMMENTS

weed

YouTubeでご相談した者です。
大変申し訳ないのですが、どうしても分からないので、こちらにご相談させて下さい。

PowerApps+Outlookで予定表のアプリを作ろうとしています。
以下に詳細を記載します。

・会議スクリーン(新しい画面からの選択)を使用
・タブ分けされている内容を1つにまとめる
・時刻の選択を無くす
・期間をドロップダウン形式の時間に変える(2つのドロップダウンにして、○時:〇〇分にする)
・時刻、期間の枠以外は使用するためそのまま残す

このようなアプリを構想して作成しているのですが、この会議スクリーンが、「時刻」の選択をしないと送信ボタンが押せないようになっています。
時刻ではなくて自分で作った時間(ドロップダウン形式)にしてOutlookに書き込みできるようにするにはどの様に関数を変えたら良いか分かりません。
もし可能でしたら教えて頂ければ幸いです。よろしくお願い致します。

ギークフジワラ

weedさん、ご質問いただきありがとうございます。
主に2つのことを行いたいと理解しました。
1.Microsoft が標準でスクリーンテンプレートとして用意している会議スクリーンにて、タブ分けされている「招待」、「スケジュール」を一つのスクリーンにしたい。
2.FromToの時間形式のドロップダウン2つで時間指定をしてスケジュールしたい。

以上であっておりますでしょうか?
あと、そこそこ長くなりそうなので当Blog記事、YouTubeでの質問回答という形式で行いたいと思っております。
1つ目の回答:こちらの通り回答してみました。
2つ目の回答:こちらの通り回答してみました。
回答になっていればありがたいです。

weed

ご回答頂きありがとうございます!
関数も載せて下さっているので非常に分かりやすくて助かりました!

ちなみに、回答2についてお聞きしたいのですが、元々スクリーンに入っている時刻(全ての参加者が出席可能ですと表示されている部分)を消す事は可能なのでしょうか?
もしくは使いたくないのであれば、表示をfalseで見えなくしてしまえば良いのでしょうか?

ギークフジワラ

いえいえ!非常に面白い題材でした。
そうですね、そのラベルは参照先になっていなかったと思いますので多分消しても問題ないと思います。
安全なのはおっしゃる通りVisible = falseとすることだと思います。

weed

ご回答頂いたページを参考に作成してみたのですが、細かい点で気になる所があったので再度質問させて下さい。

・時間Fromを15分刻みで作ったが、00分と30分しか反映されない
(時間は2つのDropdownでHourとMinuteを分けています、時間Toは15分・45分も反映できます)

・時間Fromと時間Toの時間選択(Hour)が8~17時までしか選択できない
(深夜作業時間を入れたい場合に選択できない)
→日付のOnselectのClearCollect(MeetingTime~)が怪しいと思ったのですが、変更しても反映できませんでした

・Outlook側の問題で、スケジュールの詳細の編集を行うと、タイムゾーンがUTCになっており、PowerAppsで入れた時間とずれている
(大元のタイムゾーン設定を東京にしていますが、編集しようとするとUTCに戻っています)

もとの会議スクリーンの設定を変更したい場合、どこの関数を変更すれば良いのでしょうか?

ギークフジワラ

weedさん、ご質問いただきありがとうございます。
PeopleBrowseGallery*の中にあるTitle*というテキストコントロールのOnSelect プロパティのClearCllect関数が残っていていることによるのではないかと思います。もし残っていない、という場合はキャッシュかもしれません。Fromは8からを基準として、ClearCllectを修正する前にMyPeopleを選択している場合、MeetingTimeコレクションの値が起算されてしまいます。
こんな関数が残っていたらブログの関数に修正が必要です。
ClearCollect(MeetingTimes, AddColumns(Office365Outlook.FindMeetingTimes({RequiredAttendees:Concat(MyPeople, UserPrincipalName & “;”), MeetingDuration:MeetingDurationSelect1.Selected.Minutes,Start:Text(DateAdd(MeetingDateSelect1.SelectedDate, 8, Hours), UTC),End:Text(DateAdd(MeetingDateSelect1.SelectedDate, 17, Hours), UTC)
—-

Outlookの標準タイムゾーンとPower Apps のタイムゾーンがずれる場合、Power Apps 側で環境に合わせてタイムゾーンを設定されるのをおすすめします。
やり方は主に2通りあります。TimeZoneOffset()関数にて引き算するか、日本のタイムゾーンはUTC+9のため、-9時間引いてみてください!その時の対象となるコントロールは送信アイコン(IconSendItem1)でいいのではないかなと思います。

weed

ご回答ありがとうございます。
PeopleBrowseGallery*が確かに違っており、修正したところ深夜時間帯も選べるようになりました!

ただ、やはり15分・45分の15分間隔は選択できませんでした…。
(Dropdownで選べても、時刻の表示に出てこない状態です)

またタイムゾーンも関数を入れようとしましたが、エラーで入れられませんでした…。

ギークフジワラ

PeopleGallery部分が修正できたようで良かったです!
15分45分という時間間隔は、DatePicker(カレンダー)のところと検索ボタンのところかもしれないですね。そのOnSelectプロパティを以下のように変更してみてはいかがでしょうか。ただWeedさんの環境では時間と分を別のドロップダウンで行っているようですから、そこは修正をしていただけますか。それで時刻の表示が適切になるのでなないかなと思います。

Concurrent(
Reset('1TextSearchBox3'),
Set(_showMeetingTimes, false),
UpdateContext({_loadingMeetingTimes: true}),
Set(_selectedMeetingTime, Blank()),
Set(_selectedRoom, Blank()),
Set(_roomListSelected, false),

ClearCollect(MeetingTimes, AddColumns(Office365Outlook.FindMeetingTimes(
	{RequiredAttendees:Concat(MyPeople, UserPrincipalName & ";"), MeetingDuration:ToTimeDropdown.Selected.Hour*60+ToTimeDropdown.Selected.Minute-FromTimeDropdown.Selected.Hour*60-FromTimeDropdown.Selected.Minute,
		Start:Text(DateAdd(MeetingDateSelect3.SelectedDate, FromTimeDropdown.Selected.Hour*60+FromTimeDropdown.Selected.Minute, Minutes), UTC), End:Text(DateAdd(MeetingDateSelect3.SelectedDate, ToTimeDropdown.Selected.Hour*60+ToTimeDropdown.Selected.Minute, Minutes), UTC),
		MaxCandidates:15, MinimumAttendeePercentage:1, IsOrganizerOptional: false, ActivityDomain: "Unrestricted"}).MeetingTimeSuggestions,
	"StartTime", Text(DateAdd(MeetingDateSelect3.SelectedDate, FromTimeDropdown.Selected.Hour*60+FromTimeDropdown.Selected.Minute, Minutes), UTC), "EndTime", Text(DateAdd(MeetingDateSelect3.SelectedDate, ToTimeDropdown.Selected.Hour*60+ToTimeDropdown.Selected.Minute, Minutes), UTC))));

UpdateContext({_loadingMeetingTimes: false});
Set(_showMeetingTimes, true)

タイムゾーン指定の関数はこんな感じでUTC+9に合わせられると思います。送信ボタンのOnSelectプロパティに入れてみてください。
注:★★★のところは、-TimeZoneOffset() または -9*60 と置き換えしてみてください。これで時差を調整できます。

Set(_myCalendarName, LookUp(Office365Outlook.CalendarGetTables().value, DisplayName = "Calendar").Name);
Set(_myScheduledMeeting, Office365Outlook.V2CalendarPostItem(_myCalendarName,
 '1TextMeetingSubject3'.Text, Text(DateAdd(DateTimeValue(_selectedMeetingTime.StartTime), ★★★, Minutes)),
 Text(DateAdd(DateTimeValue(_selectedMeetingTime.EndTime), ★★★, Minutes)),
 {RequiredAttendees:Concat(MyPeople, UserPrincipalName & ";") & _selectedRoom.Address, Body: '1TextMeetingMessage3'.Text, Location: _selectedRoom.Name, Importance: "Normal", ShowAs: "Busy", ResponseRequested: true}));
 Concurrent(
   Reset(TextMeetingLocation3),
   Reset('1TextMeetingSubject3'),
   Reset('1TextMeetingMessage3'),
   Clear(MyPeople),
   Set(_selectedMeetingTime, Blank()),
   Set(_selectedRoomList, Blank()),
   Set(_selectedRoom, Blank()),
   Set(_roomListSelected, false)
)

コレでうまくいくといいですね!

コメントを残す

メールアドレスが公開されることはありません。