月別アーカイブ: 2022年2月

Outlook予定表を大人数に共有する操作をPower Automate Desktopで実行する

Outlookの予定表を大人数で共有することを考えます。

Outlookの予定表は、共有したい相手をひとりひとり選択することで、各人の権限(表示のみか、編集もできるか)を分けながらカレンダーを共有できます。予定表を共有する相手が数人であれば、手作業で各人のアドレスを追加すればいいでしょう。これが数十人となった場合、手作業では時間がかかったり抜け漏れが生じたりします。

Microsoft365の自動化ツールといえばPower Automateです。しかし、クラウドフローのPower AutomateにはOutlookの予定表の共有に関するコネクタがありません。そこで、OutlookのデスクトップアプリをPower Automate Desktopを使って繰り返し処理する方法を考えます。

準備するものは3つです。

  • Power Automate Desktopのインストール
    windows10以降のユーザーであれば、無償でインストールできます。
  • 共有したいOutlookの予定表
  • 選択共有したい相手のメールアドレスの一覧

Excelファイルに選択共有したい相手のメールアドレスの一覧を入れたものを用意します。Power Automate Desktopから読み込める場所に置いておきます。

Outlookのデスクトップアプリを開いて、「共有アクセス許可」の画面を開きます。ここでは「追加した予定表」という名前の予定表を作成し、大人数に共有します。

Power Automate Desktopを起動して、「新しいフロー」を作成します。下図に示すようなフローをこれから作ります。このフローは大きく2段階に分かれます。前半(1,2,3)では、Excelファイルに記録した予定表の共有相手を一覧を取得します。後半(4,5,6,7,8)では、Outlookの予定表を共有する操作を前半で取得した共有相手一人一人に対して繰り返し処理します。

前半(1,2,3) Excelファイルに記録した予定表の共有相手を一覧を取得

フローの動作は画面左の「アクション」列から、Excelのグループを開きます。

「Excelの起動」では、予定表を共有する相手のメールアドレス一覧が入ったファイルのパスを指定します。

「Excelワークシートから読み取り」では、先ほど開いたExcelファイルの中身を読み取ります。冒頭で示したように各セルにメールアドレスが1個ずつ入っているだけのワークシートであれば、「ワークシートに含まれる使用可能なすべての値」を取得すればメールアドレスの一覧を読み込めます。

メールアドレスの一覧を取得したらExcelファイルは用済みです。後半の操作の邪魔にならないように閉じておきましょう。

後半(4,5,6,7,8) Outlookの予定表を共有する操作を前半で取得した共有相手一人一人に対して繰り返し処理

メールアドレスの一覧を取得したので、この中にあるメールアドレス1個1個に対して同じ処理を繰り返します。この場合は「ループ」から「For each」を選択します。

「For each」のパラメータ設定では、どのデータセットに対して繰り返し処理を行うかを指示します。入力欄の右端にある{x}を押すと、フローに登場する変数などの一覧が表示されます。Excelファイルから読みだしたデータを選択すれば%ExcelData%というテキストが設定されます。

あとは、Outlookでメールアドレスを指定して予定表を共有する操作を設定すれば完了です。フローにOutlookの起動からすべてを任せるのは面倒なので、人の手で繰り返し処理の直前の画面を表示させておきます。

ここでPower Automate DesktopにOutlookのどこを操作すればよいかを教えます。画面右端にある菱形が重なったアイコンを押して「UI要素」を表示します。青色の「UI要素の追加」ボタンを押すと、画面に映っているどの部分に着目するかを教える画面になります。

UI要素の追加を行っている最中は、注目している場所に赤枠が表示されます。狙いたい場所が赤枠で囲まれている状態になったら、Ctrlキーを押しながらクリックしてください。

Ctrlキーを押しながら、予定表の共有を操作を行う際にクリックしたりメールアドレスを入力したりする場所を登録していきます。予定表の共有を行うには、下図のように「追加」ボタンを押す、入力欄にメールアドレスを入力する、「OK」ボタンを押す、という操作が必要です。Outlookの操作画面とPower Automateで対応するフローを次に示します。

登録したUI要素は名前を変更することができます。画面右端の「UI要素」で登録したUI要素を選択し、「名前の変更」を選びます。これらのUI要素はフローを作っていく中で選択しますので、わかりやすい名前に変更しておきましょう。

Outlookのように別のアプリケーションを操作する場合は、「UIオートメーション」内のアクションを使用します。各アクションでは、どのUI要素を操作するのかを指定する必要があります。先述のように、操作が必要なUI要素を登録しておけば、プルダウンリストから選ぶだけです。

メールアドレスを入力する操作は「テキストフィールドに入力する」アクションを使用します。For eachループの中でメールアドレス一覧から取り出された1個ずつのメールアドレスは%CurrentItem%で読みだせます。これも{x}ボタンを押せば候補が選択肢に表示されます。

以上でフローは完成です。画面上部の実行ボタンを押して、フローを動作させてみましょう。作成したフローが正常に動作するのか確認するため、最初は少ない数のメールアドレスを使うことをお勧めします。作成したフローが意図したように動くのであれば、大規模なデータに対して本番処理を実行しましょう。

移動が多いオフィスに適したモニタ

移動が多いオフィスに適したモニタを紹介します。フリーアドレスのオフィスで自席がない場合や、在宅勤務の普及により会社のPCをオフィスと自宅で持ち運ぶ場合など、業務用のPCを携えて移動する頻度が高い働き方が近年増えています。

移動が多い場合に問題になるのが、PCの周辺機器をどのように持ち運ぶかです。特に、電源がなければPCは数時間で動かなくなるので、電源ケーブルの運搬は重要な課題です。

最近のノートPCではUSB Type-Cコネクタを使って充電する方式が増えてきました。これはUSB PD (Power Delivery)を利用したものです。もしUSB PDで十分に高い出力を備えたモニタを外部ディスプレイとして使えれば、電源ケーブルを持ち歩かなくても給電しながらPCを使えます。
USB PDにどれだけの出力が必要なのかは、使っているPCの仕様書や電源アダプタを確認してください。ノートパソコンであれば、たいてい45 Wくらいでしょう。ノートパソコン付属の電源アダプタが45 Wなのであれば、45 W以上に対応してUSB PDを備えるモニタを使用すれば大丈夫です。

価格comでUSB PDと映像入力USB Type-Cでモニタを検索すると100件以上の製品が該当します。24インチで2万円台の製品もあり、給電機能があるからといって驚くほど高価になるわけではありません。

私はDELLのU2721DEを在宅勤務のために購入しました。USB Type-Cで給電しながら映像の伝送ができるのに加えて、モニタ側に有線LANポートを備えており自宅でも高速かつ安定したインターネット接続が可能です。本記事の執筆時点で購入できる後継機はU2722DEです。

SharePointのリストに予め登録した時間帯と本文に応じてTeamsにボットからメッセージを送る

まとめ

SharePointのリストに投稿時間帯、投稿する本文を登録しておきます。PowerAutomateで1時間ごとに動作するクラウドフローを使い、リストの内容に応じたメッセージをTeamsに投稿します。

本記事の後半では、発展編として動作条件を複数にする場合や宛先を複数人にする場合を紹介します。

Google環境で同様の仕組みを作成する方法はリンク先をご覧ください。

前提とするリストの構造

以下のようなリストをSharePointに作成しておきます。投稿時間帯はhour列で指定します。

時間帯の判別をODataクエリで行う場合

時間帯の判別をSharePointのリストからアイテムを取得する段階で行います。この方法の利点は、リストから取得するアイテムの上限数制限に触れにくいこと、動作が高速であることです。

まず、現在時刻を取得し、時間の部分だけを抜き出します。

現在時刻の取得は、「組み込み」>「日時」にある「現在の時刻」と「タイムゾーンの変換」アクションを用います。現在時刻を協定世界時(UTC)で取得し、東京のタイムゾーンに変更します。「Recurrence」アクションの次に「現在の時刻」アクションを追加し、その次に「タイムゾーンの変換」アクションを追加してください。

次に、東京の現在時刻から、時間の部分だけ取り出します。「タイムゾーンの変換」アクションの後ろに、「組み込み」>「データ操作」にある「作成」アクションを追加してください。入力には式の入力画面に入ったあと次の式を入力してください。formatDataTime関数は、第1引数に現在時刻、第2引数に出力文字列の書式を設定します。次の式でbody(‘タイム_ゾーンの変換’)は東京の現在時刻、%Hは24時間表記での時間部分を示します。カスタム日時書式設定で時間はHで指定できますが、一文字だけで使う場合は%を頭に付ける必要があります。%がないとエラーを吐きます。

formatDateTime(body(‘タイム_ゾーンの変換’),’%H’)

この式の出力結果は0詰めなしの時間です。9時なら9、16時なら16が文字列として出力されます。

として入力できている場合、PowerAutomateのフロー上はfxと書かれたアイコンが表示されます。黒い文字だけなら単なる文字列として入力されていますので、式の入力画面から入力しなおしてください。

このあと複数の「作成」を用いる場合は、「作成」の名前を変更しておくと分かりやすいでしょう。アクションの名前を変更したい場合は、三点ボタンをクリックすると表示されるメニューから「名前の変更」を選択します。

時間の判定に使う文字列が用意できたので、次はSharePointのリストからデータを取得します。「標準」>「SharePoint」にある「複数の項目の取得」アクションを追加してください。

「サイトのアドレス」と「リスト名」は、ご自身で用意したリストを選択してください。次に、「詳細オプションを追加する」をクリックして詳細オプションを表示させます。詳細オプションの「フィルター クエリ」には「hour eq 出力」と入力します。ここで出力は前段のアクション「作成」の結果です。

ここまでの操作で、hour列の値が現在時刻の時間(hour)と一致するデータを取り出しました。この後は取り出して複数の項目に対して、それぞれTeamsにメッセージを送る処理を行います。

「アクションを追加」で「コントロール」>「Apply To Each」を挿入します。「以前の手順から出力を選択」にはvalueを選択します。

「Apply To Each」で実行するアクションを追加します。「標準」>「Microsoft Teams」>「チャットまたはチャンネルでメッセージを投稿する」を選択してください。どこにメッセージを投稿するのかを設定する画面が表示されます。ここでは仮にボットとのチャットに投稿する場合の設定例を示します。

*投稿者 フロー ボット
*投稿先 Chat with Flow bot
*Recipient ここに受信者のメールアドレスを設定します。読み込むリストに受信者を設定する列を用意しておけば、ここを動的な値にすることができます。
*Message
「動的なコンテンツを追加」からSharePoint複数の項目を取得の下にあるMessageを選択します。Messageの前後に文字列を追加しても結構です。

以上で設定は完了です。フローを保存して、テストしてみましょう。

時間帯の判別をPowerAutomateの条件判定で行う場合

SharePointのリストからすべてのデータを取得した上で、PowerAutomateの「コントロール」>「条件」で処理すべき項目か否かを判定します。

「Apply To Each」のループの中に、「作成」で条件判定に使う文字列を作ってみましょう。ここで注意が必要なのは、型を文字列に揃える必要がある点です。hour列の値は数値型、日時を変換して出てくる出力は文字列型です。hour列の値をstring()関数に入れて文字列に変換するなどの方法があります。

ここでは、hour列に合わせて時の文字列だけを取り出す方法と、年月日に合わせて文字列を成形する方法を示します。

時の文字列のみを作る場合

string(items(‘Apply_to_each’)?[‘hour’])

次の値に等しい

formatDateTime(body(‘タイム_ゾーンの変換’),’%H’)

年月日時という文字列を作る場合

concat(formatDateTime(body(‘現在の時刻’),’yyyy-mm-dd-‘),items(‘Apply_to_each’)?[‘hour’])

次の値に等しい

formatDateTime(body(‘タイム_ゾーンの変換’),’yyyy-mm-dd-H’)


発展編

ここからは、少々複雑な処理を行って機能を追加していきます。

発展編1 TeamsのチャットではなくOutlookでメールを送る

Teamsのチャットではなく、Outlookのメールでメッセージを送ることを考えます。方法は簡単です。コネクタをTeamsではなくOutlookにするだけです。

もちろん宛先に動的なコンテンツを入力することもできます。

発展編2 時間と曜日、日付に応じて動作するようにする

SharePointのリストから複数の項目を取得する際のクエリを変更して、曜日と日付も条件と合うようにします。

リスト側の操作で、列を追加します。

曜日(内部名Day)は漢字一文字(月,火,水,木,金,土,日)で表現することにします。選択肢でも一行テキストでも結構です。選択肢にする場合は、平日を意味する「月火水木金」だとかすべての曜日を意味する「月火水木金土日」といった選択肢を用意しておくとユーザーに便利です。

日付(内部名Date)は単純に数値型でよいのですが、日付は1~31までしかないので小数点以下0桁の最小値1、最大値31などと制限をかけておくと入力ミスを減らせます。工夫として、日付に関係なく動作させたい場合に備えて、日付が0のときにも動作させることを考えます。このため、最小値を1でなく0としておきましょう。

ここまでの操作で次のようなリストが得られました。

「組み込み」>「データ操作」にある「作成」アクションを使って、クエリに使う曜日と日付を作成しましょう。なお、以下では東京のタイムゾーンに変換した後の時刻をbody(‘タイム_ゾーンの変換’)と書きますが、式で書かずにタイムゾーンの変換結果を置いても結構です。

曜日は漢字一文字(月,火,水,木,金,土,日)で表現することにします。現在時刻を入力すると、対応する曜日の漢字一文字が出力される式はリンク先を参照しました。次の式の結果を後で曜日と書きます。

createArray(‘日’,’月’,’火’,’水’,’木’,’金’,’土’)[dayOfWeek(body(‘タイム_ゾーンの変換’))]

日付は時間hourと同じようにカスタム日時書式設定を使います。月の日にちはdの一文字ですから、Hと同様に%を入れて次のように書けます。次の式の結果を後で日付と書きます。

formatDateTime(body(‘タイム_ゾーンの変換’),’%d’)

本ページの前半で説明したの詳細は省きますが、時間帯hourを同様に時間帯と書くことにします。

リストに記録されたアイテムのうち、動作条件として入力した時間帯曜日日付の3つが現在時刻と一致するものだけを取り出すクエリは次のように書けます。

(hour eq 時間帯) and substringof(‘曜日‘, Day) and (Date eq 日付)

ここで曜日の判定だけはsubstringof(‘検査値’, 列名)関数を使用しました。検査値は曜日漢字一文字なので、リストの値が’月’のときも’月火水木金’のときも条件を満たす(Trueが返る)ようになります。また、曜日を一行テキストでなく選択肢にした場合もsubstringof()を使用してください。選択肢の場合、リストには単純な文字列ではなくJSONの形式で値が記録されています。したがって、曜日の漢字一文字と同値判定されません。ちなみに、選択肢としてDay列を作ると動的なコンテンツにはDayとDay Valueという2つのアイコンが表示されます。Dayは選択肢オブジェクト、Day Valueは選択肢の値を返します。検査値は文字列として扱うため、シングルクォーテーション”で囲むことを忘れないでください。

ここでさらに一工夫です。リストにDate列を追加する際に、日付に関係なく動作させたい場合はDateを0にするように考えました。SharePointのリストから複数の項目を取得する際のクエリとしては、「Dateの値が現在の日付と等しい、またはDateの値が0」と各必要があります。またはを表すのはorですので、クエリを以下のように書きなおします。

(hour eq 時間帯) and substringof(‘曜日‘, Day) and (Date eq 日付 or Date eq 0)

なお、時間帯がどの値でも実行するようにしたい場合は、時間帯に-1を入れるといった運用が考えられます。日付と同じ考え方であって、わかりやすい値で存在しない値を用いるという意味です。

これでフローの修正は完了です。Apply To Eachの中の処理は本ページの前半で解説した内容と変わりません。

発展編3 宛先を複数人にする

宛先を複数人にするのは少々手間がかかります。

まず、TeamsまたはOutlookコネクタに対して、どのような形式で宛先を入力すべきか考えましょう。

Teamsのボットチャットの場合はボット対1人の関係です。したがって、複数人に同じメッセージを送るには、人数分だけ繰り返し処理を宛先だけ変えて実行します。ApplyToEachで繰り返し処理するには、Arrayの中に宛先のメールアドレスが入っている形が良いでしょう。

Outlookのメールの宛先を複数人にするには、メールアドレスをセミコロン;で区切った文字列を宛先に入力することになります。そのものズバリの記事を他サイトで見つけたので、こちらを参照してください。技術的なポイントとしては、文字列変数にApplyToEachのループ処理でメールアドレスを追記していく形です。

コネクタに入力すべき値が見えてきたので、欲しい値を出力するにはどうするか考えます。リストにメールアドレスが文字列をとして入っている場合は、そのまま値を使えばいいので詳細は省きます。ここでは、リストに「個人」型かつ複数人を設定する場合を紹介します。内部名MessageToの列を以下の設定で作成します。

この列の値は、組織のユーザーデータベースから個人を指定できます。たとえば、会社のアカウントであれば同じ会社の個人のアカウントを入力できます。このアカウントはオブジェクト型なので、扱いには一工夫が必要です。

列の設定で複数の選択が許可されている場合、値は配列[]型です。配列の要素として、各個人の情報を示すオブジェクト{user#}が入っています。
[{user1}, {user2}, … , {userN}]
各人のアカウントを指すオブジェクトの中には、DisplayNameやEmailといったプロパティがあります。いま欲しいのはこのEmailだけです。Emailの取り出し方を考えてみましょう。

まず宛先の情報が含まれているMassageToの中身を確認します。仮の操作として、ApplyToEachのループの中に「組み込み」>「データ操作」>「作成」アクションを追加します。入力にはMassageToを置きます。

これで実行結果を確認してみると次の図のようになります。

このような複雑な値をPowerAutomateは自動で処理できません。そこで、「組み込み」>「データ操作」>「JSONの解析」アクションを使用します。上図の「未加工出力の表示」を開き、結果をコピーしておいてください。「JSONの解析」アクションを追加し、コンテンツにMessageToを選びます。次に、「サンプルから生成」を開き、先ほどコピーした「未加工出力の表示」の中身をすべてコピペします。こうすることで、PowerAutomateがJSONの構造を解析してくれます。「JSONの解析」アクションのスキーマを設定できたら、先ほどMessageToの中身を確認するために追加した「作成」アクションは削除してかまいません。

JSONの解析を行うと、MessageToの内部の情報、たとえばEmailを取り出せるようになります。JSONの解析のあとにアクションを追加すると、動的なコンテンツの中に次のような選択肢が出現することに気づきます。この中のEmailをTeamコネクタに入力すればよいわけです。

JSONの解析について詳しく学びたい方はリンク先の記事をご覧ください。

先述のように、複数の選択が許可された列の値は配列です。配列に対してはApplyToEachで配列内の各要素に対して処理を行います。「チャットまたはチャンネルでメッセージを投稿する」アクションのRecipient (宛先)にEmailを設定した場合、Emailは配列内の要素ですから、自動的にApplyToEachが追加されループの中にTeamsコネクタが移動します。ちなみに、ここで表示されているvalueはSharePointのリストから取得した各アイテムが要素である配列、本文はMessageToをJSONの解析した結果の配列です。

Teamsコネクタの場合は以上でフローが完成です。Outlookの場合は、最後に出てきた動的なコンテンツEmailを使って宛先文字列(メールアドレスが;で区切られている)を作成してください。